云服务器性能榜单里最常见的指标是QPS,也就是每秒完成的HTTP请求数。wrk因为压测能力强、资源占用低,常被用来生成这类数据。但同样的云服务器,在不同测试条件下QPS可能相差数倍。wrk QPS性能排行榜如果没有标注并发数、线程数、测试时长、网络环境、响应体大小以及是否启用TLS,基本没有横向对比价值。这篇文章将围绕wrk的测试方法、参数选择、结果解读和实例调优展开,帮助你得到更接近真实能力的吞吐数据。

为什么单一QPS数值不能代表云服务器真实性能
云服务器的QPS受多种因素影响。vCPU核心数、主频、内存带宽、网络PPS、实例是否独享、hypervisor类型、磁盘I/O都会直接作用于最终吞吐。当响应路径涉及磁盘读取、模板渲染或数据库查询时,应用栈本身的效率可能成为瓶颈,服务器规格再高也无法提升wrk测得的数据。TLS握手同样会消耗CPU,尤其是使用RSA证书时,新建连接的代价远高于复用连接。
另一个容易被忽略的因素是测试端与目标端之间的网络。如果压测机和云服务器不在同一个VPC内网,或中间经过公网,结果会受到抖动、限速和丢包影响。比如一个4核8G实例在内网可以跑到8万QPS,跨公网测试可能只有不到2万QPS,这并非实例性能下降,而是链路瓶颈。因此,将不同来源的QPS直接排序意义有限。真正有参考价值的排行榜必须统一网络环境、响应体大小、协议类型和实例规格等级。
用wrk搭建可复现的云服务器压测流程
开始压测前,先准备一台独立压测机,最好与目标实例处于同一地域和同一VPC。压测机本身需要有足够CPU和网络能力,避免它先于目标实例成为瓶颈。目标端启动一个返回固定内容的HTTP服务,例如使用Go标准库监听8080端口,响应体保持几个字节大小,这样测出的数据更接近纯HTTP处理能力。
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/plain")
fmt.Fprint(w, "hello")
})
http.ListenAndServe(":8080", nil)
}
安装wrk可以直接从GitHub源码编译。在压测机上执行以下命令,完成后将可执行文件复制到系统路径。
git clone https://github.com/wg/wrk.git cd wrk make cp wrk /usr/local/bin/
原型测试建议先用短时命令确认服务可用,例如wrk -t4 -c100 -d10s http://127.0.0.1:8080/。正式测试时逐步增加并发和时长。下面这条命令使用8个线程、200个并发连接、持续60秒,并输出延迟分布。
wrk -t8 -c200 -d60s --latency http://127.0.0.1:8080/
如果目标服务绑定在云服务器内网地址,把127.0.0.1替换成对应内网IP即可。建议在测试前先跑一轮30秒预热,让连接池、TCP参数和CPU频率进入稳定状态。正式测试至少执行3次,取中间值或平均值作为记录结果,避免偶发抖动影响排名。
如何解读wrk输出并计算有效QPS
wrk输出的Requests/sec是总请求数除以测试时长,并不区分HTTP状态码。如果目标服务在高并发下返回500或503,这个数字可能仍然很高,但有效吞吐已经下降。因此,只看QPS容易得出错误结论。有效QPS应该等于测试期间成功返回2xx或预期状态码的请求数除以测试秒数。
默认wrk不会按状态码分类统计,可以通过Lua脚本扩展。下面这段脚本在响应阶段统计非200状态码,并在结束时打印。
local counter = {}
response = function(status, headers, body)
if status ~= 200 then
counter[status] = (counter[status] or 0) + 1
end
end
done = function(summary, latency, requests)
for status, count in pairs(counter) do
print(string.format("status %d: %d", status, count))
end
end
除了状态码,延迟分布同样重要。两个实例可能都跑出3万QPS,但一个P99延迟是5毫秒,另一个是40毫秒。对实时业务来说,高延迟意味着用户体验变差,单纯追求QPS没有意义。wrk的Latency Distribution会列出50%、75%、90%和99%分位值,配合--latency参数即可开启。还可以记录Stdev,判断延迟波动幅度。
测试完成后还需要关注压测机的资源消耗。如果压测机CPU使用率达到100%,或软中断占比异常升高,说明它已经无法产生更高负载,此时测得的QPS不是目标服务器的上限。可适当提升压测机规格,或拆分多个压测客户端同时发起请求。
提升云服务器wrk QPS的关键配置
在硬件规格固定的情况下,操作系统和Web服务器的参数调整可以显著改变QPS。Linux内核层面的somaxconn、tcp_max_syn_backlog和tcp_tw_reuse会影响连接建立和回收速度。默认值通常偏保守,可以通过sysctl提高。例如将net.core.somaxconn调整为4096,将net.ipv4.tcp_max_syn_backlog调整为8192,并开启net.ipv4.tcp_tw_reuse。注意配置后需执行sysctl -p使其生效。
Web服务器方面,Nginx需要根据CPU核心数自动创建工作进程,并扩大每个进程可处理的连接数。下面是一份适合静态短响应压测的配置片段。
worker_processes auto;
events {
worker_connections 10240;
}
http {
keepalive_requests 10000;
keepalive_timeout 65;
server {
listen 8080;
location / {
return 200 'hello';
}
}
}
如果使用Go或Node.js等应用服务,应避免在请求路径中做不必要的日志输出和内存分配。将日志级别调整为warn以上,关闭访问日志,尽量复用已建立连接。压测时采用HTTP长连接可以利用keepalive减少TCP握手和TLS握手开销。wrk默认支持连接复用,但服务端如果过早关闭连接,QPS会明显下降。
云服务器规格选择同样关键。对于纯HTTP短响应场景,vCPU主频和网络PPS往往比核心数更影响吞吐。某些突发性能型实例在持续高压下会被限流,QPS会先高后低。排行榜对比时应优先选择同一CPU平台、同一网络带宽上限的实例,否则结果只反映规格差异,而不是实际优化能力。

