SkyWalking 第三次积压超 3 亿:分片又小又匀,却只有一台机在扛
SkyWalking 第三次积压超 3 亿分片又小又匀却只有一台机在扛 摘要SkyWalking 第三次积压超 3 亿条三台 ES 只有一台 CPU 98%、磁盘读 180MB/s。上次是单分片 20GB 段合并热点这次分片又小又匀36 片×2.2GB却照样单机爆。pidstat merge stats free 三连追到根因OAP 与 ES 同机部署挤干 page cache合并被迫读物理盘。OAP 迁走后 page cache 回归积压 7 分钟清空。本系列第三集。第一集我们把 Kafka 分区倾斜治好了key 改 null数据均匀落 12 分区。第二集分区均匀了还积压凶手是 ES 单分片 20GB 的段合并热点DAY_STEP5→1单片降到 4.6GB 收工。我以为「分片」这个坑已经填平了。结果这次监控又红了积压突破 3 亿而且这次分片又小又匀——每天 36 个分片、每片才 2.2GB教科书级别的健康。分区匀了、分片也匀了、还是只有一台机在冒烟——这一集凶手藏得比前两集都深。前置阅读本篇是「SkyWalking 积压」三部曲的第三集强烈建议先看第二集 《SkyWalking 日志又积压 1900 万Kafka 分区明明均匀了凶手却藏在 ES 段合并里》本篇很多排查手法hot_threads、_cat/shards、磁盘读定位和「热点轮动≠数据倾斜」的结论会直接复用。第一集是 《SkyWalking 消费积压 6 亿条Kafka 分区倾斜的深度复盘》。一、问题现象分片又小又匀却又积压了7 月 13 日下午给某高 QPS 业务服务放开了全量链路采样。第二天清晨 5 点 40 左右SkyWalking 的 Kafka 消费组开始积压核心 topic 是skywalking-segments积压一路涨到3.13 亿条生产 13.7k/s、消费只有 7.5k/s——产 消越堆越高。体感还是熟悉的配方链路查询延迟、查不到最新 trace。打开资源大盘第一直觉又是那个熟悉的画面——只有一台机sw2在忙sw2CPU 98%、负载 158 核、内存 84.7%sw3 / sw4CPU 10%闲得发慌。于是我几乎要条件反射地下结论「跟上次一样又是段合并热点卡在一台机上吧。」——但这次这个结论是错的。这一集最大的教训就是别让上次的经验直接给这次下结论。二、先证伪这次真不是「大分片段合并」上次的根因是单分片 20GB、合并一次就是巨型读。所以这次我先拉分片想复现「大分片」——结果GET /_cat/shards?v打脸了集群完全均衡而且分片又小又匀。# GET /_cat/shards?v | grep sw_segment-20260714 # 36 主分片 / 0 副本12/12/12 均分三节点每片 2.2GB / ~914 万 doc index shard prirep state docs store ip node sw_segment-20260714 5 p STARTED 9139059 2.2gb 172.31.18.52 es02 sw_segment-20260714 16 p STARTED 9136695 2.2gb 172.31.19.98 es03 sw_segment-20260714 3 p STARTED 9140112 2.2gb 172.31.20.45 es01 ...36 片全部 2.2GB / 913~914 万 doc完全一致维度实测三节点总容量es01 823.7G / es02 818.1G / es03 819.1G几乎相等分片数687 / 688 / 687均匀当日sw_segment-20260714索引36 主分片、0 副本每节点 12/12/12 均分单分片每片2.2GB、约 914 万 doc几乎一模一样全局最大分片仅 4.5GBsw_log根本没有大分片第二集的DAY_STEP治理是有效的——分片已经被拆得又小又匀了。这里要停下来做一次关键的逻辑推理分片、doc 完全均匀 → 三台 ES 的合并工作量是一样的。既然合并量一样「只有 sw2 忙、另两台 10%」就不可能是 ES 索引 / 合并本身造成的——否则三台该一起忙。真凶必然是某个「天生只在一台机上」的东西。三、排查现场时间线把「稳态」和「单机阻塞」区分开只看一个瞬间的快照容易被误导。我把两条曲线叠在一起看——ES 机器 CPU和Kafka 积压sw3 / sw4从早上 5 点多起 CPU 一直趴着直到下午 14 点才突然忙起来Kafkaskywalking-segments5 点 30 分开始积压14 点开始下降。两条曲线的拐点严丝合缝。这说明问题不是稳态的负载分布不均而是 5:30 ~ 14:00 这段时间内 sw2 上有东西把整条消费管道卡死了——下游的 sw3/sw4 被饿着根本没活干一旦这个阻塞解除两台立刻有活、积压掉头。这一步很重要单机热 时间窗口 单机阻塞而不是这台机天生就该更忙。方向一下子就聚焦了。四、定位真凶不是 CPU是「磁盘读」被单机打满既然是 sw2 上的阻塞就得看 sw2 到底卡在哪个资源。我差点又只盯着 CPU——幸好扫了一眼磁盘列答案在那里机器IOutil磁盘读取磁盘写入sw285.0%102.9 MiB/s27.3 MiB/ssw310.6%4.3 KiB/s10.3 MiB/ssw47.5%390.4 KiB/s11.0 MiB/ssw2 磁盘读 102.9 MiB/ssw3 只有 4.3 KiB/s——差了 2 万多倍。而且 sw2 是读 写。瓶颈不是 CPU是sw2 的磁盘被海量读打满。说明102.9 MiB/s是资源大盘的一次采样读带宽在整段时间里一直在75~180 MB/s之间跳下面pidstat抓到的180 MB/s就是同一现象的峰值时刻——不是两个矛盾的数是同一块盘不同瞬间的读速。那读盘的到底是谁sw2 上同时跑着 OAPSkyWalking 的后端分析进程从 Kafka 消费 segment、算指标再写 ES和 ES得抓现行。[rootsw2-172-31-18-52 ~]# pidstat -d 206:46:44UIDPID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command 06:46:5410003514990180226.0065462.0014796.000java← es02读180MB/s峰值 06:46:54014307060.006.000.000java← OAP读0那个飙到180 MB/s 读的 javaPID 3514990uid 1000 es02才是罪魁。OAP 是从 Kafka 走网络读、不碰本地盘能对本地磁盘打出 100 MB/s 顺序读的只有ESes02在读它自己的段文件。再确认 es02 在干嘛 ——GET /_nodes/es02/stats/indices/mergemerges:{current:4,// 4 个活跃合并在跑current_docs:4163677,current_size_in_bytes:2694651739// 当前正在合并 2.7GB}读 ≫ 写 活跃 merge ——就是段合并在读旧段。到这儿你的直觉一半对了确实是合并在读盘、卡在一台机上。但问题来了——分片均匀意味着三台合并量一样凭什么只有 es02 读爆盘先看写入侧有没有线索。拉一下 write 线程池# GET /_cat/thread_pool/write?v node_name name active queue rejected es03 write 0 0 0 es02 write 8 245 0 ← es02 写入队列堆了 245 个请求 es01 write 0 0 0es02 的 write 线程池 active8、queue245其他两个节点全是 0。写入被堵在 es02 上了——磁盘读爆导致写入吞吐见顶请求在队列里排长队。五、根因合并量三台都一样凭什么只有 sw2 读爆盘写入队列堆了 245 个请求说明 es02 的写入吞吐被什么东西卡死了——而磁盘读 180 MB/s 就是那个什么。但还有一个更大的疑问没解分片均匀意味着三台合并量一样为什么偏偏是 sw2 在读盘读到爆先看这台机上跑了什么 ——docker stats --no-stream[rootsw2-172-31-18-52 ~]# docker stats --no-streamNAME CPU % MEM USAGE / LIMIT MEM % BLOCK I/O skywalking-oap-server400.24%2.649GiB /15.24GiB17.37%20.3GB / 497MB ← OAP 单实例只在 sw2 es02314.76%9.785GiB /15.24GiB64.19% 616TB / 126TB ← ES 数据节点同机sw2 上OAP es02 挤在一起内存吃到 84.7%另两台只有 66~68%因为它们没有 OAP。再看一下迁走前的free -g[rootsw2-172-31-18-52 ~]# free -g # OAP 迁走前total usedfreeshared buff/cache available Mem:15130021Swap:000buff/cache 只有 2Gavailable 只剩 1G——page cache 几乎被榨干。答案就藏在这 2.6GB 的 OAP 上差别不在「合并多少」在「合并时读内存还是读磁盘」。sw3 / sw4没有 OAP剩大把page cache。刚写下去的段还在内存里合并直接从 page cache 读 → 磁盘几乎不动KB/s。sw2OAP(2.6G) es02 堆(8G) 把 16G 内存挤干几乎不剩 page cache。同样的段合并时早被挤出内存了 → 只能从物理磁盘读→ 180 MB/s、IOutil 打满。同一份合并工作量sw3/sw4 命中内存、sw2 被迫读盘。这就是「一台爆、两台闲」的最终答案不是合并偏心 sw2是 OAP 偷走了 sw2 的 page cache让 sw2 独自把「本该在内存完成的合并」拖成了磁盘 IO 灾难。完整因果链放开某业务全量采样 → 段量 ×3日增 42G → 104~115G→ 三台 ES 合并压力同步 ×3均摊 │ ▼ sw2 OAP(2.6G) es02(8G 堆) 挤一台 16G 机 → page cache 被挤干 │ ▼ es02 合并只能读物理盘 75~180MB/s、IOutil 85%sw3/sw4 命中缓存读 KB/s │ ▼ es02 磁盘饱和 → 写入队列堆积write thread pool queue245其他节点 queue0 │ ▼ 同机 OAP 消费被拖住 → 全管道限速到 7.5k/s生产 13.7k/s→ Kafka 积压涨到 3.13 亿 │ ▼ 下游 sw3/sw4 拿不到活 → 闲置到 14:00六、解决方案与验证把 OAP 迁走page cache 一还就好根因既然是「OAP 抢了 ES 的 page cache」解法就非常直接——把 OAP 从 es02 那台机迁到独立机器让 page cache 还给 ES。下午 15:25 完成迁移效果立竿见影三台 ES 消费立即均衡sw3/sw4 的 CPU 提上来了Kafka 积压掉头下降。free -g直接实证 page cache 已经回来了[ec2-usersw2-172-31-18-52 ~]$ free -g total used free shared buff/cache available Mem: 15 9 0 0 5 4 Swap: 0 0 0迁走前 OAPes02 把 16G 吃到 84.7%、cache 几乎为 0迁走后buff/cache 回到 5G合并重新回到内存磁盘 IO 释放。OAP 迁走即恢复反过来钉死了「OAP 挤占 page cache」就是根因。这是复盘里最漂亮的一种收尾改一个变量现象消失因果闭环。七、一个必须说清楚的反问扩分片能不能降合并排查中有人问既然是合并压力把分片数扩大、每片更小不就合并轻了吗不能而且在这个场景里会更糟。原因值得记住合并的总工作量 ≈ 正比于「写入的数据量」跟分片数几乎无关。合并是 Lucene 在每个分片内部做的分层合并同样一天的数据切成 36 片还是 72 片全部分片加起来要合并的总字节数几乎不变。扩分片只是把「几个大合并」拆成「更多小合并并行跑」磁盘要读的总量一样。更要命分片越多越耗内存每个分片有固定的 Lucene 结构 / 段元数据 / FST 开销。sw2 本来就是内存不够才读盘再加分片只会让 page cache 更紧、读盘更多——方向反了。真正能减少合并的旋钮是refresh_interval默认 1s 会生成海量小段、逼着不停合并对链路/日志这种写多读少的数据调到 30s段更少更大、合并次数直接锐减。但这治标治本还是那句话——别让 OAP 和 ES 抢内存。八、举一反三三集下来SkyWalking 积压的「排查地图」三次积压凶手一次比一次深但排查套路是可以沉淀成地图的。下次再遇到积压按这个顺序往下捅层查什么对应集数 / 症状Kafka 生产各分区生产是否均匀第一集分区倾斜key 固定Kafka 消费各分区消费/位移是否均匀、consumer 够不够——ES 写入·分片_cat/shards看分片是否倾斜 / 过大第二集单分片 20GB 段合并热点DAY_STEPES 节点·资源单机 CPU /磁盘读/ IOutilhot_threads看是不是 merge第二、三集merge 读盘打满单机机器·内存docker stats/free有没有别的进程抢 page cache第三集OAP 与 ES 同机抢内存几个反复踩到、值得刻进脑子的经验别用上次的结论给这次下判断——三次都是只有一台机忙但根因分别是分区、分片、内存一次比一次隐蔽。单机热 时间窗口 单机阻塞不是这台天生该忙把资源曲线和积压曲线叠着看拐点会告诉你真相。别只盯 CPU——这次真凶写在磁盘读那一列差点被 CPU 带偏。热点轮动 / 单机热 ≠ 数据倾斜——数据可能是完全均匀的是某个不分摊的东西大 merge、单实例进程、被抢的 page cache造成了单机热。page cache 是隐形资源——ES 靠它吃饭谁跟 ES 抢内存谁就在悄悄削 ES 的性能。OAP 和 ES 数据节点不要同机部署。九、总结一句话收尾前两集的坑在 Kafka 和 ES 的配置里这一集的坑在部署拓扑里——把一个吃内存的 OAP 和一个靠 page cache 吃饭的 ES 塞进同一台机就是给自己埋了一颗只在高峰期引爆的雷。三集治理动作串起来第一集Kafka Agentkey固定 → 改null数据均匀分区第二集super dataset 单分片 20GB →DAY_STEP5→1单片降到 4.6GB合并轻 4~5 倍第三集OAP 与 es02 同机抢 page cache →OAP 迁到独立机器page cache 还给 ES。后续治理采样常态化全量成本极高用完即关、refresh_interval调 30s 减合并、补 Kafka lag 磁盘 IOutil 告警这次闷声跑了近 10 小时才发现。你的 SkyWalking / ES 集群有没有哪个邻居进程正在悄悄偷 page cache欢迎评论区交流。延伸阅读《SkyWalking 日志又积压 1900 万Kafka 分区明明均匀了凶手却藏在 ES 段合并里》 —— 本系列第二集段合并热点与DAY_STEP治理排查手法一脉相承《SkyWalking 消费积压 6 亿条一次 Kafka 分区倾斜的深度复盘》 —— 本系列第一集Kafka 分区倾斜Elasticsearch 官方Segment merging段合并机制Elasticsearch 官方Reduce disk usage / 依赖 page cache 的存储原理SkyWalking 官方Elasticsearch 存储配置superDatasetIndexShardsFactor/superDatasetDayStep️ 标签SkyWalkingElasticsearch消息积压page cache段合并线上排障

相关新闻

RAG检索精准度提升实战:从分块到重排的全链路优化方案

RAG检索精准度提升实战:从分块到重排的全链路优化方案

1. 项目概述:从“找得到”到“找得准”的RAG进化 如果你最近在折腾大模型应用,尤其是想让它基于你自己的知识库回答问题,那“RAG”这个词你肯定不陌生。RAG,检索增强生成,听起来挺高大上,但说白了就两步&am…

2026/8/8 8:02:17 阅读更多 →
【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04

【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04

云计算系统集成型解决方案 学科知识续表(第三十九轮:D1421~D1460 云原生生态中的关键组件与前沿方向,包括:云原生数据库(TiDB/CockroachDB/YugabyteDB)、云原生消息队列(Pulsar/NATS)、云原生配置中心(Consul/Etcd)、云原生注册中心(Nacos/Eureka)、云原生调度(V…

2026/8/8 8:02:17 阅读更多 →
Word域代码全解析:从核心原理到自动化文档实战

Word域代码全解析:从核心原理到自动化文档实战

1. 项目概述:揭开Word域代码的神秘面纱 如果你经常和Word打交道,尤其是处理一些长文档、报告或者需要自动化更新的内容,那你大概率遇到过一些“奇怪”的现象:文档里某个地方的页码总是不对劲,明明删掉了内容但编号还在…

2026/8/8 8:02:17 阅读更多 →

最新新闻

基于FPGA的Game Boy Color硬件复刻:从原理到实践的完整指南

基于FPGA的Game Boy Color硬件复刻:从原理到实践的完整指南

如果你是一位硬件爱好者,或者对复古游戏机改造感兴趣,最近可能被一个词刷屏了: FPGA 。它不再是实验室里高不可攀的芯片,而是正在成为复古硬件复刻和模拟的“终极武器”。今天我们要聊的,就是一个极具代表性的项目—…

2026/8/8 16:43:53 阅读更多 →
免费获取高分辨率转录图谱:ProCapNet本地部署与批量处理教程

免费获取高分辨率转录图谱:ProCapNet本地部署与批量处理教程

LBRY Desktop开发者指南:如何从源码构建和贡献开源项目 【免费下载链接】lbry-desktop A browser and wallet for LBRY, the decentralized, user-controlled content marketplace. 项目地址: https://gitcode.com/gh_mirrors/lb/lbry-desktop LBRY Desktop是…

2026/8/8 16:43:53 阅读更多 →
Python多任务并行处理实战:线程、进程与协程性能优化指南

Python多任务并行处理实战:线程、进程与协程性能优化指南

大家好,我是专注于技术实战分享的博主。在开发后台服务、数据处理脚本或自动化工具时,你是否遇到过这样的场景:需要处理成百上千个独立的任务,比如批量调用API、处理大量文件、或对数据库进行并行查询。如果使用简单的单线程或循环…

2026/8/8 16:43:53 阅读更多 →
OmTrackVLA 0.6B:革命性开源视觉语言行动栈,让机器人导航触手可及

OmTrackVLA 0.6B:革命性开源视觉语言行动栈,让机器人导航触手可及

AppleALC终极指南:如何在macOS上启用原生HD音频支持 【免费下载链接】AppleALC Native macOS HD audio for not officially supported codecs 项目地址: https://gitcode.com/gh_mirrors/ap/AppleALC AppleALC是一款专为macOS系统设计的开源工具,…

2026/8/8 16:43:53 阅读更多 →
Godot4 Tween并行模式避坑指南:从原理到实战的动画时序编排

Godot4 Tween并行模式避坑指南:从原理到实战的动画时序编排

1. 项目概述:为什么Tween并行模式是Godot动画的“双刃剑”? 如果你正在用Godot4做游戏,尤其是涉及到UI动效、角色动作衔接或者场景过渡,那你肯定绕不开Tween这个强大的补间动画系统。它比直接操作 _process 里的delta值要优雅得…

2026/8/8 16:43:53 阅读更多 →
基于FastAPI与SQLAlchemy构建轻量级用户反馈收集与分析系统

基于FastAPI与SQLAlchemy构建轻量级用户反馈收集与分析系统

在实际 AI 工具和开源项目的开发与使用过程中,开发者经常面临一个挑战:如何有效地收集、处理并响应来自社区的反馈,从而驱动产品的持续迭代与优化。这个过程不仅仅是技术实现,更关乎项目生态的健康发展。本文将以一个典型的反馈构…

2026/8/8 16:42:53 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/8 8:58:26 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →