<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>高基数 on Zero Day Notes</title>
        <link>https://blog.5772447.xyz/tags/%E9%AB%98%E5%9F%BA%E6%95%B0/</link>
        <description>Recent content in 高基数 on Zero Day Notes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Tue, 29 Sep 2026 09:00:00 +0800</lastBuildDate><atom:link href="https://blog.5772447.xyz/tags/%E9%AB%98%E5%9F%BA%E6%95%B0/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Prometheus 指标基数爆炸：TSDB 内存与磁盘双满</title>
            <link>https://blog.5772447.xyz/posts/54701524/</link>
            <pubDate>Tue, 29 Sep 2026 09:00:00 +0800</pubDate>
            <guid>https://blog.5772447.xyz/posts/54701524/</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;公司的监控体系以 Prometheus 为核心，一台 8C16G 的专用实例采集全部基础设施与应用指标，运行两年一直平稳，日均 active series 稳定在 180 万左右。9 月中旬，业务团队上线了一套自研的用户行为埋点 SDK,按需求&amp;quot;每个用户的请求都要可追溯&amp;quot;，把 &lt;code&gt;user_id&lt;/code&gt;、&lt;code&gt;order_id&lt;/code&gt;、&lt;code&gt;session_id&lt;/code&gt; 直接作为标签打进了自定义指标。&lt;/p&gt;&#xA;&lt;p&gt;上线第一周相安无事。第九天凌晨两点，Prometheus 因 OOM 被内核杀掉，systemd 拉起后跑了四十分钟再次 OOM;白天 Grafana 面板开始间歇性报 &lt;code&gt;query timeout&lt;/code&gt;,磁盘容量告警也在同一天触发——一个埋点需求，把整个监控平台拖进了不可用边缘。&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;ul&gt;&#xA;&lt;li&gt;Prometheus 容器反复重启，&lt;code&gt;dmesg&lt;/code&gt; 里是标准的 OOM killer 记录，重启后内存爬升速度快于正常水平。&lt;/li&gt;&#xA;&lt;li&gt;磁盘:&lt;code&gt;/data&lt;/code&gt; 分区日增量从平时的 2GB 涨到 9GB,按 30 天保留策略算，剩余空间只够撑四天。&lt;/li&gt;&#xA;&lt;li&gt;查询侧症状更早出现：面板查询超时，&lt;code&gt;/api/v1/query&lt;/code&gt; 的 P99 延迟从 200ms 涨到 30s 以上，部分大范围查询直接失败。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;prometheus_tsdb_head_series&lt;/code&gt; 指标本身也读得出来——head 里的 active series 从 180 万涨到了 1100 万，六天翻了六倍。&lt;/li&gt;&#xA;&lt;li&gt;业务接口无感知，故障完全局限在监控平台自身；但监控不可用意味着这期间所有告警都是盲的，风险敞口比故障本身更大。&lt;/li&gt;&#xA;&lt;/ul&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;p&gt;第一步确认&amp;quot;涨的是什么&amp;quot;。Prometheus 自带的 TSDB 状态页(&lt;code&gt;/tsdb-status&lt;/code&gt;)按指标名列出 series 增量排行，前三名全是业务埋点自定义指标：&lt;code&gt;app_request_duration_seconds&lt;/code&gt;、&lt;code&gt;app_user_action_total&lt;/code&gt;、&lt;code&gt;app_session_track_total&lt;/code&gt;,三者合计贡献了 900 万新 series。点开标签明细，每个 series 的标签组合里都带着 &lt;code&gt;user_id=&amp;quot;...&amp;quot;&lt;/code&gt; 或 &lt;code&gt;order_id=&amp;quot;...&amp;quot;&lt;/code&gt;——&lt;strong&gt;每来一个新用户、每一笔新订单，就生成一批全新的时间序列&lt;/strong&gt;，这就是基数(cardinality)爆炸的标准形态。&lt;/p&gt;&#xA;&lt;p&gt;第二步算清账。按当日活跃用户数 3 万、人均 6 类行为、每类行为 5 个额外标签维度估算，这三组指标一天的 series 增量就是百万级；而基础设施指标(节点、容器、网络)的 series 总集两年才积累到 180 万。增量与存量差了两个数量级，OOM 与写放大只是数学上的必然。&lt;/p&gt;&#xA;&lt;p&gt;第三步回溯为什么上线前没拦住。查变更记录，埋点 SDK 是业务团队自行发布的，指标通过 Pushgateway 汇入，没有经过监控平台的评审流程；Prometheus 侧也没有配置任何基数防御——&lt;code&gt;sample_limit&lt;/code&gt;、&lt;code&gt;label_limit&lt;/code&gt;、&lt;code&gt;keep_dropped&lt;/code&gt; 相关的 per-target 限制全部是默认关闭状态。也就是说，防线在流程和配置两层同时缺位。&lt;/p&gt;&#xA;&lt;p&gt;第四步验证恢复路径。直接回滚埋点版本会导致业务侧追溯需求落空，于是采用&amp;quot;收缩而非删除&amp;quot;的方案：与业务团队确认真实需求是&amp;quot;按渠道和地域聚合分析用户行为&amp;quot;，而不是&amp;quot;按单个用户 ID 精确追溯&amp;quot;——追溯场景改走日志平台(ELK),指标只保留聚合维度。确定边界后开始整改。&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;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;标签治理(治本)&lt;/strong&gt;：三个埋点指标删除 &lt;code&gt;user_id&lt;/code&gt;、&lt;code&gt;order_id&lt;/code&gt;、&lt;code&gt;session_id&lt;/code&gt; 标签，替换为 &lt;code&gt;channel&lt;/code&gt;、&lt;code&gt;region&lt;/code&gt;、&lt;code&gt;user_tier&lt;/code&gt; 等低基数维度;改造后预估 series 总量从 1100 万回落到 210 万，与旧基线同量级。指标语义变化同步更新了 Grafana 面板与告警规则的标签匹配。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;配置防线(防复发)&lt;/strong&gt;:Pushgateway 与各 scrape target 加上 &lt;code&gt;sample_limit: 200000&lt;/code&gt;、&lt;code&gt;label_limit: 30&lt;/code&gt;、&lt;code&gt;label_value_length_limit: 200&lt;/code&gt;;超过限制的 series 被拒收并记录 &lt;code&gt;prometheus_target_scrapes_exceeded_sample_limit_total&lt;/code&gt;,拒收即告警——让下一次失控在第一分钟暴露，而不是第九天凌晨。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;资源兜底&lt;/strong&gt;：Prometheus 实例内存上调至 24G、&lt;code&gt;--storage.tsdb.retention.size=400GB&lt;/code&gt; 硬顶保留策略(防止磁盘再被打穿)；磁盘告警阈值从 80% 提前到 70%。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;流程补位&lt;/strong&gt;：自定义指标上线纳入监控平台评审清单，新指标必须先在测试实例跑 24 小时观察基数曲线；把&amp;quot;是否含 ID 类高基数标签&amp;quot;写成评审必答题。&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;业务埋点把 user_id 等无限增长值作为标签，series 数随用户与订单量线性爆炸，head 内存与 TSDB 写入双双超出实例承受能力&lt;/strong&gt;。深层根因是双防线缺位：配置层没有 sample/label 上限，Prometheus 对失控指标来者不拒；流程层没有指标评审，业务团队不知道&amp;quot;标签的每个取值组合都是一条独立时序&amp;quot;这条 Prometheus 的基本成本模型。&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;ul&gt;&#xA;&lt;li&gt;所有 scrape target 强制 sample_limit/label_limit,拒收指标告警化；&lt;/li&gt;&#xA;&lt;li&gt;新指标上线走评审流程，测试实例预跑 24 小时观察基数；&lt;/li&gt;&#xA;&lt;li&gt;TSDB 状态页的 series Top10 加入周巡检，环比涨幅超 30% 即预警；&lt;/li&gt;&#xA;&lt;li&gt;用户级追溯需求一律路由到日志平台，监控指标只做聚合维度——这条边界写进埋点开发规范。&lt;/li&gt;&#xA;&lt;/ul&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;这次故障最值得记下的不是&amp;quot;高基数标签会炸&amp;quot;这个知识点，而是它揭示的监控平台脆弱性模型:Prometheus 的成本不是随&amp;quot;监控对象数&amp;quot;线性增长，而是随&amp;quot;标签取值组合数&amp;quot;增长，一个看起来无害的埋点字段就能把成本模型改写。监控平台自身被拖垮时，全站告警同时失明——这九天的盲飞窗口提醒我们，监控系统的容量与防线，值得用和生产服务同等级别的方式去管理。&lt;/p&gt;&#xA;&lt;h2 id=&#34;延伸阅读&#34;&gt;&lt;a href=&#34;#%e5%bb%b6%e4%bc%b8%e9%98%85%e8%af%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;延伸阅读&#xD;&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.5772447.xyz/posts/0468b1c8/&#34; &gt;Prometheus 告警风暴，怎么把邮件和企微通道全拖垮了？&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.5772447.xyz/posts/254b9d99/&#34; &gt;etcd 压缩后仍偶发 5xx：WAL 增长与磁盘延迟&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.5772447.xyz/posts/b38ac0b7/&#34; &gt;Linux 磁盘排查方法论：df/du 不一致与 inode 耗尽&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item></channel>
</rss>
