文章内容

2026/1/6 19:18:34,作 者: 黄兵

Caddy 压测

在前面几篇文章中,我们价绍了什么是 Caddy 以及如何在 Caddy 中启用 Brotli 压缩,同时我们还使用 Caddy 配置了通配符证书

这些配置完成之后,我们需要测试 Caddy 性能到底怎么样。

这次我们使用的是 wrk 进行测试。

我们通过以下命令安装 wrk:

apt install wrk -y

如果出现:

Unable to locate package wrk

wrk 并不在所有发行版的默认软件源中,尤其是:

  • Debian 10 / 11 / 12

  • Ubuntu 某些最小化镜像

  • 云厂商精简系统

我们可以通过源码编译 wrk(最稳定),具体步骤:

1️⃣ 安装依赖

apt update
apt install -y git build-essential libssl-dev

2️⃣ 拉取并编译

git clone https://github.com/wg/wrk.git
cd wrk
make

3️⃣ 验证

./wrk --version

如果看到版本号,说明成功。

有的时候服务器在 IPv6 Only 中无法访问 github,我们可以将这个文件下载下载之后上传到 vps 上。

我们下载下来的是 wrk-master.zip文件,我们开始解压:

一、确认是否已安装 unzip

先检查系统是否已有 unzip

unzip -v

如果提示未找到命令,则安装:

apt update
apt install -y unzip

二、指定解压目录

如果解压到指定路径,例如 /opt

unzip wrk-master.zip -d /opt
cd /opt/wrk-master

三、编译 wrk

解压完成 wrk-master.zip,下一步通常是编译:

apt update
apt install -y build-essential libssl-dev
make

编译完成后,当前目录会生成可执行文件:

./wrk --version

👉 可选(加入 PATH):

cp wrk /usr/local/bin/

之后可直接:

wrk -t8 -c200 -d60s https://im.eu-.o.example.com/test.jpg

我们现在开始测试:

./wrk -t8 -c200 -d60s https://ima.eu.o.example.com/common-be424.min.css

测试结果:

Running 1m test @ https://im.eu.o.example.com/common-be2e.min.css 
  8 threads and 200 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   881.12ms  448.83ms   2.00s    61.60%
    Req/Sec    27.24     15.18   100.00     64.53%
  12255 requests in 1.00m, 2.08GB read
  Socket errors: connect 0, read 0, write 0, timeout 792
Requests/sec:    203.97
Transfer/sec:     35.41MB

1️⃣ 核心指标摘要

并发连接数(-c): 200
线程数(-t):     8
压测时长(-d):   60s

QPS:              ~204 req/s
吞吐量:           ~35.41 MB/s
平均延迟:         881 ms
最大延迟:         2.00 s
超时请求:         792 次

关键结论:

⚠️ 系统已经进入明显的 I/O 等待或后端阻塞状态

问题点精准定位

❗ 1. 平均延迟 881ms(非常高)

对于一个 .css 静态资源来说:

  • 理想值:10–50 ms(CDN/内存缓存)

  • 可接受值:< 200 ms

  • 当前值:≈ 900 ms ❌

这意味着:

  • 并非网络问题

  • 请求在后端等待资源释放

  • 极可能是 Swift / 磁盘 / 连接池瓶颈

❗ 2. 出现 792 次 timeout(这是红灯)
Socket errors: timeout 792

这说明:

  • wrk 等不到响应

  • 后端响应时间 > 2s

  • Caddy / Nginx 本身没有 crash,但被“拖死”

❗ 3. QPS 偏低(204 req/s)

200 并发下:

  • 优秀对象存储:1k–5k req/s

  • 你当前:≈200 req/s

说明瓶颈不是前端代理,而是:

👉 Swift 对象读取能力 or Swift 前的 Nginx 到 Swift 通道

❗ 4. 吞吐量反而正常(35MB/s)
2.08GB / 60s ≈ 35MB/s

说明:

  • 单请求文件体积不小

  • 磁盘 / 网络带宽不是第一瓶颈

  • 并发处理能力问题(非带宽问题)

下面是服务器资源占用截图:

CPU 使用率(2vCPU)

磁盘读写数据:

网络传输:

网络 PPS 数据:

刚才是 177KB 的大文件测试,现在我们使用 0.6 KB 的小文件测试:

./wrk -t8 -c200 -d60s https://im.eu.o.example.com/h-favicon.png

测试结果:

  8 threads and 200 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   650.63ms  358.46ms   2.00s    62.27%
    Req/Sec    39.28     20.21   151.00     68.49%
  18306 requests in 1.00m, 19.76MB read
  Socket errors: connect 0, read 0, write 0, timeout 4
Requests/sec:    304.64
Transfer/sec:    336.77KB

结果 CPU 还是 200%,说明:

  • 压测开始 → CPU 瞬间拉满

  • 压测结束 → CPU 瞬间回落

没有抖动、没有锯齿。

这说明:

CPU 被请求处理线程线性吃满,而不是锁、IO 或死循环

这种情况只能增加 CDN 缓存了。


其它相关推荐:

1、Caddy 服务器

2、Caddy Docker 镜像启用 Brotli 压缩

3、Zstd 压缩 Brotli 压缩 Gzip 压缩对比

4、Caddy 通配符证书相关问题

5、

分享到:

发表评论

评论列表