前些天给echo_server写了个非常简单的连接压力测试程序,
代码
于是就求助于公司的linux编程牛人,结果让我一倒... 客户端没有修改文件描述符个数. windows上得在注册表里面改. 牛人开始对这东西的性能感兴趣了,刚好我摸了一阵子erlang的文档,于是我俩就走向了erlang网络连接的性能调优之旅啦~~过程真是让人兴奋。 我们很快通过了1024这一关~~到了4999个连接,很兴奋. 但为什么4999个连接呢, 检查一下代码终于发现echo_server.erl定义了一个宏, 最大连接数为5000. 我又倒~~ 修改编译之后, 连接数跑到101xx多了, 太哈皮了! 再测102400个连接时,到32767个连接数erl挂了~说是进程开得太多了. 好在记得这个erl的参数+P,可以定义erlang能生成的进程数. 默认是32768. 改了! 后面不知怎么着,在81231个连接停止了. 新的性能瓶颈又卡了我们. 好在牛人对linux熟, 用strace(这东西会莫名地退出), stap查出一些苗头. 我也想到在otp文档好像提过另一个limit,那就是端口数...在此同时我们发现erlang在linux上是用的传统poll模型. 但查erlang的源代码发现是支持epoll的. 在网上搜了半天,终于搜到了个maillist的帖子. 代码
由于我们的测试服务器是双核的,我们在配置的时候也打开了smp支持. 欢快的make & make install之后.... 把 /proc/sys/net/ipv4/ip_local_port_range 的内容改成了1024到65535. 最多也也能改成65535 :) 代码
另外再添加一个erl的环境变量 代码
于是开始跑了,不过这次跑不一样了 echo_server
stress_test
表示使用内核poll,
|
|
来自: Shadowsome > 《Erlang》