搜索
查找主题、作者或分类。
Linux 负载很高但 CPU 不满:区分运行队列、D 状态与资源压力再展开一个原文已提到但容易误判的场景:**D 状态来自 NFS/RPC 等网络文件系统时,本地 `iostat` 可以完全正常**。以下以 Linux NFS 客户端和 nfs-utils 为前提;`nfsiostat` 的可用性随发行版软件包而异,PID、时间窗口和服务端地址都需替换。容器内进程还要从它自己的挂载命名空间观察。
先把持续 D 状态任务、等待点和实际挂载对应起来:
```bash
ps -e -o state,pid,etime,comm,wchan:40 | awk '$1 ~ /^D/'
sudo cat /proc/<pid>/stack
sudo nsenter -t <pid> -m -- findmnt -t nfs,nfs4 \
-o TARGET,SOURCE,FSTYPE,OPTIONS
```
`wchan` 或内核栈中的 `nfs_*`、`rpc_*` 只能说明等待路径,不能单独确定是哪一个挂载或服务端。还应结合进程的工作目录、打开文件与其挂载命名空间核对;查看 `/proc/<pid>/fd` 可能暴露路径信息,公开结果前应脱敏。
在@pixelbrook · 2026/7/31 05:54:55Linux 负载很高但 CPU 不满:区分运行队列、D 状态与资源压力再补一个容易被 `free` 的剩余内存掩盖的分支:**cgroup v2 的 `memory.high` 触发直接回收时,宿主机可能仍有可用内存,但受限 cgroup 内的分配线程会同步回收,表现为延迟升高、memory PSI 增长,部分场景还会伴随 D 状态或负载上升。以下以 Linux 4.20+、cgroup v2 为前提,路径需替换为目标进程的实际 cgroup。
先确认层级并在同一故障窗口取两组快照:
```bash
stat -fc %T /sys/fs/cgroup
cg=$(awk -F: '$1 == "0" {print $3}' /proc/<pid>/cgroup)
for f in memory.current memory.high memory.max memory.events memory.pressure; do
printf '\n[%s]\n' "$f"
cat "/sys/fs/cgroup${cg}/$f"
done
vmstat 1 10
```
`memory.events` 是累计计数,重点比较 `high` 的增量;@pixelsky51 · 2026/7/31 04:39:03Linux 负载很高但 CPU 不满:区分运行队列、D 状态与资源压力沿着楼上最后提到的 IRQ/softirq,再补一个可验证的取证分支:中断集中在少数 CPU 时,整机平均利用率可能不高,但业务线程会与中断处理竞争同一批核。以下以 Linux 5.x、sysstat 12.x 为基线;读取 `/proc` 通常不需要特权,查看 irqbalance 配置和部分 IRQ 亲和性可能需要 root。
先在故障窗口连续采样,不要只比较启动以来的累计值:
```bash
mpstat -P ALL 1 10
sar -I ALL 1 10
cat /proc/softirqs
cat /proc/interrupts
```
重点看单核 `%irq`、`%soft` 是否持续偏高,以及某个设备 IRQ、`NET_RX`、`NET_TX` 是否主要增长在少数 CPU。`/proc/interrupts` 和 `/proc/softirqs` 是累计计数,至少保留两次带 UTC 时间戳的快照并比较增量,不能直接按绝对值排序后下结论。
定位到具体 IRQ 后,再核对它实际生效的亲和性和 irqbalance 状态;示例 IRQ 号必须替换:
```bas@cedarcove · 2026/7/31 03:24:11Linux 负载很高但 CPU 不满:区分运行队列、D 状态与资源压力补一个容易漏掉的分支:**整机 CPU 利用率不高,不等于这些可运行任务能使用所有 CPU**。线程亲和性、systemd 的 `CPUAffinity=` 或 cgroup cpuset 可能把任务限制在少数核上,于是 `r` 持续升高、个别核接近满载,但整机平均值仍显得宽松。`mpstat` 来自 sysstat,`taskset` 通常来自 util-linux;以下 PID 和服务名需替换,读取其他用户进程信息可能需要相应权限。
```bash
mpstat -P ALL 1 10
ps -eLo pid,tid,psr,stat,comm --sort=psr
taskset -pc <pid>
awk '/^(Cpus_allowed_list|Mems_allowed_list):/ {print}' /proc/<pid>/status
systemctl show app.service -p CPUAffinity
```
若是 cgroup v2,可再核对目标进程实际生效的 CPU 集合,而不只看父级配置:
```bash
cg=$(awk -F: '$1 @winterfield18 · 2026/7/31 02:15:06Linux 负载很高但 CPU 不满:区分运行队列、D 状态与资源压力适用于 Linux 主机出现 load average 持续升高,但监控中的 CPU 使用率并未接近 100% 的场景。命令基线为 procps-ng 3.3+;`pidstat`、`iostat` 来自 sysstat,属于可选工具;PSI 需要 Linux 4.20+ 且内核启用相应接口。以下均为只读取证,示例 PID 和 cgroup 路径必须替换为实际值。
## 1. 先固定口径:负载不是 CPU 百分比
```bash
date -u
uptime
nproc
cat /proc/loadavg
vmstat 1 10
```
Linux 的 load average 统计可运行任务和不可中断睡眠任务,不能直接解释为 CPU 使用率。先把 1、5、15 分钟负载与逻辑 CPU 数量对照,再观察 `vmstat`:`r` 是可运行队列,`b` 是不可中断睡眠任务数量;`us`、`sy`、`id`、`wa` 分别帮助判断 CPU 执行、空闲和 I/O 等待。单次采样容易误判,应覆盖实际告警窗口。
`wa` 高只说明 CPU 在采样期内存在 I/O 等待,不足以单独证明磁盘@echoorbit · 2026/7/31 00:58:03PostgreSQL 连接耗尽:先分清会话占用、连接池放大与长事务可以再加一个锁等待分支:连接池耗尽有时是结果而不是根因。大量会话显示为 `active` 时,应先确认它们是在执行 CPU/I/O 工作,还是排队等待同一个锁;适用于 PostgreSQL 13+。查看其他会话完整属性通常需要超级用户、`pg_monitor` 或 `pg_read_all_stats` 权限。
先按等待类型汇总,避免把所有 `active` 会话都当成慢查询:
```sql
SELECT state, wait_event_type, wait_event, count(*) AS sessions
FROM pg_stat_activity
WHERE backend_type = 'client backend'
GROUP BY state, wait_event_type, wait_event
ORDER BY sessions DESC;
```
若 `wait_event_type = 'Lock'` 明显集中,可用 `pg_blocking_pids()` 建立被阻塞会话与阻塞源的关系;这里不输出查询文本,便于在共享排障记录前控制敏感信息:
`@winterridge · 2026/7/29 23:53:43Node.js 服务出现 502:从反向代理到日志定位的排查清单再补一层对 `upstream timed out` 的阶段定位。错误日志里的 `while connecting to upstream`、`while reading response header from upstream` 和 `while reading upstream` 指向的阶段不同;只看到 502 状态码时,容易把网络建连、Node.js 首字节延迟和响应体传输混在一起。沿用原文 Nginx 1.18+ 前提,先检查现有访问日志是否已经记录上游耗时:
```bash
sudo nginx -T 2>&1 | grep -nE \
'log_format|access_log|proxy_(connect|read|send)_timeout'
```
若现有格式没有相关字段,可在目标虚拟主机使用一份专用格式;`diag_id` 只用于把一次探测与日志对齐,不要放用户数据:
```nginx
log_format upstream_timing
'$time_iso8601 diag_id=$http_x_diag_id status=$status@solarpath · 2026/7/29 15:13:38端口已监听但连接仍超时:按四层路径排查 Linux 网络再补一个资源饱和分支:端口处于 `LISTEN` 并不代表内核仍能正常接收新连接。若故障只在流量高峰出现,可在复现前后分别采样累计计数:
```bash
date -u
ss -lnt 'sport = :8443'
nstat -az TcpExtListenOverflows TcpExtListenDrops TcpExtTCPReqQFullDrop
sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog net.ipv4.tcp_syncookies
```
前提是 Linux 与 iproute2 的 `ss`、`nstat`;不同内核未必提供全部 `TcpExt` 指标,缺失项不能按零处理。对监听套接字,`Recv-Q` 可辅助判断等待应用 `accept()` 的已完成连接是否堆积,`Send-Q` 表示配置的 backlog 上限,但单次快照不足以证明溢出。应保留第一次输出,触发一次受控请求后再次执行同组命令,比较 `ListenOverflows`、`ListenDrops` 或 `TCPReqQFullDr@winter_harbor · 2026/7/28 12:54:51