4. etcd 性能基准测试:单节点与集群读写压测
etcd 作为 Kubernetes 的控制面存储,其性能直接决定了集群的调度延迟、API Server 响应速度以及故障恢复时间。本章通过标准化的基准测试,量化单节点与 3 节点集群在不同负载模型下的写入 QPS、延迟分布以及读性能(线性化 vs 串行化)差异,为后续的沙盘压测与调优提供基线数据。
4.1 测试环境与工具准备
所有测试均基于相同的硬件与软件栈,确保对比有效。使用 benchmark 工具(etcd 官方压测工具)执行标准化负载。
| 参数项 | 单节点配置 | 3 节点集群配置 |
|---|---|---|
| 节点规格 | 4 vCPU / 16 GB RAM | 4 vCPU / 16 GB RAM × 3 |
| 存储介质 | NVMe SSD (顺序写 1.2 GB/s) | NVMe SSD (顺序写 1.2 GB/s) |
| etcd 版本 | v3.5.15 | v3.5.15 |
| 后端存储 | boltdb (默认) | boltdb (默认) |
| 压测工具 | benchmark v3.5.15 | benchmark v3.5.15 |
| 压测并发数 | 64 连接 / 64 并发 | 64 连接 / 64 并发 |
| Key 大小 | 256 字节 | 256 字节 |
| Value 大小 | 1024 字节 | 1024 字节 |
关键前提:所有测试前均执行
etcdctl check perf 确认磁盘 fsync 延迟在 10ms 以内,避免磁盘成为瓶颈。测试期间关闭 etcd 的自动压缩与快照功能,防止后台任务干扰。
4.2 单节点写入 QPS / 延迟基准
单节点模式下,所有写入请求直接提交到本地 boltdb,不涉及 Raft 共识。测试结果反映了单机存储引擎的极限性能。
# 单节点写入压测命令
benchmark --endpoints=http://192.168.1.10:2379 \
--target-leader \
--conns=64 --clients=64 \
put --key-size=256 --val-size=1024 \
--total=100000 --rate=0
| 指标 | 平均值 | P99 延迟 | P999 延迟 | 最大延迟 |
|---|---|---|---|---|
| 写入 QPS | 48,521 ops/s | — | — | — |
| 写入延迟 (ms) | 1.32 ms | 4.87 ms | 9.21 ms | 15.40 ms |
分析:单节点写入 QPS 约 4.8 万,P99 延迟 4.87ms,表现良好。但单节点存在单点故障风险,生产环境必须使用集群模式。
4.3 3 节点集群写入 QPS / 延迟基准
3 节点集群模式下,每次写入必须经过 Raft 共识:Leader 接收请求 → 日志复制到 Follower → Follower 确认 → Leader 提交 → 返回客户端。该过程引入了网络往返与磁盘同步开销。
# 3 节点集群写入压测命令
benchmark --endpoints=http://192.168.1.10:2379,http://192.168.1.11:2379,http://192.168.1.12:2379 \
--target-leader \
--conns=64 --clients=64 \
put --key-size=256 --val-size=1024 \
--total=100000 --rate=0
| 指标 | 平均值 | P99 延迟 | P999 延迟 | 最大延迟 |
|---|---|---|---|---|
| 写入 QPS | 18,233 ops/s | — | — | — |
| 写入延迟 (ms) | 3.51 ms | 11.28 ms | 22.65 ms | 38.10 ms |
关键发现:3 节点集群的写入 QPS 约为单节点的 37.6%,延迟增加约 2.7 倍。这是 Raft 共识的固有开销——每次写入需要至少两次磁盘 fsync(Leader 本地 + 多数 Follower)。网络延迟每增加 1ms,P99 延迟将恶化 3-5ms。
4.4 读性能基准:线性化 vs 串行化
etcd 提供两种读一致性模型:线性化读(Linearizable Read) 保证返回最新已提交数据,但需要经过 Raft 确认当前 Leader;串行化读(Serializable Read) 直接从本地状态机读取,性能更高但可能读到旧数据(stale read)。
# 线性化读压测(默认)
benchmark --endpoints=http://192.168.1.10:2379,http://192.168.1.11:2379,http://192.168.1.12:2379 \
--conns=64 --clients=64 \
range --key="key_00001" --end="key_01000" \
--consistency=l --total=100000
# 串行化读压测
benchmark --endpoints=http://192.168.1.10:2379,http://192.168.1.11:2379,http://192.168.1.12:2379 \
--conns=64 --clients=64 \
range --key="key_00001" --end="key_01000" \
--consistency=s --total=100000
| 读模型 | QPS | 平均延迟 | P99 延迟 | P999 延迟 |
|---|---|---|---|---|
| 线性化读 (Linearizable) | 32,144 ops/s | 1.99 ms | 6.73 ms | 14.20 ms |
| 串行化读 (Serializable) | 71,889 ops/s | 0.89 ms | 2.91 ms | 6.55 ms |
性能差异:串行化读 QPS 是线性化读的 2.24 倍,延迟降低约 55%。对于可容忍最终一致性的场景(如监控数据、配置缓存),应优先使用串行化读以降低 etcd 负载。
4.5 读写性能对比总览
以下 SVG 图直观对比了单节点与 3 节点集群在写入、线性化读、串行化读三个维度的 QPS 与延迟分布。
4.6 性能基准测试结论
- 单节点写入极限:约 48.5k QPS,P99 延迟 4.87ms,适合开发/测试环境。
- 3 节点集群写入:约 18.2k QPS,P99 延迟 11.28ms,Raft 共识带来约 2.7 倍延迟放大。
- 读模型选择:串行化读性能显著优于线性化读,但需评估业务对一致性的容忍度。
- 磁盘与网络是关键瓶颈:fsync 延迟和节点间网络 RTT 直接决定集群性能上限。