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吧。