<?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/%E7%B4%A2%E5%BC%95%E7%A2%8E%E7%89%87/</link>
        <description>Recent content in 索引碎片 on Zero Day Notes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Sat, 17 Oct 2026 09:00:00 +0800</lastBuildDate><atom:link href="https://blog.5772447.xyz/tags/%E7%B4%A2%E5%BC%95%E7%A2%8E%E7%89%87/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>WSUS 数据库从未清理：客户端更新检查超时</title>
            <link>https://blog.5772447.xyz/posts/5a4d227b/</link>
            <pubDate>Sat, 17 Oct 2026 09:00:00 +0800</pubDate>
            <guid>https://blog.5772447.xyz/posts/5a4d227b/</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;公司的 Windows 补丁统一由一台 WSUS 服务器分发：400 多台终端、30 台成员服务器，全部通过组策略指向它&amp;quot;检查更新&amp;quot;。这台服务器是四年前搭建的，装完、配好策略之后就再没动过——没有故障、没有告警，存在感低到在交接文档里只占一行：&amp;ldquo;WSUS：192.168.x.x&amp;rdquo;。&lt;/p&gt;&#xA;&lt;p&gt;近两个月，服务台开始频繁接到两类反馈：一是终端&amp;quot;检查更新&amp;quot;经常报错（0x8024401C 请求超时），重试几次偶尔能过；二是运维自己发现，WSUS 控制台打开要转半分钟，补丁日前后更是慢到没法操作。补丁发不出去，安全部门催更的邮件就跟着来了。&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;终端检查更新频繁超时：报 0x8024401C（请求超时），偶尔 0x80244022（服务不可用），月初补丁日之后尤其严重。&lt;/li&gt;&#xA;&lt;li&gt;WSUS 控制台（基于 IIS 管理站点）加载缓慢，更新视图有时直接超时打不开。&lt;/li&gt;&#xA;&lt;li&gt;服务器 CPU 不高、内存正常，但磁盘队列长度长期在 20 以上（正常应为个位数）。&lt;/li&gt;&#xA;&lt;li&gt;系统盘空间告急：一个平时&amp;quot;看不见&amp;quot;的数据库文件，加上补丁内容目录，吃掉了大半容量。&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;&lt;strong&gt;第一步，先排除客户端与网络。&lt;/strong&gt; 抽查三台报错终端：手动触发检查更新，同样超时；测试到 WSUS 管理端口（8530）的连通性正常——网络无碍，是服务端&amp;quot;回话太慢&amp;quot;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第二步，看服务端性能。&lt;/strong&gt; CPU 30% 以下、内存正常，但磁盘 IO 队列几乎打满；进程视图里 W3WP.exe（WSUS 的 IIS 应用池）是 IO 大户。WSUS 的数据存在 Windows Internal Database（WID）里，客户端每一次&amp;quot;检查更新&amp;quot;最终都变成对 SUSDB 数据库的查询——瓶颈在数据库读写。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第三步，定位数据库。&lt;/strong&gt; 顺着 WID 的数据目录找到 &lt;code&gt;SUSDB.mdf&lt;/code&gt;：已经涨到 42GB。对照同类规模（400+ 终端）的正常值只有几个 GB——这个体积本身就是最大的异常。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第四步，搞清 42GB 是怎么来的。&lt;/strong&gt; 打开 WSUS 控制台的更新视图：数万条更新堆在列表里，大量是&amp;quot;已过期&amp;quot;和&amp;quot;被取代（superseded）&amp;ldquo;的旧修订版本。查文档确认了关键机制——&lt;strong&gt;WSUS 不会自动清理这些数据&lt;/strong&gt;：过期更新时间到了不会自己消失，被取代的修订版本默认保留，没人去拒绝它们，数据库就只进不出。再翻维护记录：这台服务器四年间，服务器清理向导（Server Cleanup Wizard）一次都没跑过。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第五步，验证索引层面的放大效应。&lt;/strong&gt; 检查 SUSDB 的索引状态：关键更新表（tbRevision 系列）的索引碎片率超过 90%。膨胀的数据加上被打碎的索引，客户端每次&amp;quot;检查更新&amp;quot;要花几十秒去查库——越过客户端 30 秒的超时线，就是那条 0x8024401C。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第六步，确认处置路径并评估风险。&lt;/strong&gt; 官方推荐的清理动作是服务器清理向导（或 &lt;code&gt;Invoke-WsusServerCleanup&lt;/code&gt;），删除过期更新、被取代更新与无用内容文件；对大数据量的库，这一步会非常慢（本例首次跑了约六小时），需要放在维护窗口执行，且清理之后要重建索引，数据库文件才会真正瘦身。&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;：停掉 WSUS 应用池，执行 &lt;code&gt;Invoke-WsusServerCleanup&lt;/code&gt;（过期更新、被取代更新、无用内容文件、过期计算机、旧同步结果全选）。首次清理跑了约六小时，拒绝了 8 万多条过期与被取代的更新，顺带清出约 30GB 的无用内容文件。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;收缩 + 重建索引&lt;/strong&gt;：先收缩 SUSDB 数据文件，再跑支持团队给出的 reindex 脚本重建索引——顺序不能反，收缩会把刚重建好的索引重新打碎；完成后数据库稳定在 7GB 以内。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;验证&lt;/strong&gt;：批量触发客户端检查更新，响应从超时恢复到十几秒以内；控制台视图秒开；磁盘队列回落到个位数。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;例行化&lt;/strong&gt;：建立月度计划任务（每月补丁日前两天执行清理与索引维护）；把 SUSDB 大小、磁盘队列长度、客户端更新错误率纳入监控——这次故障从头到尾没有触发过任何一条系统告警，全靠人肉发现。&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;直接根因是 SUSDB 数据库四年间从未做过例行维护：过期与被取代的更新修订持续累积（膨胀到 42GB），叠加 90% 以上的索引碎片，让每一次客户端&amp;quot;检查更新&amp;quot;的数据库查询慢到越过 30 秒超时线，表现为&amp;quot;终端更新检查报错&amp;rdquo;。&lt;/p&gt;&#xA;&lt;p&gt;深层根因是典型的&amp;quot;装完即忘&amp;quot;：WSUS 这类基础设施以沉默为常态，不清理不会立刻报错，维护责任在交接中蒸发了；而清理被设计成手动或计划任务（默认不自动执行），没有监控、没有文档、没有例行计划，欠账只会以看不见的方式复利增长，直到某天越过超时阈值，一次性变成&amp;quot;故障&amp;quot;。&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;盘点&amp;quot;装完即忘&amp;quot;类基础设施（WSUS、备份验证、证书巡检、AD 回收站……），给每一项建立显性维护计划：动作、频率、负责人；&lt;/li&gt;&#xA;&lt;li&gt;WSUS 月度自动维护（清理加索引），监控 SUSDB 体积、磁盘队列、客户端错误率三个指标；&lt;/li&gt;&#xA;&lt;li&gt;系统交接必须带&amp;quot;维护清单&amp;quot;，例行任务写进验收项，而不是只留一行 IP；&lt;/li&gt;&#xA;&lt;li&gt;对&amp;quot;只增不清理&amp;quot;的数据（数据库、日志、内容库）统一设容量阈值告警，让慢性病在变成急症之前被看见。&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;ldquo;静默腐化&amp;rdquo;：没有崩溃、没有告警、没有报警邮件，系统只是每天比昨天慢一点，直到越过某个阈值，以&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/2ebdb79b/&#34; &gt;堵住 journald 日志风暴：一次根分区写满的定位与根治&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;磁盘 df 与 du 不一致：inode 耗尽&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.5772447.xyz/posts/6ed86b02/&#34; &gt;Windows 更新后打印机 Spooler 反复崩溃，全网怎么查？&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item></channel>
</rss>
