搜索

查找主题、作者或分类。

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
找到 38 条结果