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. }
  • 相关阅读:
    [LeetCode]题解(python):086
    [LeetCode]题解(python):083
    [LeetCode]题解(python):082
    两位图灵奖得主万字长文:新计算机架构,黄金十年爆发!——读后感
    《架构漫谈》阅读笔记三
    以《淘宝网》为例,描绘质量属性的六个常见属性场景
    周学习笔记(01)——大三下
    Anconda、Pycharm下载、安装、配置教程(极其详细)
    《架构漫谈》阅读笔记二
    《架构漫谈》阅读笔记一
  • 原文地址:https://www.cnblogs.com/lexus/p/2983688.html
Copyright © 2011-2022 走看看