第一章:监控指标体系——这些指标到底在监控什么?

大家好,我是老张。做运维这么多年,我见过太多团队一上来就铺几百个监控项,结果告警风暴一来,谁都不知道该先看哪个。说白了,监控不是堆数量,而是抓重点。

今天咱们就聊聊最常见的六个指标:CPU、内存、磁盘IO、网络带宽、进程存活、日志关键字。每个指标我都会结合实战经验,告诉你它到底在反映什么问题。

1.1 CPU使用率:不只是看百分比

CPU使用率,大家都会看。但你真的看懂了吗?

我习惯把CPU使用率拆成三部分看:

  • 用户态(user):应用程序在跑,比如你的Java进程、Nginx
  • 系统态(sys):内核在干活,比如系统调用、中断处理
  • 等待IO(iowait):CPU在等磁盘或网络,说白了就是闲得慌

重点来了:如果iowait超过20%,别急着加CPU,先查磁盘。我曾经遇到一个案例,某数据库服务器CPU飙到90%,团队加了两倍核数都没用。后来发现是磁盘IO瓶颈,换SSD后CPU直接降到30%。

监控CPU时,我建议至少设置两个阈值:

级别 阈值 建议动作
警告 持续5分钟 > 80% 检查是否有异常进程
严重 持续5分钟 > 95% 立即介入,可能影响业务

小技巧:用top命令看CPU时,按1键可以看每个核心的负载。如果某个核心跑满,其他核心空闲,说明程序有单线程瓶颈。

1.2 内存使用率:别被“已用”骗了

内存监控有个常见的坑——Linux的内存管理机制。你执行free -h,看到“已用”90%,别慌。

Linux会把空闲内存拿来当缓存(cache)和缓冲区(buffer)。这部分内存其实可以被应用程序随时回收。所以真正要关注的是:

  • 实际可用内存 = 空闲 + 缓存 + 缓冲区
  • 交换分区使用量(swap):如果swap开始涨,说明物理内存真的不够了

我曾经踩过的坑:某次线上告警说内存使用率98%,我一看swap用了2GB。结果发现是Java进程的堆内存设置过大,导致频繁GC。调小堆内存后,swap直接归零。记住:swap使用量比内存百分比更敏感。

内存监控的推荐规则:

# 实际内存使用率 = (总内存 - 可用内存) / 总内存 * 100%
# 可用内存 = free + buffers + cached

# 告警阈值建议:
# 警告:实际使用率 > 80% 或 swap使用 > 10%
# 严重:实际使用率 > 90% 或 swap使用 > 30%

1.3 磁盘IO:最容易忽略的瓶颈

磁盘IO,说白了就是硬盘的读写速度。CPU和内存再快,磁盘跟不上也是白搭。

我主要看三个指标:

  1. IOPS:每秒读写次数。数据库、消息队列这类应用很敏感
  2. 吞吐量:每秒读写的数据量。视频、日志这类大文件传输更关注
  3. IO等待时间(await):每次IO操作的平均耗时。超过10ms就要警惕了

实战经验:有一次MySQL主库突然变慢,CPU和内存都正常。我一看磁盘await飙到50ms,原来是同机柜的另一个业务在做全量数据导出,把磁盘带宽占满了。后来我们给核心数据库单独挂了块SSD,问题解决。

磁盘IO的监控命令:

# 用iostat看磁盘IO
iostat -x 1 5

# 重点关注:
# %util - 磁盘利用率,超过80%说明接近饱和
# await - 平均IO等待时间,超过20ms需要优化
# r/s, w/s - 每秒读写次数,对比磁盘规格

1.4 网络带宽:流量异常比带宽不足更可怕

网络带宽监控,很多人只盯着“用了多少”。其实我更关心流量是否异常。

举个例子:某天凌晨3点,带宽突然从100Mbps飙到800Mbps。你猜是业务高峰?还是被攻击了?

我习惯这样看:

  • 入流量 vs 出流量:如果入流量远大于出流量,可能是下载或攻击
  • 连接数:特别是TIME_WAIT状态的连接数,过多说明连接池配置有问题
  • 丢包率:超过0.1%就要查原因了

我的习惯:给网络带宽设置两个维度的告警。一是利用率超过80%告警,二是流量突增超过历史均值300%告警。后者往往能提前发现DDoS攻击或爬虫异常。

1.5 进程存活:最简单的指标,最容易被忽视

进程存活监控,说白了就是看进程在不在。但这里有个细节:进程在,不代表它在正常工作。

我遇到过的情况:Nginx进程还在,但已经无法响应请求了。为什么?因为进程死锁了,或者端口被占用了。

所以我的建议是:

  1. 不光监控进程是否存在,还要监控端口是否监听
  2. 最好加一个简单的健康检查,比如请求一个接口看返回码
# 进程存活监控脚本示例
#!/bin/bash
# 检查nginx进程和端口
if ! pgrep -x nginx &>/dev/null; then
    echo "Nginx进程不存在"
    exit 1
fi

if ! ss -tlnp | grep -q ':80'; then
    echo "Nginx端口80未监听"
    exit 1
fi

# 健康检查
if ! curl -s -o /dev/null -w "%{http_code}" http://localhost/health | grep -q 200; then
    echo "Nginx健康检查失败"
    exit 1
fi

echo "Nginx运行正常"

1.6 日志关键字:从被动救火到主动发现

日志监控,是运维的终极武器。但很多人把它用成了“事后诸葛亮”。

我建议这样配置:

  • ERROR级别日志:立即告警,但要注意过滤已知的、不影响业务的错误
  • WARN级别日志:聚合统计,比如5分钟内出现100次以上才告警
  • 特定关键字:比如“OOM”、“Connection refused”、“Timeout”

我曾经犯过的错:刚开始做日志监控时,我把所有ERROR都设成告警。结果一天收到2000条告警,全是业务正常报错。后来我加了过滤规则和聚合策略,告警量降到每天20条,每条都有价值。

日志监控的配置示例:

# 使用Promtail + Loki的日志告警规则
- name: error_log_alerts
  rules:
  - alert: HighErrorRate
    expr: |
      rate({app="myapp"} |= "ERROR" [5m]) > 10
    for: 2m
    annotations:
      summary: "应用错误率过高,5分钟内超过10次"

知识体系总览

下面这张图,是我自己总结的监控指标体系。你可以把它当成一个检查清单:

监控指标体系总览 监控指标体系 CPU使用率 内存使用率 磁盘IO 网络带宽 进程存活 日志关键字 用户态 / 系统态 / iowait 阈值:80%警告,95%严重 关注:单核负载是否均衡 实际可用 = free + cache + buffer 关注:swap使用量 阈值:swap > 10% 警告 IOPS / 吞吐量 / await 关注:%util > 80% await > 20ms 需优化 入/出流量 / 连接数 / 丢包 阈值:利用率 > 80% 突增 > 300% 需排查 进程存在 + 端口监听 建议:加健康检查接口 返回码200才算正常 ERROR立即告警 WARN聚合统计 关键字:OOM/Timeout 核心原则:先抓重点,再逐步细化,避免告警风暴

嗯,这六个指标,基本上覆盖了90%的日常监控场景。你想想看,服务器无非就是CPU算、内存存、磁盘读写、网络传输、进程跑、日志记。把这六个点盯住了,大部分问题都能提前发现。

我个人习惯是:先配CPU和内存的告警,再逐步加上磁盘IO和网络。进程存活和日志关键字,建议从第一天就配上,因为这两个指标能帮你发现很多“看不见”的问题。


专注资料整理