基于epoll的压力测试脚本

基于epoll的压力测试脚本 | dcshi@唐品

基于epoll的压力测试脚本

好吧,我们开始之前,如果我们要用多进程来做,会怎么来设计?
1)初始化需要完成的预定请求数n(n是用户输入的参数)requests
2)创建c(c是用户输入的参数)个worker进程(这里worker进程与主进程是父子关系,这样worker进程可以共享第一个步骤创建的requests变量)
3)当一个worker进程完成一个请求以后,requests需要减一,这里涉及到变量安全,我们一般加一个锁,常用信号量(Semaphore)
3.1)可能有同学对上面有不同想法,每个worerk进程完成一个请求要用用一次Semaphore效率很低,那样换个思路,每个worker进程都要一定的任务(例如,一共要完成10w个请求,10个worker,每个worker完成1w个请求后退出),由主进程来监控剩余的worker进程数目,如果为0,认为是所有请求完成。3和3.1的方案各有优缺,这里不作点评。

今天主要介绍的是用epoll来完成压力测试工作。
基于epoll而非多线程多进程,对于压力测试,除网络IO以外没有任何的磁盘IO等阻塞调用,个人认为用epoll完全可以模拟多进程的并发行为,而且实现更简单.但也有潜在问题,由于脚本是单进程模型,所以有可能测试脚本比测试对象先达到测试瓶颈(一般是CPU)

代码https://github.com/dcshi/benchmark/

流程图:

脚本执行选项
Usage: benchmark [-H ] [-p ] [-c ] [-n ] [-k ]
-H Server ip (default 127.0.0.1)
-p Server port (default 5113)
-c Number of parallel connections (default 5)
-n Total number of requests (default 50)
-k keep alive or reconnect (default is reconnect)

执行结果
server:# ./benchmark -n 100
5 parallel clients
100 completed in 0 seconds
1% <= 6 milliseconds
5% <= 11 milliseconds
15% <= 12 milliseconds
34% <= 13 milliseconds
89% <= 17 milliseconds
94% <= 18 milliseconds
99% <= 21 milliseconds
100% <= 25 milliseconds
177.936 requests per second

脚本介绍
1)对分包(收&发)进行了处理
2)对超时进行了处理
3)keepalive机制
4)用户自定义并发数和请求数
5)请求耗时百分比统计

扩展性
考虑到扩展性,用户只需要重新定义下面两个函数即可。(组包和解包函数)
int encodeRequest(char* data, unsigned &len);
int decodeResponse(char* data,unsigned len);

ex:

  1. int decodeResponse(char* data,unsigned len)
  2. {
  3.     char* ptr = data;
  4.     int cmdLen = 0;
  5.     if(*ptr != PRETX)
  6.     {
  7.         return -1;
  8.     }
  9.     else if(len > 1)
  10.     {
  11.         cmdLen = ntohs(*(uint16_t*)(ptr + 1));
  12.         if(cmdLen <= 0 )
  13.         {
  14.             return -1;
  15.         }
  16.         else if(cmdLen > (int)len)
  17.         {
  18.             //it is not a complete packet
  19.             return 1;
  20.         }
  21.         else if( *(ptr + cmdLen -1) != LASTX)
  22.         {
  23.             return -1;
  24.         }
  25.     }
  26.     return 0;
  27. }

 

你可能感兴趣的:(epoll)