关注LAMP|PHP源代码分析|web架构|PHP扩展|Erlang|服务端架构
« »
2010年02月3日Erlang

erlang tcp发包速度测试

原创文章,转载请注明: 转载自庆亮的博客

本文链接地址: erlang tcp发包速度测试

 

这段时间我们的项目遇到广播包的一些性能问题,想起之前看到yufeng老大提到的1s广播40K包的问题,我也想测试测试我们机器的IO能力。

这次仅仅测试发包的能力,采用的是一对一的方式。

测试代码:

-module(socket_io_test).

-export([server/0, client/1]).

server() ->

        spawn(fun() -> do_server() end).

do_server() ->

        case gen_tcp:listen(38888, [binary, {reuseaddr, true}, {active, false}]) of

                {ok, ListenSocket} ->

                        do_server_loop(ListenSocket);

                {error, Reason} ->

                        io:format("listen 38888 failed: ~p", [Reason])

        end.

do_server_loop(LSock) ->

        case gen_tcp:accept(LSockof

                {ok, ClientSocket} -> do_recv(ClientSocket);

                {error, Reason} ->

                        io:format("accept failed: ~p", [Reason])

        end.

do_recv(ClientSocket) ->

        gen_tcp:recv(ClientSocket0),

        do_recv(ClientSocket).

client(N) ->

        case gen_tcp:connect("127.0.0.1"38888, [binary]) of

                {ok, Socket} ->

                        erlang:statistics(runtime),

                        erlang:statistics(wall_clock),

                        do_send(NSocket),

                        {_T1} = erlang:statistics(runtime),

                        {_T2} = erlang:statistics(wall_clock),

                        io:format("~p ~p", [T1T2]);

                {error, Reason} ->

                        io:format("connect failed: ~p", [Reason])

        end.

do_send(NSocket) ->

        lists:foreach(fun(_) -> gen_tcp:send(Socket, <<"Hello world!">>) end, lists:seq(1N)).

启动服务端:

socket_io_test:server().

启动发包客户端:

socket_io_test:client(100000). 100000表示发包的数量,每个包的大小为12个字节,加上TCP头部,一共36字节。 

测试包的数量: 400000(40W)

服务器环境: 

Intel(R) Xeon(R) CPU   E5420  @ 2.50GHz 双四核

12G内存

100M带宽独享

测试结果:


runtime

wall_clock

-smp auto

650 

1558

-smp auto +h 99999

630

1641

+K true 

670 

1626

-smp disable

410

770

+K true -smp disable

430

797

+K true -smp disable +h 99999

420

1133

结果表明 smp disable模式下发包速度明显快于smp auto模式,原因在于多核模式下,CPU切换的代价是相当高的。另外由于是一对一的发包,所以+K参数也没有什么效果。

产生的问题:

多核并发IO是否没有优势?得去看看Linux底层的实现了。(原谅我对这块的无知)

1.如果多核并发进行网络IO的能力要弱于单核,那么在用erlang进行服务端设计的时候就应该尽量让网关独占某个CPU并设置为-smp disable模式。

2.如果有优势,如何利用呢?嗯,这又是一个问题。

日志信息 »

该日志于2010-02-03 16:34由 庆亮 发表在Erlang分类下, 你可以发表评论。除了可以将这个日志以保留源地址及作者的情况下引用到你的网站或博客,还可以通过RSS 2.0订阅这个日志的所有评论。

没有评论

发表评论 »

发表评论您必须先登录

返回顶部