转载:http://www.lupaworld.com/action-viewstutorial-itemid-10191.html
前些天给echo_server写了个非常简单的连接压力测试程序,
代码
-
-module(stress_test).
-
-
-export([start/0, tests/1]).
-
-
start() ->
-
tests(12345).
-
-
tests(Port) ->
-
io:format("starting~n"),
-
spawn(fun() -> test(Port) end),
-
spawn(fun() -> test(Port) end),
-
spawn(fun() -> test(Port) end),
-
spawn(fun() -> test(Port) end).
-
-
test(Port) ->
-
case gen_tcp:connect("192.168.0.217", Port, [binary,{packet, 0}]) of
-
{ok, _} ->
-
test(Port);
-
_ ->
-
test(Port)
-
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的帖子.
代码
-
$./configure --enable-kernel-poll
由于我们的测试服务器是双核的,我们在配置的时候也打开了smp支持. 欢快的make & make install之后....
把 /proc/sys/net/ipv4/ip_local_port_range 的内容改成了1024到65535. 最多也也能改成65535 :)
代码
-
$echo 1024 65535 > ip_local_port_range
另外再添加一个erl的环境变量
代码
-
$export ERL_MAX_PORTS=102400
于是开始跑了,不过这次跑不一样了
echo_server
-
$erl -noshell +P 102400 +K true
+S 2 -smp
-s echo_server start
stress_test
-
$erl -noshell +P 102400 +K true
+S 2 -smp
-s stress_test start
这里的+K true,表示使用内核poll,+S 2 表示两个核.
这样可欢快啦~~~ 10w大关过咯! 而且比刚才没用epoll的速度快暴多~~
于是我们又开始了204800个连接发测试了~~~
用top一看cpu占用率极低,服务器只在5%左右。 内存也不是很大~~
分享到:
相关推荐
在摸索过一段时间Erlang文档后,笔者开始走向了Erlang网络连接的性能调优之旅。本文详细记录了笔者走向Erlang网络编程性能调优之旅的每个脚印。
Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。 Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...
《erlang编程指南》是对erlang语言的深入介绍。erlang是任何必须并发、容错和快速响应的环境的理想编程...本书的重点集中在解释erlang的语法和语义,并且介绍了其模式匹配、规范列表、递归、调试、网络和并发性等内容。
《erlang/otp并发编程实战》侧重生产环境下的erlang ...第三部分讨论如何将代码与其他系统和用户集成,以及如何进行性能调优。 《erlang/otp并发编程实战》面向erlang 程序员,以及对erlang/otp 感兴趣的开发人员。
erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent
erlang并发编程实战源代码erlang并发编程实战源代码
Erlang OTP并发编程实战高清非扫描版,基于一个simple cache深入浅出讲解erlang otp的使用。
英文原版书籍,是学习Erlang 的入门书,简单通俗易懂,极力推荐.
erlang编程语言圣经 erlang从业人员的必备书籍 erlang语言开发入门
erlang并发编程 .pdf
erlang高性能网络库esockd的编译和使用,erlang高性能网络库esockd的编译和使用
从Erlang.org的Programming rules翻译的中文版本
erlang otp学习文档 学习还不错的
Erlang程序设计(中文版-完整书签)&Erlang编程指南(中英文版)
java php python erlang 千万级内存数据性能比较,
erlang并发编程,erlang之父Joe Armstrong得原著之一。
二十多年来,在传统电信领域高并发、高可靠、高容错的严酷环境下,Erlang语言和OTP平台被锻炼得坚如磐石,浓郁的函数式特质更是恰到好处地弥补了传统命令式语言在并发编程上的固有缺陷,大大降低了构筑并发、容错、...