<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Oversharding on DK Blog</title><link>/tags/oversharding/</link><description>Recent content in Oversharding on DK Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Mon, 17 Aug 2026 09:00:00 +0800</lastBuildDate><atom:link href="/tags/oversharding/index.xml" rel="self" type="application/rss+xml"/><item><title>Elasticsearch 创建、删除索引慢：快速排查 Runbook</title><link>/dkblog/elasticsearch-index-operation-slow-runbook/</link><pubDate>Mon, 17 Aug 2026 09:00:00 +0800</pubDate><guid>/dkblog/elasticsearch-index-operation-slow-runbook/</guid><description>&lt;img src="https://images.unsplash.com/photo-1558494949-ef010cbdcc31?auto=format&amp;fit=crop&amp;w=900&amp;q=60" alt="Featured image of post Elasticsearch 创建、删除索引慢：快速排查 Runbook" /&gt;&lt;h1 id="elasticsearch-创建删除索引慢快速排查-runbook"&gt;&lt;a href="#elasticsearch-%e5%88%9b%e5%bb%ba%e5%88%a0%e9%99%a4%e7%b4%a2%e5%bc%95%e6%85%a2%e5%bf%ab%e9%80%9f%e6%8e%92%e6%9f%a5-runbook" class="header-anchor"&gt;&lt;/a&gt;Elasticsearch 创建、删除索引慢：快速排查 Runbook
&lt;/h1&gt;&lt;p&gt;&lt;code&gt;PUT /&amp;lt;index&amp;gt;&lt;/code&gt;、&lt;code&gt;DELETE /&amp;lt;index&amp;gt;&lt;/code&gt;、ILM rollover 和 mapping 更新一起变慢时，我通常不会先看某个索引有多大。这几类操作都要修改 cluster state，也都要经过 master。先查它们共用的这段链路，往往比盯着单个索引更快。&lt;/p&gt;
&lt;p&gt;下面是一套偏现场排障的检查顺序。先用只读命令判断问题大致落在哪一类，再继续深挖：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cluster state 更新积压或 master 节点压力；&lt;/li&gt;
&lt;li&gt;index、shard 总量过高，也就是 oversharding；&lt;/li&gt;
&lt;li&gt;shard allocation 或 recovery 未完成；&lt;/li&gt;
&lt;li&gt;JVM、线程池、磁盘或网络资源拥塞；&lt;/li&gt;
&lt;li&gt;删除请求已经完成，但底层文件和磁盘空间尚未回收。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="为什么这些操作会一起慢"&gt;&lt;a href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e8%bf%99%e4%ba%9b%e6%93%8d%e4%bd%9c%e4%bc%9a%e4%b8%80%e8%b5%b7%e6%85%a2" class="header-anchor"&gt;&lt;/a&gt;为什么这些操作会一起慢
&lt;/h2&gt;&lt;p&gt;创建索引、删除索引、更新 mapping、创建别名和 ILM rollover 都会改集群元数据。当前 master 处理请求、生成新的 cluster state，再把它发布给其他节点。元数据变大、更新过密，或者 master 的 CPU、heap、GC 顶不住，最终看到的现象都差不多：几个管理接口一起慢下来。&lt;/p&gt;
&lt;p&gt;创建索引还可能等待 primary shard 变为 active。创建索引响应中的两个字段含义不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;acknowledged&lt;/code&gt; 表示创建索引的 cluster-state 更新已在超时前得到确认；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shards_acknowledged&lt;/code&gt; 表示所需数量的 shard 已在超时前启动。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以，看到 &lt;code&gt;acknowledged: true&lt;/code&gt;、&lt;code&gt;shards_acknowledged: false&lt;/code&gt; 时，先去查 shard allocation 和启动过程。cluster-state 更新本身已经得到确认。&lt;/p&gt;
&lt;p&gt;删除索引也有两个时间点。DELETE API 返回成功，说明 cluster-state 里的删除变更已经得到确认；节点删文件、释放文件句柄，以及存储系统显示出新的可用空间，都可能更晚。现场先问清楚到底是哪一种慢：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DELETE 请求本身很慢：查 master 和 cluster state。&lt;/li&gt;
&lt;li&gt;DELETE 很快返回，但磁盘空间迟迟不下降：查磁盘 I/O、文件句柄、节点状态和存储监控。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="先拆开请求的等待阶段"&gt;&lt;a href="#%e5%85%88%e6%8b%86%e5%bc%80%e8%af%b7%e6%b1%82%e7%9a%84%e7%ad%89%e5%be%85%e9%98%b6%e6%ae%b5" class="header-anchor"&gt;&lt;/a&gt;先拆开请求的等待阶段
&lt;/h3&gt;&lt;p&gt;如果客户端能记录请求耗时，最好同时记录响应体和请求参数。很多管理 API 都有 &lt;code&gt;master_timeout&lt;/code&gt; 和 &lt;code&gt;timeout&lt;/code&gt;：前者控制等待 master 响应的时间，后者通常控制等待 active shard 的时间；具体可用参数仍要以当前版本和具体 API 的文档为准。&lt;/p&gt;
&lt;p&gt;这能提供一个很有用的线索：&lt;code&gt;master_timeout&lt;/code&gt; 经常触发，先查 cluster-state 和 master；cluster-state 很快确认，但 &lt;code&gt;timeout&lt;/code&gt; 或 &lt;code&gt;shards_acknowledged&lt;/code&gt; 迟迟不满足，先查 allocation、recovery 和磁盘。客户端自己的 HTTP 超时只能说明调用方放弃等待，不能说明 Elasticsearch 已经停止处理请求。&lt;/p&gt;
&lt;h2 id="排查前的采集原则"&gt;&lt;a href="#%e6%8e%92%e6%9f%a5%e5%89%8d%e7%9a%84%e9%87%87%e9%9b%86%e5%8e%9f%e5%88%99" class="header-anchor"&gt;&lt;/a&gt;排查前的采集原则
&lt;/h2&gt;&lt;p&gt;下面的命令都不会修改集群。&lt;code&gt;_cluster/allocation/explain&lt;/code&gt; 虽然使用 &lt;code&gt;POST&lt;/code&gt;，但只解释分配决策，不会执行 reroute。&lt;/p&gt;
&lt;p&gt;最好趁慢请求还在发生时采一次，过 30～60 秒再采一遍。线程池 rejected、GC 次数、I/O 字节数有不少是累计值，一张快照看不出它们是否还在增长。顺手记下这些现场信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;请求开始时间、结束时间和客户端超时时间；&lt;/li&gt;
&lt;li&gt;请求响应体，尤其是 &lt;code&gt;acknowledged&lt;/code&gt;、&lt;code&gt;shards_acknowledged&lt;/code&gt; 和错误信息；&lt;/li&gt;
&lt;li&gt;Elasticsearch 版本、目标索引名和操作类型；&lt;/li&gt;
&lt;li&gt;同时段是否发生部署、批量建索引、ILM rollover、恢复、快照或节点重启。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不同 Elasticsearch 版本支持的 CAT 列略有差异。遇到列名报错，直接用 &lt;code&gt;?help&lt;/code&gt; 查当前版本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-http" data-lang="http"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cat/nodes?help
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cat/shards?help
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="第一步确认集群状态和-cluster-state-队列"&gt;&lt;a href="#%e7%ac%ac%e4%b8%80%e6%ad%a5%e7%a1%ae%e8%ae%a4%e9%9b%86%e7%be%a4%e7%8a%b6%e6%80%81%e5%92%8c-cluster-state-%e9%98%9f%e5%88%97" class="header-anchor"&gt;&lt;/a&gt;第一步：确认集群状态和 cluster-state 队列
&lt;/h2&gt;&lt;p&gt;先执行以下四条命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-2"&gt;&lt;a class="lnlinks" href="#hl-1-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-3"&gt;&lt;a class="lnlinks" href="#hl-1-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-4"&gt;&lt;a class="lnlinks" href="#hl-1-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-http" data-lang="http"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cluster/health?level=cluster&amp;amp;timeout=30s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cluster/health?level=shards&amp;amp;timeout=30s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cluster/pending_tasks?local=false&amp;amp;master_timeout=30s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cluster/stats?filter_path=indices.count,indices.shards.*,nodes.count.*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;命令&lt;/th&gt;
					&lt;th&gt;重点字段&lt;/th&gt;
					&lt;th&gt;如何判断&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;_cluster/health&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;status&lt;/code&gt;、&lt;code&gt;initializing_shards&lt;/code&gt;、&lt;code&gt;relocating_shards&lt;/code&gt;、&lt;code&gt;unassigned_shards&lt;/code&gt;、&lt;code&gt;number_of_pending_tasks&lt;/code&gt;、&lt;code&gt;task_max_waiting_in_queue_millis&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;shard 未稳定时进入 allocation/recovery 分支；pending task 数量和最长等待时间持续增加时进入 master 分支&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;_cluster/health?level=shards&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;各 index、shard 的状态&lt;/td&gt;
					&lt;td&gt;用于定位异常 index 和 shard，之后执行 allocation explain&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;_cluster/pending_tasks&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;source&lt;/code&gt;、&lt;code&gt;priority&lt;/code&gt;、&lt;code&gt;time_in_queue_millis&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;create/delete/mapping/shard-started 等任务长时间排队，说明 master 处理 cluster-state 更新跟不上&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;_cluster/stats&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;index 数、primary/total shard 数、节点数&lt;/td&gt;
					&lt;td&gt;index、shard 总量持续增长，管理操作也越来越慢，继续查 oversharding&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;_cluster/pending_tasks&lt;/code&gt; 只列出尚未执行的 cluster-state 更新任务，和 &lt;code&gt;_tasks&lt;/code&gt; 不是一回事。空列表只代表采样那一刻没有任务排队。任务可能刚处理完，也可能慢在发布阶段，所以还得对照前后两次采样和请求时间。&lt;/p&gt;
&lt;h2 id="第二步检查-indexshard-规模与分布"&gt;&lt;a href="#%e7%ac%ac%e4%ba%8c%e6%ad%a5%e6%a3%80%e6%9f%a5-indexshard-%e8%a7%84%e6%a8%a1%e4%b8%8e%e5%88%86%e5%b8%83" class="header-anchor"&gt;&lt;/a&gt;第二步：检查 index、shard 规模与分布
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-2"&gt;&lt;a class="lnlinks" href="#hl-2-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-3"&gt;&lt;a class="lnlinks" href="#hl-2-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-http" data-lang="http"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cat/indices?v=true&amp;amp;h=health,status,index,pri,rep,docs.count,store.size,pri.store.size&amp;amp;s=pri.store.size:desc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cat/shards?v=true&amp;amp;h=index,shard,prirep,state,store,node&amp;amp;s=state,index,shard,prirep
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cat/allocation?v=true&amp;amp;h=node,shards,disk.indices,disk.used,disk.avail,disk.percent
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="_catindices是否存在大量小索引小-shard"&gt;&lt;a href="#_catindices%e6%98%af%e5%90%a6%e5%ad%98%e5%9c%a8%e5%a4%a7%e9%87%8f%e5%b0%8f%e7%b4%a2%e5%bc%95%e5%b0%8f-shard" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;_cat/indices&lt;/code&gt;：是否存在大量小索引、小 shard
&lt;/h3&gt;&lt;p&gt;先看 &lt;code&gt;pri&lt;/code&gt;、&lt;code&gt;rep&lt;/code&gt; 和 &lt;code&gt;pri.store.size&lt;/code&gt;。单个索引的平均 primary shard 大小可以粗略算成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;平均 primary shard 大小 ≈ pri.store.size / pri
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;有些集群数据总量并不夸张，却堆了成千上万个几十 MB、几百 MB 的小索引，每个索引还带多个 primary 和 replica。元数据、segment、文件句柄以及每个 shard 的固定开销就这样累积起来了。这正是常见的 oversharding。&lt;/p&gt;
&lt;h3 id="_catshards是否有大量-shard-正在移动或等待"&gt;&lt;a href="#_catshards%e6%98%af%e5%90%a6%e6%9c%89%e5%a4%a7%e9%87%8f-shard-%e6%ad%a3%e5%9c%a8%e7%a7%bb%e5%8a%a8%e6%88%96%e7%ad%89%e5%be%85" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;_cat/shards&lt;/code&gt;：是否有大量 shard 正在移动或等待
&lt;/h3&gt;&lt;p&gt;关注 &lt;code&gt;state&lt;/code&gt; 和 &lt;code&gt;node&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大量 &lt;code&gt;INITIALIZING&lt;/code&gt;：shard 正在启动或恢复；&lt;/li&gt;
&lt;li&gt;大量 &lt;code&gt;RELOCATING&lt;/code&gt;：集群正在搬迁数据；&lt;/li&gt;
&lt;li&gt;存在 &lt;code&gt;UNASSIGNED&lt;/code&gt;：需要用 allocation explain 查明原因；&lt;/li&gt;
&lt;li&gt;shard 明显集中在少数节点：检查节点角色、allocation filter 和磁盘水位。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="_catallocation节点是否接近磁盘水位线"&gt;&lt;a href="#_catallocation%e8%8a%82%e7%82%b9%e6%98%af%e5%90%a6%e6%8e%a5%e8%bf%91%e7%a3%81%e7%9b%98%e6%b0%b4%e4%bd%8d%e7%ba%bf" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;_cat/allocation&lt;/code&gt;：节点是否接近磁盘水位线
&lt;/h3&gt;&lt;p&gt;对比各节点的 shard 数、&lt;code&gt;disk.avail&lt;/code&gt; 和 &lt;code&gt;disk.percent&lt;/code&gt;。磁盘接近 low、high 或 flood-stage watermark 时，Elasticsearch 会限制分配，严重时还可能对索引施加只读保护。磁盘使用不均也可能让少数节点先触发限制，从而拖慢整个集群的 shard 稳定过程。&lt;/p&gt;
&lt;p&gt;“每个节点最多放多少 shard”没有一个放之四海皆准的数字。节点规格、heap、数据模型、segment 数、写入模式和 Elasticsearch 版本都会影响结果。下面这组现象同时出现时，判断才比较站得住：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-4-1"&gt;&lt;a class="lnlinks" href="#hl-4-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-2"&gt;&lt;a class="lnlinks" href="#hl-4-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-3"&gt;&lt;a class="lnlinks" href="#hl-4-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-4"&gt;&lt;a class="lnlinks" href="#hl-4-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;index/shard 总量持续上升
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; + cluster-state 任务等待时间上升
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; + master CPU、heap 或 GC 恶化
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; + 创建、删除、rollover、mapping 更新同步变慢
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="第三步检查-masterjvm-和运行中任务"&gt;&lt;a href="#%e7%ac%ac%e4%b8%89%e6%ad%a5%e6%a3%80%e6%9f%a5-masterjvm-%e5%92%8c%e8%bf%90%e8%a1%8c%e4%b8%ad%e4%bb%bb%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;第三步：检查 master、JVM 和运行中任务
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-5-2"&gt;&lt;a class="lnlinks" href="#hl-5-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-5-3"&gt;&lt;a class="lnlinks" href="#hl-5-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-5-4"&gt;&lt;a class="lnlinks" href="#hl-5-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-http" data-lang="http"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cat/nodes?v=true&amp;amp;h=name,master,node.role,heap.percent,ram.percent,cpu,load_1m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_nodes/stats/discovery,jvm?filter_path=nodes.*.name,nodes.*.roles,nodes.*.jvm.mem,nodes.*.jvm.gc,nodes.*.discovery
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_tasks?detailed=true&amp;amp;group_by=parents&amp;amp;actions=cluster:*,indices:admin/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_nodes/hot_threads?threads=10&amp;amp;interval=500ms
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="先找到当前-master"&gt;&lt;a href="#%e5%85%88%e6%89%be%e5%88%b0%e5%bd%93%e5%89%8d-master" class="header-anchor"&gt;&lt;/a&gt;先找到当前 master
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;_cat/nodes&lt;/code&gt; 的 &lt;code&gt;master&lt;/code&gt; 列里，&lt;code&gt;*&lt;/code&gt; 通常就是当前 master。把它的 CPU、load 和 heap 与其他节点放在一起看。若只有 master 长时间高负载，pending tasks 又多是 create、delete、mapping、shard-started，基本可以沿 cluster coordination 这条线继续查。&lt;/p&gt;
&lt;p&gt;某一刻的 &lt;code&gt;heap.percent&lt;/code&gt; 很高，说明不了太多。把 &lt;code&gt;_nodes/stats&lt;/code&gt; 里的 GC 次数和耗时做前后对比，再看下面几种情况是否出现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;old GC 频繁且耗时明显增长；&lt;/li&gt;
&lt;li&gt;heap 回收后仍长期处于高位；&lt;/li&gt;
&lt;li&gt;master 的 CPU 与 pending task 等待时间同步上升；&lt;/li&gt;
&lt;li&gt;版本支持时，cluster-state publish 相关统计出现明显延迟。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="用-_tasks-补充-pending-tasks"&gt;&lt;a href="#%e7%94%a8-_tasks-%e8%a1%a5%e5%85%85-pending-tasks" class="header-anchor"&gt;&lt;/a&gt;用 &lt;code&gt;_tasks&lt;/code&gt; 补充 pending tasks
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;_tasks&lt;/code&gt; 能看到还在运行的快照、reindex 和管理任务，正好补上 &lt;code&gt;_cluster/pending_tasks&lt;/code&gt; 看不到的部分。查询时限制 &lt;code&gt;actions&lt;/code&gt;；大型集群上直接拉全部任务，响应本身就可能很大。&lt;/p&gt;
&lt;h3 id="用-hot-threads-看-cpu-花在哪里"&gt;&lt;a href="#%e7%94%a8-hot-threads-%e7%9c%8b-cpu-%e8%8a%b1%e5%9c%a8%e5%93%aa%e9%87%8c" class="header-anchor"&gt;&lt;/a&gt;用 hot threads 看 CPU 花在哪里
&lt;/h3&gt;&lt;p&gt;如果 CPU 持续偏高，再采集 hot threads：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MasterService&lt;/code&gt;、cluster coordination 或 cluster-state publish 相关栈占比高，继续沿 master/元数据方向排查；&lt;/li&gt;
&lt;li&gt;Lucene merge、&lt;code&gt;IndexWriter&lt;/code&gt;、refresh 或 flush 相关栈占比高，继续检查写入放大和磁盘；&lt;/li&gt;
&lt;li&gt;GC 相关线程频繁出现，结合 GC 日志和 heap 使用确认是否存在内存压力。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;完整的 &lt;code&gt;GET /_cluster/state/metadata&lt;/code&gt; 不适合当常规排查命令。索引多、mapping 大时，响应会很重。确实要看元数据，就限定到一个索引，再用 &lt;code&gt;filter_path&lt;/code&gt; 裁掉无关字段。&lt;/p&gt;
&lt;h2 id="第四步检查-shard-allocation-与-recovery"&gt;&lt;a href="#%e7%ac%ac%e5%9b%9b%e6%ad%a5%e6%a3%80%e6%9f%a5-shard-allocation-%e4%b8%8e-recovery" class="header-anchor"&gt;&lt;/a&gt;第四步：检查 shard allocation 与 recovery
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-6-1"&gt;&lt;a class="lnlinks" href="#hl-6-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-http" data-lang="http"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cat/recovery?v=true&amp;amp;active_only=true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;_cluster/allocation/explain&lt;/code&gt; 需要指定一个目标 shard。不要发送没有 index 和 shard 的裸请求。定位到异常 shard 后，显式指定目标：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-7-1"&gt;&lt;a class="lnlinks" href="#hl-7-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-2"&gt;&lt;a class="lnlinks" href="#hl-7-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-3"&gt;&lt;a class="lnlinks" href="#hl-7-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-4"&gt;&lt;a class="lnlinks" href="#hl-7-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-5"&gt;&lt;a class="lnlinks" href="#hl-7-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-6"&gt;&lt;a class="lnlinks" href="#hl-7-6"&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-http" data-lang="http"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;POST /_cluster/allocation/explain
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; &amp;#34;index&amp;#34;: &amp;#34;&amp;lt;index&amp;gt;&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; &amp;#34;shard&amp;#34;: 0,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; &amp;#34;primary&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;_cat/recovery&lt;/code&gt; 会给出恢复阶段、传输字节、文件数、进度和耗时。大量 recovery 同时跑，或者进度长时间不动，就去看磁盘吞吐、网络、源节点负载和 shard 大小。&lt;/p&gt;
&lt;p&gt;allocation explain 里每个 decider 都会写明同意或拒绝的原因。现场常见的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;节点磁盘超过 watermark；&lt;/li&gt;
&lt;li&gt;index 或 cluster allocation filter 排除了可用节点；&lt;/li&gt;
&lt;li&gt;data tier、节点角色或 awareness 属性不匹配；&lt;/li&gt;
&lt;li&gt;同一 shard 的副本不能与 primary 分配到同一节点；&lt;/li&gt;
&lt;li&gt;可用节点或容量不足；&lt;/li&gt;
&lt;li&gt;allocation 被临时关闭或延迟。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;看到 &lt;code&gt;UNASSIGNED&lt;/code&gt; 先别急着 reroute。若 decider 拒绝分配的根因还在，强制操作只会盖住容量问题，有时还会把数据置于风险中。&lt;/p&gt;
&lt;h2 id="第五步检查线程池磁盘和后台负载"&gt;&lt;a href="#%e7%ac%ac%e4%ba%94%e6%ad%a5%e6%a3%80%e6%9f%a5%e7%ba%bf%e7%a8%8b%e6%b1%a0%e7%a3%81%e7%9b%98%e5%92%8c%e5%90%8e%e5%8f%b0%e8%b4%9f%e8%bd%bd" class="header-anchor"&gt;&lt;/a&gt;第五步：检查线程池、磁盘和后台负载
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-8-1"&gt;&lt;a class="lnlinks" href="#hl-8-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-8-2"&gt;&lt;a class="lnlinks" href="#hl-8-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-http" data-lang="http"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cat/thread_pool?v=true&amp;amp;h=node_name,name,active,queue,rejected,completed
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_nodes/stats/jvm,fs,thread_pool,indices?filter_path=nodes.*.name,nodes.*.jvm,nodes.*.fs.io_stats,nodes.*.thread_pool,nodes.*.indices.merges,nodes.*.indices.segments,nodes.*.indices.indexing,nodes.*.indices.refresh,nodes.*.indices.flush
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;把两次采样放在一起比较：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;queue&lt;/code&gt; 长期不下降，表示任务进入速度超过处理速度；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rejected&lt;/code&gt; 持续增长，表示对应线程池已经无法接收更多任务；&lt;/li&gt;
&lt;li&gt;merge 的累计时间、字节数快速增长，可能存在显著写入或 merge 压力；&lt;/li&gt;
&lt;li&gt;segment 数量异常多，可能放大 heap、文件句柄和 merge 开销；&lt;/li&gt;
&lt;li&gt;refresh、flush 或 indexing 指标短时间快速增加，需要与业务流量核对。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;fs.io_stats&lt;/code&gt; 也是累计计数，不能拿它单独证明磁盘延迟高。主机或云盘监控至少还要看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU iowait；&lt;/li&gt;
&lt;li&gt;read/write latency；&lt;/li&gt;
&lt;li&gt;queue depth；&lt;/li&gt;
&lt;li&gt;disk utilization；&lt;/li&gt;
&lt;li&gt;可用空间和 inode；&lt;/li&gt;
&lt;li&gt;节点间网络延迟、丢包和吞吐。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果 DELETE 已经 ack，空间却没回来，检查 Elasticsearch 进程是否还持有已删除文件、节点是否健康，以及底层存储或容器文件系统的统计有没有延迟。这个场景继续盯 pending tasks 通常收获不大。&lt;/p&gt;
&lt;h2 id="快速决策树"&gt;&lt;a href="#%e5%bf%ab%e9%80%9f%e5%86%b3%e7%ad%96%e6%a0%91" class="header-anchor"&gt;&lt;/a&gt;快速决策树
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-9-1"&gt;&lt;a class="lnlinks" href="#hl-9-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-2"&gt;&lt;a class="lnlinks" href="#hl-9-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-3"&gt;&lt;a class="lnlinks" href="#hl-9-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-4"&gt;&lt;a class="lnlinks" href="#hl-9-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-5"&gt;&lt;a class="lnlinks" href="#hl-9-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-6"&gt;&lt;a class="lnlinks" href="#hl-9-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-7"&gt;&lt;a class="lnlinks" href="#hl-9-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-8"&gt;&lt;a class="lnlinks" href="#hl-9-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-9"&gt;&lt;a class="lnlinks" href="#hl-9-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-10"&gt;&lt;a class="lnlinks" href="#hl-9-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-11"&gt;&lt;a class="lnlinks" href="#hl-9-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-12"&gt;&lt;a class="lnlinks" href="#hl-9-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-13"&gt;&lt;a class="lnlinks" href="#hl-9-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-14"&gt;&lt;a class="lnlinks" href="#hl-9-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-15"&gt;&lt;a class="lnlinks" href="#hl-9-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PUT / DELETE / ILM rollover / mapping update 都慢
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-- pending_tasks 多且等待时间持续增长
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| `-- Master / cluster-state
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| `-- 查 master CPU、heap/GC、index/shard 总量和元数据规模
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-- INITIALIZING / RELOCATING / UNASSIGNED 较多
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| `-- Allocation / recovery
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| `-- 查 recovery、allocation explain、磁盘水位和网络
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-- DELETE 已 ack，但空间迟迟未回收
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| `-- 磁盘 I/O、打开文件、节点状态或底层存储空间统计
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;`-- 上述均无明显异常
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; `-- 查 JVM、线程池、hot threads、OS 磁盘、CPU 和同期后台任务
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这棵树不是互斥选项。比如 recovery 产生的大量 &lt;code&gt;shard-started&lt;/code&gt; 任务，既会让 pending tasks 增长，也会让 shard 长时间处于 &lt;code&gt;INITIALIZING&lt;/code&gt;。两种信号同时出现时，先查能解释更多现象的那条线，同时保留另一条线的采样结果。&lt;/p&gt;
&lt;h2 id="五条命令完成第一轮分流"&gt;&lt;a href="#%e4%ba%94%e6%9d%a1%e5%91%bd%e4%bb%a4%e5%ae%8c%e6%88%90%e7%ac%ac%e4%b8%80%e8%bd%ae%e5%88%86%e6%b5%81" class="header-anchor"&gt;&lt;/a&gt;五条命令完成第一轮分流
&lt;/h2&gt;&lt;p&gt;时间紧张时，先采集下面五条：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt" id="hl-10-1"&gt;&lt;a class="lnlinks" href="#hl-10-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-2"&gt;&lt;a class="lnlinks" href="#hl-10-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-3"&gt;&lt;a class="lnlinks" href="#hl-10-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-4"&gt;&lt;a class="lnlinks" href="#hl-10-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-5"&gt;&lt;a class="lnlinks" href="#hl-10-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-http" data-lang="http"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cluster/health?level=cluster&amp;amp;timeout=30s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cluster/pending_tasks?local=false&amp;amp;master_timeout=30s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cluster/stats?filter_path=indices.count,indices.shards.*,nodes.count.*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cat/indices?v=true&amp;amp;h=index,pri,rep,store.size,pri.store.size
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;GET /_cat/allocation?v=true&amp;amp;h=node,shards,disk.used,disk.avail,disk.percent
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这五条跑完，第一轮方向通常就有了：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;观察结果&lt;/th&gt;
					&lt;th&gt;优先方向&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;pending tasks 等待长，index/shard 总量高&lt;/td&gt;
					&lt;td&gt;cluster-state、master、oversharding&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;initializing、relocating、unassigned shard 多&lt;/td&gt;
					&lt;td&gt;allocation、recovery&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;少数节点磁盘高、shard 分布不均&lt;/td&gt;
					&lt;td&gt;disk watermark、allocation rule、节点容量&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;上述基本正常&lt;/td&gt;
					&lt;td&gt;JVM、线程池、hot threads、OS 与同期任务&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="几个容易走偏的地方"&gt;&lt;a href="#%e5%87%a0%e4%b8%aa%e5%ae%b9%e6%98%93%e8%b5%b0%e5%81%8f%e7%9a%84%e5%9c%b0%e6%96%b9" class="header-anchor"&gt;&lt;/a&gt;几个容易走偏的地方
&lt;/h2&gt;&lt;h3 id="先入为主地怪罪大索引"&gt;&lt;a href="#%e5%85%88%e5%85%a5%e4%b8%ba%e4%b8%bb%e5%9c%b0%e6%80%aa%e7%bd%aa%e5%a4%a7%e7%b4%a2%e5%bc%95" class="header-anchor"&gt;&lt;/a&gt;先入为主地怪罪大索引
&lt;/h3&gt;&lt;p&gt;新建空索引时还没有业务数据。多个管理操作一起慢，先看它们共用的 cluster-state 和 master 路径。大 shard 确实麻烦，但影响更常出现在 recovery、relocation、merge 和节点重启恢复时。&lt;/p&gt;
&lt;h3 id="把一次空的-pending-tasks-当作结论"&gt;&lt;a href="#%e6%8a%8a%e4%b8%80%e6%ac%a1%e7%a9%ba%e7%9a%84-pending-tasks-%e5%bd%93%e4%bd%9c%e7%bb%93%e8%ae%ba" class="header-anchor"&gt;&lt;/a&gt;把一次空的 pending tasks 当作结论
&lt;/h3&gt;&lt;p&gt;pending tasks 是瞬时视图。任务可能刚处理完，也可能卡在 cluster-state 发布或节点确认阶段。要把前后两次采样与 master 资源、真实请求耗时对上，才能判断。&lt;/p&gt;
&lt;h3 id="认为-delete-成功后磁盘必须立刻下降"&gt;&lt;a href="#%e8%ae%a4%e4%b8%ba-delete-%e6%88%90%e5%8a%9f%e5%90%8e%e7%a3%81%e7%9b%98%e5%bf%85%e9%a1%bb%e7%ab%8b%e5%88%bb%e4%b8%8b%e9%99%8d" class="header-anchor"&gt;&lt;/a&gt;认为 DELETE 成功后磁盘必须立刻下降
&lt;/h3&gt;&lt;p&gt;API 确认和物理空间可见是两个时间点。文件句柄、底层文件系统、存储平台统计和节点 I/O 都可能影响空间回收的可见时间。&lt;/p&gt;
&lt;h3 id="一看到-shard-多就改集群配置"&gt;&lt;a href="#%e4%b8%80%e7%9c%8b%e5%88%b0-shard-%e5%a4%9a%e5%b0%b1%e6%94%b9%e9%9b%86%e7%be%a4%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;一看到 shard 多就改集群配置
&lt;/h3&gt;&lt;p&gt;删除索引、降低副本、关闭 allocation、强制 reroute 都会影响业务。先确认根因，再做容量评估、数据保留确认和变更审批。&lt;/p&gt;
&lt;h2 id="查到原因之后"&gt;&lt;a href="#%e6%9f%a5%e5%88%b0%e5%8e%9f%e5%9b%a0%e4%b9%8b%e5%90%8e" class="header-anchor"&gt;&lt;/a&gt;查到原因之后
&lt;/h2&gt;&lt;p&gt;方向确认后，可以暂停非必要的批量建索引，把 rollover 或 recovery 错开，必要时压低同期写入峰值。这些动作能争取处理时间，不能代替后续治理。&lt;/p&gt;
&lt;p&gt;后续可以从这些地方下手：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;合并过细的时间索引，按真实数据量设计 rollover 条件；&lt;/li&gt;
&lt;li&gt;用 index template 统一合理的 primary 和 replica 数；&lt;/li&gt;
&lt;li&gt;定期统计 index、shard、segment 和 mapping 字段数量的增长趋势；&lt;/li&gt;
&lt;li&gt;为 master-eligible 节点保留稳定的 CPU、heap 和网络资源；&lt;/li&gt;
&lt;li&gt;为 cluster operation latency、pending task 最大等待时间、unassigned shard 和磁盘水位建立告警；&lt;/li&gt;
&lt;li&gt;在扩容或版本升级前，用真实 mapping、shard 数和变更频率进行容量验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="我实际使用的排查顺序"&gt;&lt;a href="#%e6%88%91%e5%ae%9e%e9%99%85%e4%bd%bf%e7%94%a8%e7%9a%84%e6%8e%92%e6%9f%a5%e9%a1%ba%e5%ba%8f" class="header-anchor"&gt;&lt;/a&gt;我实际使用的排查顺序
&lt;/h2&gt;&lt;p&gt;现场排查时，我会按这条顺序走：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用 cluster health 和 pending tasks 判断 cluster-state 是否积压；&lt;/li&gt;
&lt;li&gt;用 cluster stats、indices 和 shards 判断是否 oversharding；&lt;/li&gt;
&lt;li&gt;用 master JVM、tasks 和 hot threads 确认协调节点压力；&lt;/li&gt;
&lt;li&gt;用 recovery 和 allocation explain 定位 shard 无法稳定的原因；&lt;/li&gt;
&lt;li&gt;用双时点线程池、I/O 与主机监控判断底层资源瓶颈。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;shard 数量、某一刻的 heap，或者单条 API 的 ack，都不能独立证明根因。先把前后两次采样对起来，确定问题落在 cluster-state/master、oversharding、allocation/recovery 还是 disk/OS，再动配置。&lt;/p&gt;</description></item></channel></rss>