05. PSI 进阶:Linux 6.1 的 IRQ 压力与大厂实践
K8s PSI 压力监控实战 · 第 5 篇(共 6 篇)
本篇解决:Linux 6.1 新增的第四类 PSI——IRQ 压力是什么、怎么采;以及 Meta / 阿里 / 腾讯这些大厂怎么用 PSI。
一句话答案:irq PSI 只 full、只系统级、原生 kubelet 拿不到,得用 node_exporter 采;大厂共同点是把"停顿"而非"使用率"当作可服务性指标。
适合:进阶读者。
一、生产现场:网络风暴时,CPU 不忙业务却卡
高 PPS(包速率)场景下,NIC 中断处理把某个核打满,业务 RT 抖动。但你看 cpu PSI 和 CPU 使用率,都只是"部分"升高——因为这类停顿的元凶是中断处理开销,而不是算力不足。
经典 PSI(kernel 4.20)只有 cpu/memory/io 三类,会把这部分中断开销混在 cpu 里。Linux 6.1 起主线新增第四类——IRQ/SOFTIRQ 压力,把它单独量化:
/proc/pressure/├── cpu├── memory├── io└── irq ← Linux 6.1(2022-12)新增
为什么单独拆出来:这类停顿会被 cpu PSI 部分捕捉,但 irq 把"中断处理开销"单独量化,便于区分"CPU 算力不足"和"被中断打断"。
二、IRQ 压力的三个关键差异
| | |
|---|
| some | |
| | 只有系统级,cgroup 下不生成 irq.pressure |
| | |
校验来源:Kernelnewbies Linux 6.1 更新日志(明确 "only full state, system level only",作者 Chengming Zhou);node_exporter collector/pressure_linux.go(注释 "IRQ pressure does not have 'some' data")。官方 kernel PSI 文档尚未更新加入 irq 描述,属文档滞后,不代表未合入。
三、在 K8s 里怎么采(关键:原生 kubelet 拿不到)
因为 irq PSI只在系统级、只有 full,而 KubeletPSI/cAdvisor 采的是per-cgroup的 cpu/memory/io:
| | |
|---|
原生 KubeletPSI(container_pressure_*) | | 无 container_pressure_irq_*;cgroup 下无 irq.pressure,cAdvisor 也没实现 |
| node_exporter pressure collector | | 内核 ≥ 6.1 + 较新 node_exporter 时暴露 node_pressure_irq_stalled_seconds_total(仅 stalled=full) |
| | 遍历 /proc/pressure/* 会自动包含 irq(见第 6 篇) |
即:irq PSI 只有节点级,没有容器级。要定位"哪个 Pod 引发了大量中断",得用 /proc/interrupts、/proc/softirqs(看 NET_RX)或网络 PPS 指标交叉定位,而不是靠 cgroup 级 irq PSI。
验证与查询:
# 节点级 irq PSI(只有 full 一行)cat /proc/pressure/irq# full avg10=0.00 avg60=0.00 avg300=0.00 total=123# node_exporter 是否采到(只有 stalled)curl -s http://NODE_IP:9100/metrics | grep node_pressure_irq# node_pressure_irq_stalled_seconds_total 0.000123
PromQL(节点级,仅 full):rate(node_pressure_irq_stalled_seconds_total[5m])。
排障方向:
irq PSI 持续升高 ↓查 /proc/softirqs 的 NET_RX 是否暴涨(网络软中断) ↓查 NIC 中断是否集中单核(IRQ affinity) ↓考虑 RPS / RFS / XPS 分散中断或调优
告警规则见第 3 篇第 5 条 NodeIRQPressure。
四、互联网大厂怎么用 PSI
Meta / Facebook —— PSI 的发明者
- 动机:utilization 无法反映延迟损失,fleet 规模化后没法靠使用率判断"到底卡没卡"。PSI 在其自研编排系统 Tupperware 中用于负载卸载(load shedding)与调度,在压力显性化之前主动转移工作。
- 可借鉴点:把 PSI 当作"业务可服务性"的信号,而不是单纯的资源利用率指标。
阿里云 / OpenAnolis
- Alibaba Cloud Linux 把 PSI 能力回移到了 cgroup v1 接口,让没迁 cgroup v2 的存量集群也能监控压力。
- ACK 容器优化版镜像 在 cgroup v2 下完整支持 MemoryQos + PSI。
- OpenAnolis 用
memory.min/low/high 三档做分级内存保护——把 PSI(压力)和 MemoryQoS(保护)组合成"按优先级隔离"的范式。
腾讯 TencentOS "悟净"
- 把 PSI 作为监控内存压力的主要指标,统计进程因内存缺乏而阻塞的时间比例,在提升整机内存利用率的同时守住延迟底线。
行业共识
| | |
|---|
| | |
| | |
| | |
| | Alertmanager + HPA/KEDA 接线 |
五、口诀收束
irq 是 Linux 6.1 新增的第四类 PSI → 只 full、只系统级、cgroup 下没有 → 原生 kubelet 拿不到,用 node_exporter 采定位”哪个 Pod 引发中断”靠 /proc/softirqs(NET_RX),不是 cgroup irq大厂共同点: 不看 usage 看停顿,some 预警 / full 应急 PSI + MemoryQoS = 压力观测 + 分级保护
最后一篇:kubelet 原生支持 PSI 了,还要不要自己写 exporter?给一棵决策树和一个最小 Go 实现。
权威校验来源(本篇论点均经官方/权威文档校验)
| |
|---|
| IRQ/SOFTIRQ 压力于 Linux 6.1 合入(only full, system level only,作者 Chengming Zhou) | Kernelnewbies: Linux 6.1、LKML PSI_IRQ patch |
| Phoronix: Linux 6.1 Picks Up Some Improvements For PSI |
| node_exporter 采 irq、only-full 处理 | node_exporter collector/pressure_linux.go |
| Meta/Facebook 在 Tupperware 用 PSI 做负载卸载与调度 | Facebook Microsites: PSI 概览 |
| 阿里云 Alibaba Cloud Linux 把 PSI 回移到 cgroup v1 | 阿里云:在 cgroup v1 接口开启 PSI 功能 |
| ACK 容器优化版镜像 MemoryQos + PSI | 阿里云:Alibaba Cloud Linux 3 容器优化版镜像 |
| OpenAnolis memory.min/low/high 分级内存保护 | |
| 腾讯 TencentOS "悟净" 以 PSI 为内存压力主指标 | |
— K8s PSI 监控实战系列(共 6 篇)—