ab是apache自带的一款压力测试工具,安装完apache后就有了,一般在/usr/bin目录下。系统为CentOS。
1、安装apache ===我蛋疼的看了源代码,这段可以跳过=== 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 =================================== 假设c为并发数,n为总请求数,done为已完成数。从这里可以看出ab的运作方式是创建c个并发,同时发送c个请求,然后关闭socket连接,如果done小于n,则继续创建c个并发,同时发送c个请求,然后关闭socket连接,一直循环,直到done等于n时退出。 3、ab运行完成后会有比较详细的结果 Server Software: web服务器软件及版本 Server Hostname: 请求的地址 Server Port: 请求的端口 Document Path: 请求的页面路径 Document Length: 页面大小 Concurrency Level: 并发数 Time taken for tests: 测试总共花费的时间 Complete requests: 完成的请求数 Failed requests: 失败的请求数 Write errors: 写入错误 Total transferred: 总共传输字节数,包含http的头信息等 HTML transferred: html字节数,实际的页面传递字节数 Requests per second: 每秒处理的请求数,服务器的吞吐量(重要) Time per request: 平均数,用户平均请求等待时间 Time per request: 服务器平均处理时间 Transfer rate: 平均传输速率(每秒收到的速率)
2)
可用ulimit -n命令修改,例如:ulimit -n 8192 (设置用户可以同时打开的最大文件数)。
3)
需要修改apache源代码support目录下ab.c文件,找到:
4)
网上说是apr-util有些问题,不太稳定,多试几次就好了。
5) 6)测试时发现有如下错误 ... Failed requests: 998 (Connect: 0, Receive: 0, Length: 998, Exceptions: 0) ...
参考资料: |