若 etcd_disk_wal_fsync_duration_seconds{quantile="0.99"} ≥ 10ms,即判定为生产级异常;此时 WAL fsync 延迟已超标,极易触发 Raft 心跳超时与选举风暴,须立即排查磁盘 IO 瓶颈并隔离干扰源。

当你在 etcd 日志中看到 wal: sync duration was too long 这类警告时,说明 WAL 文件的 fsync 操作耗时已严重超出安全阈值,Raft 心跳极可能中断,集群正滑向选举风暴边缘。必须立即定位磁盘层真实延迟,而非仅查日志或重启服务。
确认 WAL fsync 延迟是否真实超标
登录任意 etcd 节点,执行:
curl -s http://127.0.0.1:2379/metrics | grep etcd_disk_wal_fsync_duration_seconds
重点提取 etcd_disk_wal_fsync_duration_seconds{quantile="0.99"} 的值——【若该值 ≥ 10ms,即判定为生产级异常】。P99 ≥ 100ms 表示已有大量写请求被阻塞,此时 Leader 很可能已失联。
不要只看平均值(avg),它会掩盖尾部毛刺;也不要依赖 etcd_debugging_disk_wal_fsync_duration_seconds,该指标在新版 etcd 中已被弃用,返回值不可信。
穿透到底层磁盘验证真实 fsync 性能
方法一:用 fio 模拟 etcd 最严苛写模式
运行以下命令,复现 WAL 同步行为(4KB 随机写 + 强制 sync):
fio --name=etcd-wal-sync --ioengine=sync --rw=randwrite --bs=4k --size=1G --runtime=60 --time_based --group_reporting --filename=/var/lib/etcd/wal/test-fio-sync
输出中紧盯 clat percentiles 下的 99.00th 值——【必须 。若结果 >50ms,基本可断定是机械盘、云盘限速、或 RAID 卡缓存关闭导致。
方法二:用 iostat 看实时队列积压
iostat -x 1 5
观察目标磁盘(如 sdb 或 nvme0n1)的 w_await 和 svctm:若 w_await ≫ svctm(例如 w_await=85ms,svctm=0.8ms),说明写请求在内核队列中排队,上游写入过载;若两者接近且都高(如 w_await=42ms,svctm=38ms),说明磁盘本身响应慢,需换盘或查固件。
快速隔离 IO 干扰源
第一步:确认 etcd 是否独占物理盘
执行 lsblk -f | grep -A5 -B5 "etcd",检查 /var/lib/etcd 所在设备是否与日志采集器(fluentd/journald)、监控 agent(prometheus-node-exporter)、备份脚本共用同一块物理盘。若共用,【立刻将 ETCD_DATA_DIR 迁至 NVMe SSD 并更新 systemd 配置】。
第二步:限制竞争进程 IO 权重
对非关键高 IO 进程(如 logrotate、rsync 备份)执行:
ionice -c 3 -p $(pgrep -f "logrotate")
ionice -c 3 -p $(pgrep -f "rsync.*backup")
第三步:临时稳住 Leader(仅应急)
编辑 /etc/systemd/system/k3s.service 或 etcd systemd unit,在 ExecStart 行末追加:
--heartbeat-interval=1000 --election-timeout=5000
然后执行 systemctl daemon-reload && systemctl restart k3s。这不会修复磁盘问题,但能避免因瞬时抖动触发无意义选主。


















