<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Etcd on Zero Day Notes</title>
        <link>https://blog.5772447.xyz/tags/etcd/</link>
        <description>Recent content in Etcd on Zero Day Notes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Wed, 09 Sep 2026 07:00:00 +0800</lastBuildDate><atom:link href="https://blog.5772447.xyz/tags/etcd/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>etcd 压缩后 API Server 为何仍偶发 5xx？一次 WAL 增长与磁盘延迟的根因定位</title>
            <link>https://blog.5772447.xyz/posts/254b9d99/</link>
            <pubDate>Wed, 09 Sep 2026 07:00:00 +0800</pubDate>
            <guid>https://blog.5772447.xyz/posts/254b9d99/</guid>
            <description>&lt;h2 id=&#34;问题背景&#34;&gt;&lt;a href=&#34;#%e9%97%ae%e9%a2%98%e8%83%8c%e6%99%af&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;问题背景&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;生产 Kubernetes 集群在 2026-09-08 凌晨 03:12 左右开始出现间歇性 API 请求失败，Prometheus 告警显示 &lt;code&gt;apiserver_request_total{code=&amp;quot;5xx&amp;quot;}&lt;/code&gt; 突增，持续约 40 分钟后回落。集群规模约 180 节点、3200+ Pod，核心组件（kube-apiserver、etcd、controller-manager）均运行在独立高性能 NVMe 盘上。&lt;/p&gt;&#xA;&lt;p&gt;集群自 7 月底以来已按官方推荐开启了 etcd 自动压缩（&lt;code&gt;--auto-compaction-retention=1h&lt;/code&gt;），并配置了每日 03:00 的全量快照。理论上压缩后 etcd 磁盘占用应趋于稳定，但监控显示最近 7 天内 etcd WAL 目录持续以 180-220MB/天的速度增长，远超预期。&lt;/p&gt;&#xA;&lt;p&gt;本次故障正发生在压缩窗口后 12 分钟，疑似与压缩后的 WAL 清理/重写流程存在竞争或 I/O 放大。&lt;/p&gt;&#xA;&lt;h2 id=&#34;故障现象&#34;&gt;&lt;a href=&#34;#%e6%95%85%e9%9a%9c%e7%8e%b0%e8%b1%a1&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;故障现象&#xD;&#xA;&lt;/h2&gt;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;API Server 5xx 集中爆发&lt;/strong&gt;：&lt;code&gt;kube-apiserver&lt;/code&gt; 日志中大量出现 &lt;code&gt;etcdserver: request timed out&lt;/code&gt; 与 &lt;code&gt;context deadline exceeded&lt;/code&gt;，对应客户端请求返回 503/504。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;etcd WAL fsync 延迟飙升&lt;/strong&gt;：&lt;code&gt;etcd_disk_wal_fsync_duration_seconds&lt;/code&gt; P99 从常态的 8-12ms 突增至 180-420ms，持续约 8-15 秒后回落，周期性出现。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;WAL 文件异常增长&lt;/strong&gt;：压缩完成后 &lt;code&gt;member/wal&lt;/code&gt; 目录下仍出现多个 128MB+ 的 WAL segment，&lt;code&gt;etcd --wal-dir&lt;/code&gt; 实际占用从 1.8GB 涨至 2.4GB。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;磁盘 I/O 抖动&lt;/strong&gt;：&lt;code&gt;iostat -x 1&lt;/code&gt; 显示 &lt;code&gt;nvme0n1&lt;/code&gt; 的 &lt;code&gt;%util&lt;/code&gt; 在 03:24-03:31 期间多次达到 92-98%，&lt;code&gt;await&lt;/code&gt; 从 0.8ms 飙升至 45-120ms。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;无数据丢失&lt;/strong&gt;：etcd &lt;code&gt;mvcc_db_total_size&lt;/code&gt; 保持在 6.1GB 左右，leader 选举正常，集群健康检查（&lt;code&gt;etcdctl endpoint health&lt;/code&gt;）全部通过。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;排查过程&#34;&gt;&lt;a href=&#34;#%e6%8e%92%e6%9f%a5%e8%bf%87%e7%a8%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;排查过程&#xD;&#xA;&lt;/h2&gt;&lt;h3 id=&#34;步骤-1确认-5xx-与-etcd-延迟的关联&#34;&gt;&lt;a href=&#34;#%e6%ad%a5%e9%aa%a4-1%e7%a1%ae%e8%ae%a4-5xx-%e4%b8%8e-etcd-%e5%bb%b6%e8%bf%9f%e7%9a%84%e5%85%b3%e8%81%94&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;步骤 1：确认 5xx 与 etcd 延迟的关联&#xD;&#xA;&lt;/h3&gt;&lt;p&gt;通过 Loki 查询 &lt;code&gt;kube-apiserver&lt;/code&gt; 在 03:12-03:52 的错误日志，提取 &lt;code&gt;request.*etcd&lt;/code&gt; 相关行，发现 87% 的 5xx 请求在 etcd 客户端侧等待超过 2.5s。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl logs -n kube-system kube-apiserver-node-03 --since&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;1h | &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  grep -E &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;etcdserver.*timeout|deadline exceeded&amp;#39;&lt;/span&gt; | head -20&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;同时用 &lt;code&gt;etcdctl alarm list&lt;/code&gt; 确认无 &lt;code&gt;NOSPACE&lt;/code&gt; 告警，排除空间不足。&lt;/p&gt;&#xA;&lt;h3 id=&#34;步骤-2定位-wal-增长源头&#34;&gt;&lt;a href=&#34;#%e6%ad%a5%e9%aa%a4-2%e5%ae%9a%e4%bd%8d-wal-%e5%a2%9e%e9%95%bf%e6%ba%90%e5%a4%b4&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;步骤 2：定位 WAL 增长源头&#xD;&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /var/lib/etcd/member/wal&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -lh | tail -10&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 发现 0000000000008a2f-0000000000008c1e 等多个 128MB segment 未被清理&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;du -sh .&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2.4G（正常应 &amp;lt;1.8G）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;用 &lt;code&gt;etcdctl endpoint status&lt;/code&gt; 查看 &lt;code&gt;dbSize&lt;/code&gt; 与 &lt;code&gt;dbSizeInUse&lt;/code&gt; 差距仅 180MB，说明压缩已生效，但 WAL 未同步释放。&lt;/p&gt;&#xA;&lt;h3 id=&#34;步骤-3分析-fsync-延迟与磁盘-io&#34;&gt;&lt;a href=&#34;#%e6%ad%a5%e9%aa%a4-3%e5%88%86%e6%9e%90-fsync-%e5%bb%b6%e8%bf%9f%e4%b8%8e%e7%a3%81%e7%9b%98-io&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;步骤 3：分析 fsync 延迟与磁盘 I/O&#xD;&#xA;&lt;/h3&gt;&lt;p&gt;在故障节点上抓取 &lt;code&gt;bpftrace&lt;/code&gt; 脚本追踪 &lt;code&gt;fsync&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bpftrace -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;tracepoint:syscalls:sys_enter_fsync {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  @start[tid] = nsecs;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;tracepoint:syscalls:sys_exit_fsync /@start[tid]/ {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  $lat = (nsecs - @start[tid]) / 1000000;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  if ($lat &amp;gt; 50) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    printf(&amp;#34;fsync latency: %d ms, pid=%d\n&amp;#34;, $lat, pid);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  delete(@start[tid]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;输出显示 &lt;code&gt;etcd&lt;/code&gt; 进程的 fsync 延迟集中在 03:24、03:27、03:30 三次，每次持续 6-11 秒。&lt;/p&gt;&#xA;&lt;p&gt;用 &lt;code&gt;iotop -o -d 1&lt;/code&gt; 进一步确认：&lt;code&gt;etcd&lt;/code&gt; 进程在这些时间点 &lt;code&gt;DISK WRITE&lt;/code&gt; 达到 380-520MB/s，远超 NVMe 盘的常态写入带宽（~280MB/s）。&lt;/p&gt;&#xA;&lt;h3 id=&#34;步骤-4wal-段文件与压缩窗口的时序关系&#34;&gt;&lt;a href=&#34;#%e6%ad%a5%e9%aa%a4-4wal-%e6%ae%b5%e6%96%87%e4%bb%b6%e4%b8%8e%e5%8e%8b%e7%bc%a9%e7%aa%97%e5%8f%a3%e7%9a%84%e6%97%b6%e5%ba%8f%e5%85%b3%e7%b3%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;步骤 4：WAL 段文件与压缩窗口的时序关系&#xD;&#xA;&lt;/h3&gt;&lt;p&gt;检查 etcd 日志中压缩触发点：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-09-08 03:00:07 ... &amp;#34;msg&amp;#34;:&amp;#34;compacting&amp;#34;,&amp;#34;rev&amp;#34;:12489301,&amp;#34;compact-min-revision&amp;#34;:12451220&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-09-08 03:00:19 ... &amp;#34;msg&amp;#34;:&amp;#34;finished scheduled compaction&amp;#34;,&amp;#34;took&amp;#34;:&amp;#34;11.842s&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;而 WAL 异常增长的 segment 创建时间集中在 03:12-03:31，正好落在压缩完成后 12-31 分钟。&lt;/p&gt;&#xA;&lt;p&gt;进一步用 &lt;code&gt;filefrag -v&lt;/code&gt; 检查 WAL 文件的物理碎片：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Filesystem type is: ef53&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;File size of 0000000000008a2f-0000000000008c1e is 134217728 (32768 blocks of 4096 bytes)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ext:     logical_offset:  physical_offset: length:   expected: flags:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   0:      0..  32767:  1843200.. 1875967:  32768:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;发现单个 WAL segment 在物理盘上被分配到 1843200-1875967 连续块，但相邻的另一个 segment 却散布在 1920000+ 区域，存在跨 zone 的分配。&lt;/p&gt;&#xA;&lt;h3 id=&#34;步骤-5复现与验证&#34;&gt;&lt;a href=&#34;#%e6%ad%a5%e9%aa%a4-5%e5%a4%8d%e7%8e%b0%e4%b8%8e%e9%aa%8c%e8%af%81&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;步骤 5：复现与验证&#xD;&#xA;&lt;/h3&gt;&lt;p&gt;在测试环境用相同 etcd 版本（v3.5.12）与磁盘类型重放：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;写入 50 万条 key，触发 1h 压缩；&lt;/li&gt;&#xA;&lt;li&gt;持续写入 2000 req/s 模拟业务；&lt;/li&gt;&#xA;&lt;li&gt;观察到压缩后 8-15 分钟内 WAL fsync P99 同样出现 90-180ms 尖峰。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;确认问题与「压缩后 WAL 重写 + 业务持续写入」的 I/O 竞争直接相关。&lt;/p&gt;&#xA;&lt;h2 id=&#34;解决方案&#34;&gt;&lt;a href=&#34;#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;解决方案&#xD;&#xA;&lt;/h2&gt;&lt;h3 id=&#34;立即止血已执行&#34;&gt;&lt;a href=&#34;#%e7%ab%8b%e5%8d%b3%e6%ad%a2%e8%a1%80%e5%b7%b2%e6%89%a7%e8%a1%8c&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;立即止血（已执行）&#xD;&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 临时调大 etcd 磁盘 I/O 优先级，降低 fsync 延迟影响&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;etcd&amp;#34;&lt;/span&gt; &amp;gt; /sys/fs/cgroup/system.slice/etcd.service/cpu.weight&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ioprio-set -p &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;pgrep etcd&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;# real-time I/O class&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;同时在 kube-apiserver 端增加 &lt;code&gt;--etcd-compaction-interval=0&lt;/code&gt;（禁用客户端侧自动压缩触发），把压缩完全交给 etcd 自身调度，避免双重压缩竞争。&lt;/p&gt;&#xA;&lt;h3 id=&#34;根治措施&#34;&gt;&lt;a href=&#34;#%e6%a0%b9%e6%b2%bb%e6%8e%aa%e6%96%bd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;根治措施&#xD;&#xA;&lt;/h3&gt;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;调整 WAL 段大小与清理策略&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# etcd 启动参数增加&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--wal-keep-size&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;256M &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--max-snapshots&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--max-wals&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;wal-keep-size&lt;/code&gt; 限制 WAL 保留上限，超过后会触发提前清理，防止单个 segment 过大导致 fsync 耗时。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;分离 WAL 与 DB 物理磁盘&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;原配置中 WAL 与 &lt;code&gt;member/snap/db&lt;/code&gt; 共用同一 NVMe 盘。改为：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;WAL：&lt;code&gt;/data/etcd-wal&lt;/code&gt;（独立 400GB NVMe，&lt;code&gt;--wal-dir&lt;/code&gt; 指向）&lt;/li&gt;&#xA;&lt;li&gt;DB：&lt;code&gt;/data/etcd-db&lt;/code&gt;（另一块 NVMe，&lt;code&gt;--data-dir&lt;/code&gt; 指向）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;避免 WAL fsync 与 DB compaction 的 I/O 争抢。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;引入 WAL 预分配与 direct I/O&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在 etcd 配置中启用实验性参数（需 v3.5.13+）：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--experimental-wal-preallocate&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--experimental-wal-fsync-policy&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;direct&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;预分配可减少运行时 extend 操作，direct I/O 绕过 page cache 降低延迟抖动。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;监控增强&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;新增告警规则：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;alert&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;EtcdWALFsyncP99High&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;expr&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;histogram_quantile(0.99, etcd_disk_wal_fsync_duration_seconds_bucket) &amp;gt; 0.05&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;for&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2m&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;annotations&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;summary&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;etcd WAL fsync P99 &amp;gt; 50ms，疑似磁盘 I/O 瓶颈&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;同时暴露 &lt;code&gt;etcd_wal_segment_count&lt;/code&gt; 与 &lt;code&gt;etcd_wal_total_size_bytes&lt;/code&gt; 两个新指标，用于提前发现 WAL 膨胀。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;根因分析&#34;&gt;&lt;a href=&#34;#%e6%a0%b9%e5%9b%a0%e5%88%86%e6%9e%90&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;根因分析&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;根本原因是 &lt;strong&gt;etcd 压缩后的 WAL 重写窗口与业务高峰写入存在 I/O 竞争，且 WAL segment 默认 64MB 在高写入场景下增长过快，单个 fsync 操作需刷盘 128MB+ 数据，叠加 NVMe 盘在 zone 分配时的轻微碎片，导致 P99 延迟偶发飙升&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;压缩本身是正确的（&lt;code&gt;dbSizeInUse&lt;/code&gt; 下降），但 WAL 清理滞后 + 磁盘未分离 + 缺少 &lt;code&gt;wal-keep-size&lt;/code&gt; 限制，形成了「压缩后反而更忙」的反直觉现象。&lt;/p&gt;&#xA;&lt;h2 id=&#34;预防措施&#34;&gt;&lt;a href=&#34;#%e9%a2%84%e9%98%b2%e6%8e%aa%e6%96%bd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;预防措施&#xD;&#xA;&lt;/h2&gt;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;WAL 与 DB 物理分离&lt;/strong&gt;：所有 etcd 节点必须在下次滚动重启时完成磁盘分离，预计 2026-09-15 前落地。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;WAL 保留策略收紧&lt;/strong&gt;：&lt;code&gt;--wal-keep-size=256M&lt;/code&gt; + &lt;code&gt;--max-wals=5&lt;/code&gt; 已写入 etcd systemd unit，需在 9 月底前全量生效。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;引入 etcd 版本升级窗口&lt;/strong&gt;：计划 Q4 将 etcd 升级至 v3.5.15（含 WAL 预分配与 direct I/O 正式支持），提前在 staging 环境验证。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;每月 WAL 健康巡检&lt;/strong&gt;：在 &lt;code&gt;auto_review.py&lt;/code&gt; 中增加 &lt;code&gt;etcd_wal_segment_count &amp;gt; 12&lt;/code&gt; 的告警项，防止 WAL 段文件无限累积。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;变更 checklist 补充&lt;/strong&gt;：任何涉及 etcd 存储层的变更，必须在「变更前 checklist」中增加「确认 WAL 与 DB 物理磁盘分离」「确认 wal-keep-size 已生效」两项门禁。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;总结&#34;&gt;&lt;a href=&#34;#%e6%80%bb%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;总结&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;本次故障再次印证了「etcd 压缩不是银弹」的观点：压缩解决了 DB 膨胀，但 WAL 的生命周期管理同样关键。生产环境必须把 WAL 视为独立的一等公民——物理隔离、尺寸限制、I/O 优先级、监控告警，四者缺一不可。&lt;/p&gt;&#xA;&lt;p&gt;故障处理过程中，团队也积累了「压缩窗口后 30 分钟是 WAL 延迟高发期」的经验，后续可据此调整业务低峰维护窗口，避免再次踩坑。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;最终状态&lt;/strong&gt;：集群已恢复平稳，etcd WAL fsync P99 回落至 15ms 以内，API Server 5xx 告警清零。预计通过磁盘分离与 WAL 策略收紧，可将同类问题发生概率降低 90% 以上。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
