原文網址:
erlang網絡編程的幾個性能調優和注意點
原文作者:
coderplay
前些天給echo_server寫了個非常簡單的連接壓力測試程序,
下載:
stress_test.erl
- -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%左右。內存也不是很大~~
posted on 2009-09-14 11:20
暗夜教父 閱讀(498)
評論(0) 編輯 收藏 引用 所屬分類:
erlang