3、基础设施层监控:CPU、内存、磁盘、网络的基础监控指标与告警阈值设置
聊到搜索引擎的稳定性,我第一个想到的就是基础设施层。说白了,这是所有上层服务的「地基」。地基不稳,再牛的算法、再快的缓存都是白搭。我在项目里见过太多次了——业务方反馈搜索变慢,查了半天,最后发现是磁盘 IO 打满了。嗯,这种坑踩过一次,你就知道基础设施监控有多重要了。
3.1 CPU 监控:别只看使用率
CPU 是服务器的「大脑」。但很多人只盯着一个「CPU 使用率」看,这其实不够。我个人习惯至少看三个维度:
- CPU 使用率(user + system):整体负载情况。
- CPU 等待 I/O(iowait):这个指标特别容易被忽略。如果 iowait 高,说明 CPU 在等磁盘干活,这时候加 CPU 核心数没用。
- CPU 上下文切换(context switches):切换太频繁,说明系统在「瞎忙活」。我记得有一次排查线上抖动,就是发现上下文切换每秒几十万次,最后定位到是某个线程池配置不合理。
告警阈值建议:
- CPU 使用率 > 80%:Warning(持续 5 分钟)
- CPU 使用率 > 95%:Critical(持续 3 分钟)
- iowait > 30%:Warning(结合磁盘监控一起看)
- 上下文切换突增 > 基线 2 倍:Warning
我的小技巧: 别用单一的绝对值阈值。搜索引擎的流量有波峰波谷,我建议用「动态基线 + 百分比偏移」的方式。比如,CPU 使用率比过去 7 天同一时刻高出 30%,就触发告警。这样能避免半夜流量低峰期误报。
3.2 内存监控:Swap 是性能杀手
内存不够,系统就会用 Swap(磁盘当内存用)。你想想看,磁盘速度比内存慢几个数量级,一旦开始 Swap,搜索响应时间直接崩掉。我曾经在凌晨 3 点被电话叫醒,就是因为一台索引节点 Swap 使用率飙到了 60%,查询延迟从 10ms 变成了 500ms。
内存监控我重点关注这几个:
- 可用内存(Available Memory):不是 free 命令里的那个 free,而是真正可用的物理内存。Linux 的 free 命令显示的 available 才是靠谱的。
- Swap 使用率:理想情况是 0。一旦开始用 Swap,就要警惕。
- 内存页错误(Page Faults):特别是 major page faults,说明内存不够,频繁从磁盘换入换出。
告警阈值建议:
- 可用内存 < 20%:Warning
- 可用内存 < 10%:Critical
- Swap 使用率 > 0%:Warning(持续 10 分钟)
- Swap 使用率 > 20%:Critical
注意: Java 应用(比如 Elasticsearch)的堆外内存很容易被忽略。JVM 的堆内存监控了,但堆外(Direct Memory、MMAP)用超了,直接 OOM。我建议把进程的 RSS( Resident Set Size)也纳入监控。
3.3 磁盘监控:不只是看空间
磁盘监控,新手只看「磁盘使用率」。但搜索引擎这种 IO 密集型应用,更关键的是性能指标。我遇到过磁盘空间还剩 50%,但写入延迟已经高到离谱的情况——后来发现是磁盘坏了,坏道导致的。
磁盘监控清单:
- 磁盘使用率:这个还是要看的,别等到写不进去了才报警。
- 磁盘 IOPS(每秒读写次数):看是否达到磁盘上限。
- 磁盘吞吐量(Throughput):读写带宽。
- 磁盘延迟(Latency):平均 I/O 等待时间。这是最核心的指标。
- Inode 使用率:小文件太多,inode 用完了,磁盘空间还有,但写不了新文件。这个坑我踩过。
告警阈值建议:
- 磁盘使用率 > 80%:Warning
- 磁盘使用率 > 90%:Critical
- 磁盘延迟(读/写)> 50ms:Warning
- 磁盘延迟(读/写)> 200ms:Critical
- Inode 使用率 > 80%:Warning
避坑指南: 我曾经把告警阈值设成磁盘使用率 95% 才报警,结果有一次凌晨数据灌入,磁盘瞬间写满,索引直接挂了。后来我改成 80% Warning,85% 就开始提前扩容或清理。别等到最后一刻。
3.4 网络监控:丢包和重传是重点
网络是搜索引擎的「血管」。节点之间要同步数据、转发查询请求,网络一抖,整个集群都受影响。我记得有一次线上故障,查了三天,最后发现是网卡固件 bug,导致 TCP 重传率飙升。
网络监控核心指标:
- 带宽使用率:别让带宽打满,否则延迟会急剧上升。
- 丢包率(Packet Loss):哪怕 0.1% 的丢包,对搜索引擎这种实时系统都是灾难。
- TCP 重传率(Retransmission Rate):重传意味着网络不稳定。
- 连接数(TCP Connections):特别是 TIME_WAIT 状态的连接数,太多会耗尽端口。
- 网络延迟(Latency):节点间的 RTT(往返时间)。
告警阈值建议:
- 带宽使用率 > 70%:Warning(考虑扩容或限流)
- 丢包率 > 0.1%:Warning
- 丢包率 > 0.5%:Critical
- TCP 重传率 > 2%:Warning
- TCP 重传率 > 5%:Critical
- TIME_WAIT 连接数 > 10000:Warning
注意: 网络监控的采样周期要短。我建议至少 10 秒一次。因为网络抖动往往是瞬时的,如果采样间隔是 1 分钟,你可能根本抓不到问题。另外,别忘了监控网卡的错误计数器(errors、dropped、overruns)。
3.5 综合告警策略:别让告警变成噪音
指标设好了,阈值也定了,但告警太多等于没告警。我见过一个团队,一天收到 2000 条告警,最后运维直接把告警群屏蔽了——这很危险。
我的经验是:
- 告警分级:P0(立即处理)、P1(15 分钟内)、P2(1 小时内)、P3(日报)。CPU 使用率 80% 是 P2,但如果是 95% 且持续 5 分钟,就是 P0。
- 关联告警:别单独看 CPU、内存、磁盘。比如,CPU iowait 高 + 磁盘延迟高 + 磁盘使用率高,这三个同时出现,大概率是磁盘瓶颈。这时候只发一条聚合告警就够了。
- 静默期:同一个指标在 30 分钟内不要重复告警。否则半夜值班的人会疯掉。
最后说一句: 基础设施监控是搜索引擎稳定性的「第一道防线」。别嫌它基础,基础的东西往往最致命。我每次接手一个新集群,第一件事就是把 CPU、内存、磁盘、网络的监控补齐。嗯,这步做扎实了,后面才能睡个安稳觉。