• linux 压力测试工具之ab


    简介

    Apache Benchmark(简称ab) 是Apache安装包中自带的压力测试工具 ,简单易用

    在此提供 ab 在 centOS7 下的安装和使用方法
    注:个人发现,之前安装的centos6.5 默认已安装了ab,具体原因不明

    ①.ab(apache benchmark)安装命令:

    yum -y install httpd httpd-tools


    ②.ab测试的命令参数


    命令: ab 或 ab -help
    显示命令参数如下


    ab [可选的参数选项] 需要进行压力测试的url
    参数说明:
    此外,我们再根据上面的用法介绍界面来详细了解每个参数选项的作用。

    -n 即requests,用于指定压力测试总共的执行次数。
    -c 即concurrency,用于指定的并发数。
    -t 即timelimit,等待响应的最大时间(单位:秒)。
    -b 即windowsize,TCP发送/接收的缓冲大小(单位:字节)。
    -p 即postfile,发送POST请求时需要上传的文件,此外还必须设置-T参数。
    -u 即putfile,发送PUT请求时需要上传的文件,此外还必须设置-T参数。
    -T 即content-type,用于设置Content-Type请求头信息,例如:application/x-www-form-urlencoded,默认值为text/plain。
    -v 即verbosity,指定打印帮助信息的冗余级别。
    -w 以HTML表格形式打印结果。
    -i 使用HEAD请求代替GET请求。
    -x 插入字符串作为table标签的属性。
    -y 插入字符串作为tr标签的属性。
    -z 插入字符串作为td标签的属性。
    -C 添加cookie信息,例如:"Apache=1234"(可以重复该参数选项以添加多个)。
    -H 添加任意的请求头,例如:"Accept-Encoding: gzip",请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。
    -A 添加一个基本的网络认证信息,用户名和密码之间用英文冒号隔开。
    -P 添加一个基本的代理认证信息,用户名和密码之间用英文冒号隔开。
    -X 指定使用的和端口号,例如:"126.10.10.3:88"。
    -V 打印版本号并退出。
    -k 使用HTTP的KeepAlive特性。
    -d 不显示百分比。
    -S 不显示预估和警告信息。
    -g 输出结果信息到gnuplot格式的文件中。
    -e 输出结果信息到CSV格式的文件中。
    -r 指定接收到错误信息时不退出程序。
    -h 显示用法信息,其实就是ab -help。

    ③.ab的使用

    模拟并发请求100次,总共请求10000次
    命令模板:
    ab -c 100 -n 10000 待测试网站(建议完整路径)
    内容解释:
    Server Software: nginx/1.10.2 (服务器软件名称及版本信息)
    Server Hostname: 192.168.1.106(服务器主机名)
    Server Port: 80 (服务器端口)
    Document Path: /index1.html. (供测试的URL路径)
    Document Length: 3721 bytes (供测试的URL返回的文档大小)
    Concurrency Level: 1000 (并发数)
    Time taken for tests: 2.327 seconds (压力测试消耗的总时间)
    Complete requests: 5000 (的总次数)
    Failed requests: 688 (失败的请求数)
    Write errors: 0 (网络连接写入错误数)
    Total transferred: 17402975 bytes (传输的总数据量)
    HTML transferred: 16275725 bytes (HTML文档的总数据量)
    Requests per second: 2148.98 [#/sec] (mean) (平均每秒的请求数) 这个是非常重要的参数数值,服务器的吞吐量
    Time per request: 465.338 [ms] (mean) (所有并发用户(这里是1000)都请求一次的平均时间)
    Time request: 0.247 [ms] (mean, across all concurrent requests) (单个用户请求一次的平均时间)
    Transfer rate: 7304.41 [Kbytes/sec] received 每秒获取的数据长度 (传输速率,单位:KB/s)
    ...
     

    ④.压力测试(示例)

    【测试一】:
    命令 ab -c 100 -n 5000 http://192.168.1.106/index1.html


    【测试二】:
    命令 ab -c 10000 -n 50000 http://192.168.1.106/index1.html


    简单解释:并发访问量过大 服务器拒绝访问,理论上通过系统配置,可以有更好的承受能力

    ⑤.注意事项

    测试机与被测试机要分开
    不要对线上的服务器做压力测试
    观察测试工具ab所在机器,以及被测试的前端机的CPU、内存、网络等都不超过最高限度的75%
    ab请加-k参考启用http1.1的keepalive功能

    核心原理

    ab是如何分配并发和请求数的呢?
    在test函数中,先给连接数和请求数分配内存,组http报文头、组http请求报文默认使用GET方法(最大2048个字节)
    进入for循环
    for (i = 0; i < concurrency; i++) {
    con[i].socknum = i;
    start_connect(&con[i]);
    }
    start_connect函数里,concurrency有几个并发,就创建几个socket连接
    apr_socket_create
    设置TCP窗口大小
    apr_socket_connect
    started++ 打开的并发数加加
    进入write_request函数
    apr_socket_send 把request里的内容通过socket发过去最大2048个字节 发送数据是一个字节一个字节发的吗?
    一个并发创建完成及一次请求发送后,出上一个for循环进入一个do while循环
    这个do while循环里面又有一个for循环
    for (i = 0; i < n; i++) n为并发数
    进入read_connection函数
    apr_socket_recv
    进入close_connection函数
    统计一些成功失败数量 平均时间,到一定数量会显示"Completed XXXX requests"
    apr_socket_close
    然后connect again,再次调用start_connect函数创建socket连接,再write_request,循环n次
    然后return
    ===================================

     常见问题

    1)
    ab并发数不能大于请求数,会提示

    ab: Cannot use concurrency level greater than total number of requests

    2)
    请求数默认不能超过1024个,会提示

    socket: Too many open files (24)

    可用ulimit -n命令修改,例如:ulimit -n 8192 (设置用户可以同时打开的最大文件数)。

    3)
    并发数默认不能大于20000个,会提示

    ab: Invalid Concurrency [Range 0..20000]

    需要修改apache源代码support目录下ab.c文件,找到:
    #define MAX_CONCURRENCY 20000
    将宏定义的值改大,重新编译安装apache。

    4)
    提示

    apr_socket_recv: Connection reset by peer (104)

    网上说是apr-util有些问题,不太稳定,多试几次就好了。

    5)
    还有单独的apache bench源码包,及如何单独安装ab教程
    下载:http://apachebench-standalone.googlecode.com/files/ab-standalone-0.1.tar.bz2
    安装教程:https://code.google.com/p/apachebench-standalone/wiki/HowToBuild

    6)测试时发现有如下错误
     

    ...
    Failed requests:        998
       (Connect: 0, Receive: 0, Length: 998, Exceptions: 0)
    ...
    

     

     

    7) ab怎么post数据 ?

    sudo ./ab -c 10 -n 100 -p ./post.file -T 'application/x-www-form-urlencoded' http://www.abc.cn/test

    post.file内容: 

    aa=bb&cc=dd
  • 相关阅读:
    js去前后空格
    IE7以上支持Fiddler 监听本地
    IE8 scriptX print 无法使用的bug
    那些相见恨晚的 JavaScript 技巧
    oracle sql
    JS人民币金额转大写程序
    div自适应高度
    .NET Remoting 使用最佳实践,(部分翻译)
    对DataTable 进行Distinct操作
    用财富的眼光看知识管理
  • 原文地址:https://www.cnblogs.com/sunsky303/p/11040827.html
Copyright © 2020-2023  润新知