zoukankan      html  css  js  c++  java
  • 基于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. }
  • 相关阅读:
    怎样搭建PHP开发环境
    求教Sublime Text2 SublimeLinter插件安装问题
    借助 SublimeLinter 编写高质量的 JavaScript & CSS 代码
    sublime 支持php语法错误提示的插件
    sublime text 2 配置php调试环境
    解决file_get_contents无法请求https连接的方法
    JavaSE(六)包装类、基本类型和字符串之间的转换、==和equals的区别
    JavaSE(五)JAVA对象向上转型和向下转型
    JavaSE(四)之接口、访问控制
    JavaSE(二)之继承、封装、多态
  • 原文地址:https://www.cnblogs.com/lexus/p/2983688.html
Copyright © 2011-2022 走看看