www.gusucode.com > 它是一个c_s网络编程框架源码程序 > st_asio_wrapper/performance_test/性能测试说明.txt

    性能测试环境搭建:
开启原来的asio_server这个demo,当成性能测试服务端,注意asio_server里面演示了两种服务端,要做性能测试的话,只能使用echo服务端,
具体做法是,运行asio_server,输入quit以退出第一个服务端(非常重要),接着会马上开启echo服务端,到此,服务端部署完毕;
开启performance_test下面的asio_client,当成性能测试客户端;
测试结果由asio_client来提供并显示;

asio_client命令格式:
asio_client 连接数 消息数 消息长度 填充(字符)
比如 asio_client 8 100000 1024 0
意思时,同时开启8个连接,每个连接发送10万条消息,每条消息长度为1024个字符,消息内容是字符0
如果运行asio_client不输入参数,则相当于:asio_client 8 1024 1024 0
消息长度不得小于sizeof(size_t);
关于消息内容,再说一句,其实它最前面有sizeof(size_t)个字符是一个序号,用于检测数据的合法性,也就是说这个虽然是性能测试,
也附带测试了一下数据的正确性。sizeof(size_t)个字符之后才是前面说的填充字符,大家一看源代码就明白了。

消息具体流程:
客户端发送数据到服务端,服务端再把数据返回回去,当所有客户端的所有数据都发送完毕,并且所有数据也接收完毕,则测试结束;
服务端在这过程中不会做任何投机取巧的事,比如把收到的数据不解包就直接发送,这样可以省去解包和打包。
服务端会按照正规流程来做(这才是实际使用中的情形),即对收到的数据解包,再打包发送回去。

测试报告:
包括总耗时(精确到秒,所以一定要多发点数据,否则都显示为0)和流量,其中流量只计算了单边流量,所以要乘以2才是总流量。

限制:
测试客户端为了生成报告,会记录当前总共发送的字符数,size_t类型,这就带来一个问题,在32位系统下,size_t只能记录到42亿,
一但超过这个限制,可能会让测试很早就结束(很巧的情况下),或者结束不了,这并不是st_asio_wrapper的问题,而是性能测试
demo的BUG,又由于计算完成百分比的时候,先乘以100再除以总数据量,所以限制就只能到0.42亿了,这个限制就更小了,但超过0.42
亿之后,仅仅是显示百分比有问题,还是能正常测试完成的,只要不超过42亿即可。
以上问题,asio_client和test_client都有,有兴趣者可以尝试修改这个问题,再次强调,这不是st_asio_wrapper的问题,而是demo
的BUG,由于我的系统都是64位的,不存在上面的限制,所以一直没有修正它。

后记:
其实这个测试并不一定能反应出真实的情况,原因有:
st_client并不太适合做性能测试客户端,因为每一个st_client至少需要有两个线程,而只支持一条连接,如果要测试1万个连接,
则需要创建2万个线程,简直就是灾难。而且,每个st_client还包装了一个boost的io_service对象,这个对象又包涵若干东西,
都不是省油的灯,所以在连接很多的情况下,用多个st_client对象做的客户端,效率远远不及服务端;
IO吞吐量的测试,客户端在不同的电脑上最好,比如测试1万个连接,最理想的情况是,找1万台电脑,每台只建立一个连接(此时
st_client就非常适合了,因为它就是为这种用法而设计的),然后与同一个服务端连接(st_server也正是为这种用法而设计的),
并且发送数据,但显然,这不太可能。
鉴于上面的原因,如果大家有兴趣实现一个能适合性能测试的客户端(换个说法就是适合建立像服务端一样支持众多连接的客户端),
不防分享出来供大家测试一下。我会尽量在有时间的情况下,重新写一个性能测试客户端。

2012.10.5更新
增加了一个测试客户端test_client,这个是相对更专业的测试客户端,没有上面说的asio_client的所有问题,它是基于st_asio_wrapper
的测试框架st_test_client而写的demo,测试的时候,服务端的部署同上,test_client的运行格式是:
test_client link_num
其中link_num是连接数量,最小1,最大4096,这个连接数量与系统有关,我在一台很老的电脑(ubuntu 12.04 LTS 64位)做测试,
仅能支持到1000个左右的连接,这显得小,可能是服务端与客户端运行在同一台电脑的原因。
当所有连接都建立起来之后,输入参数:
消息数 消息长度 填充(字符)模式(0广播 1随机)
大家看到,参数跟上面的asio_client一样,只是多了个模式,如果模式为0,则对所有连接都发送“消息数”个消息,总共发送“连接数*消息数”
个消息;如果模式为1,则总共只发送“消息数”个消息,每个消息都随机的选择一个连接来发送。
测试结束之后,可再次输入命令,再一次测试。

如果你想测试服务端在大批量的连接断开发生时的性能,那么稍修改test_client即可,只需要不停的new st_test_client,start_service
stop_service即可,并且加一个耗时统计。

注意:不管用上面哪一个测试客户端,如果服务端没部署好,可能会出现严重问题:
比如你没有切换到echo服务器就开始测试了,那么服务端将出现假死的现象,这不是st_asio_wrapper的BUG,千万不要马上下结论这是BUG,
因为普通服务器是会把收到的消息打印到屏幕的,如果打印的内容有能让系统扬声器发声的命令,那么服务端就会很卡,似乎要等到扬声器发声
结束之后,才能接着运行(接着运行下一行printf)。

推荐不要再使用asio_client测试客户端了,我保留它只是因为它是一个demo,对二次开发者有参考意义,真正测试的时候,还是使用test_client吧。