常见指标类型
| 类型 | 特点 |
|---|---|
| counter | 只能增不能减,用于累积量(如请求数、字节数) |
| gauge | 可增可减,用于实时值(如内存、CPU 温度) |
| histogram | 分桶值,用于耗时统计 |
| summary | 百分位实时统计(不常用于大规模系统) |
1.CPU指标
1.1node_cpu_seconds_total
统计某个 CPU 核心在某种状态下运行的累计秒数。
具体样式:
node_cpu_seconds_total{cpu="0",mode="idle"}
| mode | 含义 | 描述 |
|---|---|---|
| idle | 空闲 | CPU 什么都没干 |
| user | 用户态 | 应用代码执行,例如 Java 程序 |
| system | 内核态 | 处理内核系统调用 |
| iowait | IO 等待 | CPU 在等磁盘或网络 IO |
| irq | 硬中断 | 硬件触发 |
| softirq | 软中断 | 网络包、定时器等 |
| steal | 被宿主机 "偷走" | 常见于虚拟机,被其他虚拟机占用核 |
常见公式:
总cpu利用率:
java
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
用户态cpu:
java
avg by (instance) (rate(node_cpu_seconds_total{mode="user"}[5m])) * 100
系统态cpu:
java
avg by (instance) (rate(node_cpu_seconds_total{mode="system"}[5m])) * 100
IO 等待(判断是否磁盘性能拖慢系统):
java
avg by (instance) (rate(node_cpu_seconds_total{mode="iowait"}[5m])) * 100
参数讲解:
5m\]表示取每个时间序列最近 5 分钟的数据点。 rate() 负责把"累计值的 counter" 转换成 "每秒变化率",即过去 5 分钟 CPU idle 了多少秒 / 300 秒。 avg by (instance):把同一个 instance 的所有 CPU 核心平均 #### 1.2node_context_switches_total 统计上下文总切换次数。 常用判断规则:rate(node_context_switches_total\[5m\]) #### 1.3:node_load1/5/15 表示系统最近1/5/15分钟的负载。 | 指标 | 告警阈值 | |--------|-----------------------| | load1 | \> 0.8 × CPU核数 触发预警 | | load5 | \> 1.0 × CPU核数 触发告警 | | load15 | \> 1.5 × CPU核数 触发严重告警 | 常见原因: | 原因 | 指标表现 | |---------------------|---------------------------| | IO 阻塞(数据库、磁盘) | iowait 上升,load 升高,CPU 占用低 | | 线程池满了 | load 升高,CPU 上不去 | | 死锁 / 锁竞争 | context switch 很高 | | GC 频繁 | load 升高,CPU user 偏高 | | 虚拟机 CPU 资源不足(steal) | steal 升高,load 跟着升 | ### 2.内存指标 再开始介绍指标前,先了解下Linux内存大类,大致分为: | 类别 | 解释 | 是否可回收 | |------------------------|--------------|--------| | **MemTotal** | 总内存 | - | | **MemFree** | 完全没用到的内存(很少) | ✔ | | **Buffers** | 缓冲区(IO缓冲) | ✔ | | **Cached** | 文件缓存 | ✔ | | **Slab** | 内核自己使用的缓存 | 部分可回收 | | **Active/Inactive** | 活跃/非活跃内存页 | 非活跃可回收 | | **SwapTotal/SwapFree** | 交换分区 | - | Linux 内存不会像 Windows 一样"空着",它会尽可能缓存文件加速系统,所以你会看到"free 很低",但其实大量内存可以被立即回收。 #### 2.1node_memory_MemTotal_bytes 表示机器总内存。 #### 2.2node_memory_MemFree_bytes 完全空闲、未使用的内存(通常很小)。 #### 2.3node_memory_Buffers_bytes 用于文件系统 metadata 缓冲区的内存。 #### 2.4node_memory_Cached_bytes 用于文件内容的缓存,并非真正"占用"。 #### 2.5**node_memory_Slab_bytes** 内核使用的缓存,高并发文件 IO 下可能变大。 #### 2.6node_memory_MemAvailable_bytes "可用内存",考虑了 free + 可回收 cache,因此比 free 更准确。 #### 2.7常见公式 ```java //内存使用率 (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 //内存实际占用(已使用量) node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes //缓存占用量 node_memory_Cached_bytes + node_memory_Buffers_bytes //Swap使用率 (1 - (node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes)) * 100 ``` ### 3.磁盘IO #### 3.1文件系统指标 ```java //可用空间 fstype 过滤掉 tmpfs、overlay(临时文件系统) node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} //总空间 node_filesystem_size_bytes{fstype!~"tmpfs|overlay"} //已用空间 node_filesystem_size_bytes - node_filesystem_free_bytes //磁盘使用率 100 * (1 - (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"})) //inode使用率 inode 代表"文件数"。网站系统、小文件场景非常容易触发 inode 满的问题 1 - (node_filesystem_files_free / node_filesystem_files) ``` #### 3.2读写次数 ```java //每秒读 rate(node_disk_reads_completed_total[1m]) //每秒写 rate(node_disk_writes_completed_total[1m]) ``` #### 3.3读写吞吐量 ```java //读字节 rate(node_disk_read_bytes_total[1m]) //写字节 rate(node_disk_written_bytes_total[1m]) ``` #### 3.4IO等待时间 ```java rate(node_disk_read_time_seconds_total[1m]) rate(node_disk_write_time_seconds_total[1m]) ``` #### 3.5磁盘使用率 ```java rate(node_disk_io_time_seconds_total[1m]) * 100 ``` #### 3.6IO队列深度 ```java rate(node_disk_io_time_weighted_seconds_total[1m]) ``` ### 4.网络指标 网络指标是以网卡维度进行统计,常见分为四大类 | 分类 | 意义 | 示例指标 | |------------------|--------------|------------------------------------| | 📥 流量(吞吐) | 网络是否被打满带宽 | node_network_receive_bytes_total | | 📈 PPS(包速率) | 反映连接/请求压力 | node_network_receive_packets_total | | 💥 丢包/错误 | 网络质量稳定性 | node_network_receive_errs_total | | 📡 派生指标(bps、pps) | rate 算出来的重要值 | rate()、sum by() 等 | #### 4.1流量 ```java //入站流量 rate(node_network_receive_bytes_total{device!="lo"}[1m]) //出站流量 rate(node_network_transmit_bytes_total{device!="lo"}[1m]) ``` 表示 1 分钟平均每秒收到多少字节;device!="lo" 过滤本地回环网卡;可以再 sum 变成所有网卡总流量,如: ```java sum by(instance) (rate(node_network_receive_bytes_total{device!="lo"}[1m])) ``` #### 4.2PPS ```java //入站包速率 rate(node_network_receive_packets_total{device!="lo"}[1m]) //出 rate(node_network_transmit_packets_total{device!="lo"}[1m]) ``` #### 4.3错误 ```java //入站错误 rate(node_network_receive_errs_total{device!="lo"}[1m]) //出站错误 rate(node_network_transmit_errs_total{device!="lo"}[1m]) ``` #### 4.4拥塞丢包 ```java //入站丢包 rate(node_network_receive_drop_total[1m]) //出站丢包 rate(node_network_transmit_drop_total[1m]) ``` #### 4.5设备开关 ```java //0为down 1为up node_network_up ```