把Web应用部署到百度智能云的BCC云服务器之后,很多同学会想知道这台机器到底能扛住多少并发请求。光凭感觉或者简单的浏览器访问显然得不出结论,必须借助专业的压测工具。wrk就是这样一个好用的选择:它体积小、启动快、单机就能打出很高的并发压力,非常适合用来评估云服务器的Web服务承载能力。这篇文章从头到尾演示一遍在百度智能云环境下使用wrk做性能评测的完整流程。

一、wrk的安装与基本原理
wrk能在一个普通配置的机器上打出非常高的负载,核心原因是它的架构设计。它基于非阻塞的IO模型,结合epoll和kqueue这样的系统事件机制,用很少的线程就能维持大量并发连接。这一点和传统的ab(Apache Bench)有本质区别,ab是每个连接对应一个线程或进程的模式,机器资源很快就会被线程切换吃光,测试结果反而不能反映服务器真实水平。
在百度智能云的BCC实例上安装wrk非常简单,以CentOS为例:
# 安装依赖 yum install -y epel-release yum install -y wrk # Ubuntu/Debian系统 apt-get update apt-get install -y wrk # 验证安装 wrk -version
如果yum源里没有wrk包,也可以从源码编译,需要先安装git、gcc和make,然后从官方仓库拉取代码执行make即可。编译完成后会生成一个可执行的wrk文件,把它复制到/usr/local/bin目录下就能全局使用。
二、核心参数详解与压测命令实战
wrk的命令行参数不多,但每个都很关键。-t指定线程数,-c指定并发连接数,-d指定测试持续时间,-s指定Lua脚本,-H可以添加自定义请求头,-T设置超时时间。线程数的经验值一般设置为CPU核心数即可,连接数则根据你要模拟的并发规模来定。
假设你的Web服务已经部署在百度智能云BCC的8080端口上,一条典型的压测命令如下:
# 2个线程,500个并发连接,持续压测30秒
wrk -t2 -c500 -d30s -T5s http://192.168.0.10:8080/
# 带自定义请求头模拟真实浏览器
wrk -t4 -c1000 -d60s -H "User-Agent: Mozilla/5.0" \
--latency http://192.168.0.10:8080/api/list这里有个容易踩的坑:压测机本身最好也放在百度智能云内网中,比如在同一VPC下再开一台临时BCC作为压测机。如果从本地电脑直接压测公网IP,带宽和运营商链路会成为瓶颈,你测出来的往往不是服务器性能,而是你家宽带的上行速率。内网压测使用内网IP,千兆或万兆内网带宽基本不会成为干扰因素,测试数据才可信。
另一个技巧是加--latency参数,它会输出更详细的延迟分布统计,包括P50、P75、P90、P99分位数,这些数据对评估用户体验比平均值重要得多。
三、压测结果指标解读
一条完整的wrk输出包含四个部分:延迟分布、请求耗时分布、吞吐量数据和线程统计。下面逐项解释这些数字怎么看。
Running 30s test @ http://192.168.0.10:8080/
2 threads and 500 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 45.20ms 80.10ms 1.20s 90.50%
Req/Sec 5.80k 1.20k 9.80k 88.00%
Latency Distribution
50% 30.10ms
75% 50.30ms
90% 90.50ms
99% 350.20ms
152340 requests in 30.00s, 250.50MB read
Socket errors: connect 0, read 120, write 0, timeout 15
Requests/sec: 5078.02
Transfer/sec: 8.35MBLatency是每个请求的延迟,重点看P99分位。如果P50是30ms但P99到了350ms,说明有接近百分之一的用户体验很差,长尾问题明显,通常是连接池不足、数据库慢查询或者GC停顿造成的。Requests/sec是吞吐量,也就是服务器每秒处理的请求数,这是衡量承载能力的核心指标。Socket errors一行要特别留意,connect错误说明并发连接建立失败,read错误常见于服务器主动断开连接,timeout则是请求超过了设定的-T超时时间被放弃。
正常情况下错误数应该为零或接近零。如果出现大量read错误,需要检查云服务器安全组规则、Web服务器的最大连接数配置,以及系统级的文件描述符限制,可以用ulimit -n查看当前限制,必要时修改/etc/security/limits.conf调大。
四、进阶用法与调优建议
wrk支持通过Lua脚本定制请求逻辑,比如实现POST请求、动态参数或者多接口混合压测。下面是一个发送POST请求的脚本示例:
wrk.method = "POST"
wrk.body = '{"keyword":"test","page":1}'
wrk.headers["Content-Type"] = "application/json"
-- 每个请求随机生成一个用户ID
request = function()
wrk.headers["X-User-Id"] = math.random(1, 100000)
return wrk.format()
end使用方式是wrk -t2 -c200 -d30s -s post.lua http://192.168.0.10:8080/api/search。Lua脚本里还可以在done函数中拿到最终统计结果,方便做自定义汇总输出。
做压测时建议遵循几个原则。第一,压力要阶梯式递增,先从100并发开始,逐步提到500、1000、2000,找到吞吐量不再增长而延迟陡增的拐点,那个拐点就是这台云服务器的实际承载上限。第二,每次测试持续时间不要太短,至少30秒以上,让服务充分预热,前几秒的数据往往失真。第三,测试期间同步观察服务端资源,在百度智能云控制台的云监控里看CPU利用率、内存和网络带宽曲线,如果CPU没跑满但吞吐量上不去,瓶颈可能在数据库、锁竞争或者带宽配额上。第四,多跑几轮取稳定值,单次结果容易受宿主机邻居负载影响,云主机的性能本身存在一定波动。
最后提醒一点,压测完成后记得释放临时创建的压测机,避免产生不必要的费用。通过这套流程拿到可靠的吞吐量和延迟数据后,无论是评估当前BCC规格是否够用,还是决定要不要升级配置或加负载均衡,都有了扎实的数据支撑。