erlang tcp发包速度测试

http://blog.sina.com.cn/s/blog_96b8a1540101317m.html

这段时间我们的项目遇到广播包的一些性能问题,想起之前看到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(LSock) of

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

                {error, Reason} ->

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

        end.

do_recv(ClientSocket) ->

        gen_tcp:recv(ClientSocket, 0),

        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(N, Socket),

                        {_, T1} = erlang:statistics(runtime),

                        {_, T2} = erlang:statistics(wall_clock),

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

                {error, Reason} ->

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

        end.

do_send(N, Socket) ->

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

启动服务端:

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.如果有优势,如何利用呢?嗯,这又是一个问题。

原文地址:https://www.cnblogs.com/fvsfvs123/p/4303737.html