Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1938700
  • 博文数量: 219
  • 博客积分: 8963
  • 博客等级: 中将
  • 技术积分: 2125
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-19 12:48
个人简介

文章分类

全部博文(219)

文章存档

2021年(1)

2020年(3)

2015年(4)

2014年(5)

2012年(7)

2011年(37)

2010年(40)

2009年(22)

2008年(17)

2007年(48)

2006年(31)

2005年(4)

分类: Erlang

2011-12-07 17:11:04

这几天在弄个ERLANG的长连接测试程序,主要是要在一个服务器上建20万条长连接.

于是找到了以下内容.

---------------------------------------------

前些天给echo_server写了个非常简单的连接压力测试程序,

代码:
  1. -module(stress_test).
  2.   
  3. -export([start/0, tests/1]).
  4.   
  5. start() ->
  6.     tests(12345).
  7.   
  8. tests(Port) ->
  9.     io:format("starting~n"),
  10.     spawn(fun() -> test(Port) end),
  11.     spawn(fun() -> test(Port) end),
  12.     spawn(fun() -> test(Port) end),
  13.     spawn(fun() -> test(Port) end).
  14.   
  15. test(Port) ->
  16.      case gen_tcp:connect("192.168.0.217", Port, [binary,{packet, 0}]) of
  17.     {ok, _} ->
  18.             test(Port);
  19.     _ ->
  20.         test(Port)
  21.     end.
 
一开始我的这个stress_test客户端运行在windows上面, echo_server服务器端运行在linux上面。 结果接受了1016个连接就停止了. 于是我用ulimit -n 改了服务器端的文件描述符数量为10240. 接着还是如此,折腾了几天,最终还是没有搞明白。

于是就求助于公司的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的帖子.
代码
  1. $./configure --enable-kernel-poll  

由于我们的测试服务器是双核的,我们在配置的时候也打开了smp支持.  欢快的make  & make install之后....
把 /proc/sys/net/ipv4/ip_local_port_range 的内容改成了1024到65535.  最多也也能改成65535 :)

代码
  1. $echo 1024 65535 > ip_local_port_range  

另外再添加一个erl的环境变量

代码
  1. $export ERL_MAX_PORTS=102400  

于是开始跑了,不过这次跑不一样了

echo_server
  1. $erl -noshell  +P 102400 +K true +S 2 -smp -s echo_server start  
stress_test
  1. $erl -noshell  +P 102400 +K true +S 2 -smp -s stress_test start  

这里的+K true,表示使用内核poll,+S 2 表示两个核. 这样可欢快啦~~~ 10w大关过咯! 而且比刚才没用epoll的速度快暴多~~
于是我们又开始了204800个连接发测试了~~~

用top一看cpu占用率极低,服务器只在5%左右。 内存也不是很大~~

来源: 

阅读(2875) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~