tinynet (V1.0.0) 一个轻量级的网络库(测试报告)

3300阅读 0评论2015-05-06 lubing521
分类:C/C++

    tinynet是一个轻量级的跨平台的网络库,支持select,poll,epoll,iocp多种网络模型,可以通过宏方便的切换各种模型。
    使用:

点击(此处)折叠或打开

  1. int main(int __arg_num,char** args)
  2. {
  3.     /*    
  4.     g++ -g -Wl,--no-as-needed -std=c++11 -pthread -D__LINUX -D__HAVE_SELECT -o test reactor.h reactor.cc event_handle.h event_handle_srv.h event_handle_srv.cc reactor_impl.h reactor_impl_select.h reactor_impl_select.cc server_impl.h server_impl.cc test.cc
  5.     g++ -g -Wl,--no-as-needed -std=c++11 -pthread -D__LINUX -D__HAVE_EPOLL -o test reactor.h reactor.cc event_handle.h event_handle_srv.h event_handle_srv.cc reactor_impl.h reactor_impl_epoll.h reactor_impl_epoll.cc server_impl.h server_impl.cc test.cc
  6.     g++ -g -Wl,--no-as-needed -std=c++11 -pthread -D__LINUX -D__HAVE_POLL -o test reactor.h reactor.cc event_handle.h event_handle_srv.h event_handle_srv.cc reactor_impl.h reactor_impl_poll.h reactor_impl_poll.cc server_impl.h server_impl.cc test.cc
  7.     */
  8.     if(3 != __arg_num)
  9.     {
  10.         printf("param error,please input correct param! for example: nohup ./transform 192.168.22.63 9876 & \n");
  11.         exit(1);
  12.     }
  13.     char* __host = args[1];
  14.     unsigned int __port = atoi(args[2]);
  15.     Reactor* __reactor = Reactor::instance();
  16.     Server_Impl __event_handle_srv(__reactor,__host,__port);
  17.     __reactor->event_loop(5000*1000);
  18.     return 0;
  19. }

 以linux为例,-D__HAVE_SELECT则代表使用select,-D__HAVE_EPOLL则使用epoll.当然,工程目录中有cmakelist,可以通过cmake来构建自己的项目。测试主要以epoll为例,它是linux下性能最高的IO多路复用模型。
 测试为echo模型,客户端每秒发10个数据包,每个数据包约100bytes,数据包括包头以及数据,包头12bytes,包括长度以及其他8bytes信息。客户端连接为每秒5个,此次测试总计连接15000个,主要测试连接数以及稳定性。服务器包含数据包的解析以及发送,
暂时不包含其他的逻辑。接收数据缓存,使用环形缓存,读写分两个线程,不加锁。发送数据不缓存,直接发送。
 测试机器配置:
 简单数据:
  
 round trip time 为客户端服务器数据包往返时间,约为150ms,网络流量在12Mbytes左右,这个不知道是不是网卡的限制,虽然查询是千兆网卡,如果不是网卡限制的话,应该空间还蛮大。详细数据见nmon文档(report/epoll15000/kakao2_140703_1122.xlsx),
 测试数据仅是个人主观的数据,不一定非常准确,仅供参考 ^_^

部分nmon测试数据:
nmon监测约从11:22开始,从0到10000个大约40分钟,中间停止加客户端几分钟,从图表中可以明显看出;13:40左右加第二批,5000个,14:20左右关闭所有连接。(之前做过类似测试,持续10+个小时,不过结果数据太多,不能生成文档,故只监测3小时左右)
 NET
(1)    从11:24左右开始增加客户端连接,到11:47左右趋于稳定,数据流量呈线性增长。即便到后面增加的5000个连接,流量基本不变,可以理解为目前处理数据量的上限,连接越多,可能 round trip time 值越大;
(2)    读写在网卡em1上,read/write avg约为12M,read max 约为38M,write max约为28M;

MEM
(1)    内存使用基本平稳,没有打的波动,空闲内存保持在24G左右;
(2)    内存总量不变。
(3)     内存不存在瓶颈.

CPU
(1)    cpu总使用量在20~30%之间,大多为用户使用,小部分为系统使用;
(2)    单个CPU使用量也不高一般在23~33%之间。
(3)    CPU不存在瓶颈.

DISK
(1)    服务器只进行数据收发,主要读写应该在nmon,且值比较低,最高160kB/s.

PROCESSES
这部分的分析不是太熟悉,就不多说了,更多其他信息,参看kakao2_140703_1122.xlsx。

这部分测试数据只是针对这个库,作为一个记录,以便以后查看,没有对比数据,可能意义不大。
代码尚不完善,但是会不断更新的,如果有兴趣,可以一起来改进它。欢迎拍砖。
source code:
        https://github.com/yuyunliuhen/tinynet/tree/master

上一篇:库-libev:详解
下一篇:linux下各种交叉编译工具