![v2-7ad404bafd919a893722766b1dad7e90_1440w.jpg?source=172ae18b](http://img-02.proxy.5ce.com/view/image?&type=2&guid=a0677f44-f92f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-7ad404bafd919a893722766b1dad7e90_1440w.jpg?source=172ae18b)
概述
- 常见压力测试工具有:
ab
,wrk
- 性能调优过程中必不可少的一环, 只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题
- 对我们的被测系统发起攻击,以此检测系统在高并发压力下是否能正常运转
- 创建多个并发线程、模拟多个访问者同时对某一 URL 进行访问,可对任何基于 url 的资源进行并发性能测试
ab
安装
yum -y install httpd-tools
命令选项
- -n 请求数
- -c 并发数
- -s 等待响应的时间默认 30 秒
- -H 自定义请求头参数,可多次使用该选项
- -T 设置 Content-Type 请求头信息
- -k 启用 HTTP KeepAlive 功能,即在一个 HTTP 会话中执行多个请求。默认时,不启用 KeepAlive 功能。
ab 示例
# 1. 基本实例
ab http://192.168.31.92/
# 2. 100 并发,5000 请求
ab -c 100 -n 5000 http://192.168.31.92/
# 3. 设置请求头信息 User-Agent
ab -c 500 -n 10000
-H "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
http://192.168.31.92/
# 4. GET 传参
ab "http://192.168.31.91/api/test/?username=chris&password=123456"
# 5. POST 传参
echo "username="chris"&password="123456"" >> post.data
ab -p post.data -T "application/x-www-form-urlencoded" http://192.168.31.91/api/test/
wrk
概述
- wrk 是一种现代 HTTP 基准测试工具,当在多核 CPU 上运行时,能够产生大量负载
- 它结合了多线程设计和可扩展的事件通知系统如 epoll 和 kqueue; 支持大多数类 Unix,不支持 Windows
- 基于 wrk 优化版的 wrk2, 其提供的额外参数 -R,用以指定每秒多少个请求限制
钩子函数
启动阶段
: 每个线程执行一次
function setup(thread)
function init(args) args 用于获取命令行中传入的参数运行阶段
: 每次请求调用 1 次
function delay() 每次请求之前延迟多少毫秒
function request() 生成请求
function response(status, headers, body) 解析响应结束阶段
: 整个压测过程运行一次
function done(summary, latency, requests) 可从参数给定的对象中,获取压测结果;
安装及命令选项
# 1. 安装
git clone https://github.com/wg/wrk.git
cd wrk && make
cp wrk /usr/sbin/wrk && chmod +x /usr/sbin/wrk
# 2. 命令选项
使用方法: wrk <选项> <被测HTTP服务的URL>
Options:
-c, --connections <N> 跟服务器建立并保持的TCP连接数量
-d, --duration <T> 压测持续时间
-t, --threads <N> 使用多少个线程进行压测
-s, --script <S> 指定Lua脚本路径
-H, --header <H> 为每一个HTTP请求添加HTTP头
--latency 在压测结束后,打印延迟统计信息
--timeout <T> 超时时间
-v, --version 打印正在使用的wrk的详细版本信息
<N>代表数字参数,支持国际单位 (1k, 1M, 1G)
<T>代表时间参数,支持时间单位 (2s, 2m, 2h)
wrk 示例
# 1. 基本示例
wrk -t2 -c30 -d30s --latency http://192.168.31.92/
Running 30s test @ http://192.168.31.92/
2 threads and 30 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.59ms 1.16ms 47.58ms 91.91% // 线程延迟状态
Req/Sec 9.23k 846.07 12.38k 68.83% // 单个线程每秒请求数平均9.23k, 最大12.38k
Latency Distribution // 所有请求的延迟分布, 75%的请求延迟小于1.77毫秒
50% 1.38ms
75% 1.77ms
90% 2.39ms
99% 5.95ms
551551 requests in 30.05s, 2.02GB read // 2个线程, 30s内55万次请求
Requests/sec: 18355.61 // 2个线程每次请求1.8万次
Transfer/sec: 68.95MB
# 2. POST|GET 传参请求测试
wrk -t2 -c10 --latency --script=params.data http://192.168.31.91/api/test/
请求参数 params.data
cat > post.data <<EOF
wrk.method = "POST"
wrk.body = "username=chris&password=123456"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
EOF
# 3. 修改请求头信息 User-Agent 测试
wrk -t2 -c10 -d10s --latency
-H "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
http://192.168.31.92/
# 4. 基于 lua 脚本定制测试报告
wrk -t2 -c10 -d10s -s setup.lua --latency http://192.168.31.92/