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

  • 相关阅读:
    接口缓存--把接口放在redis数据库中,减少访问量
    使用vue和drf后台进行登录页面和注册页面(本文大概的疏通一下前后台是怎么交互的)
    vue导入css,js和放置html代码
    存储过程
    触发器
    视图
    pymysql模块使用
    权限管理
    多表数据查询
    单表数据查询
  • 原文地址:https://www.cnblogs.com/fvsfvs123/p/4303737.html
Copyright © 2020-2023  润新知