博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
erlang tcp发包速度测试
阅读量:5248 次
发布时间:2019-06-14

本文共 1826 字,大约阅读时间需要 6 分钟。

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

你可能感兴趣的文章
【程序执行原理】
查看>>
python的多行注释
查看>>
连接Oracle需要jar包和javadoc文档的下载
查看>>
UVA 10976 - Fractions Again?!
查看>>
Dreamweaver cc新版本css单行显示
查看>>
【android】安卓的权限提示及版本相关
查看>>
JavaScript可否多线程? 深入理解JavaScript定时机制
查看>>
IOS基础学习
查看>>
Java基础教程——网络基础知识
查看>>
Kruskal基础最小生成树
查看>>
浅谈算法和数据结构: 一 栈和队列
查看>>
Java内部类详解
查看>>
【hdu 1429】胜利大逃亡(续)
查看>>
图论-次短路求法
查看>>
What's New for Visual C# 6.0
查看>>
ExtJs学习笔记之ComboBox组件
查看>>
关于收费软件
查看>>
getopt_long
查看>>
TensorFlow MNIST CNN 代码
查看>>
javascript之Style物
查看>>