0

0

vmstat r 队列长期高但 top 无明显热点进程的等待分析

冷漠man

冷漠man

发布时间:2026-01-24 18:46:03

|

238人浏览过

|

来源于php中文网

原创

r 值表示运行队列长度,即正在运行或等待 CPU 调度的进程总数;若长期高于 CPU 核心数,说明调度拥堵,需结合 D 状态进程、iostat、中断统计、cgroup throttling 等多维度排查真实瓶颈。

vmstat r 队列长期高但 top 无明显热点进程的等待分析

看懂 r 值到底在等什么

r 是 vmstat 中「运行队列长度」,它统计的是**正在 CPU 上运行 + 等待 CPU 调度的进程总数**。注意:它不区分用户态/内核态,也不管进程是不是卡在 I/O、锁、内存分配或中断里——只要没被调度出去,就还在队列里。所以 r 长期高于 CPU 核心数(比如 8 核服务器 r > 8),说明调度器“排不上号”,但 top 里看不到高 CPU 进程,恰恰说明这些进程根本没机会跑满 CPU,而是被别的东西拦住了。

重点排查 D 状态进程和不可中断等待

当进程因磁盘 I/O、NFS 挂载、内核锁或硬件驱动阻塞时,会进入 D(Uninterruptible Sleep)状态。这类进程:
• 不响应信号(kill -9 无效)
• 不计入 top 的 CPU 使用率(因为没执行指令)
• 却持续占据 r 队列位置
• 在 ps aux 输出中 STATE 列显示为 D

  • 快速检查:ps -eo stat,pid,comm | grep "^D"
  • 结合 vmstat 1 观察 b 列(阻塞进程数)是否同步升高;若 rb 都高,基本锁定 I/O 或内核路径阻塞
  • iostat -x 1%util 是否接近 100%、await 是否远超 10ms(SSD)或 50ms(HDD)

别漏掉中断和内核线程的“隐形消耗”

CPU 负载高但用户进程不占 CPU,常见于高频硬件中断(如网卡收包、NVMe 驱动、USB 设备)或内核线程密集争抢资源。这类负载不会出现在 top 默认视图,但会推高 vmstatin(每秒中断数)、cs(上下文切换)和 sy(系统态 CPU)。

墨鱼aigc
墨鱼aigc

一款超好用的Ai写作工具,为用户提供一键生成营销广告、原创文案、写作辅助等文字生成服务。

下载
  • 查中断分布:watch -n1 'cat /proc/interrupts | sort -k2nr | head -10',关注某 CPU 上某设备中断是否突增
  • 查内核线程:top -H -p $(pgrep kthreadd)ps -eLh o pid,tid,class,rtprio,ni,pri,psr,pcpu,state,comm | awk '$11=="R" || $11=="D" {print}' | sort -k7nr | head -10
  • 确认 irqbalance 是否启用:systemctl is-active irqbalance;若关闭且中断集中在一个核,r 高就非常典型

短生命周期进程和 cgroup 限制也会“藏”负载

频繁 fork/exit 的进程(如 CGI 脚本、容器健康检查、日志轮转)可能在 top 刷新间隔(默认 3 秒)内一闪而过,导致“看不见但压得死”。另外,如果进程受 cgroup CPU quota 限制(如 cpu.max = 10000 100000),它会反复被 throttled,表现为调度队列积压,但单次运行时间极短,top 统计不到显著占用。

  • 捕获瞬时进程:pidstat -u 1 10(比 top 更细粒度)或 atop -r /var/log/atop/atop_$(date +%Y%m%d) -r 1(需提前开启 atop 日志)
  • 检查 cgroup 限频:cat /sys/fs/cgroup/cpu,cpuacct/*/cpu.stat 2>/dev/null | grep throttled,有非零值即存在节流
  • 验证是否是调度延迟本身:perf sched latency -s max 可输出最高调度延迟及对应进程

真正难缠的不是 r 高,而是它背后混着 I/O 阻塞、中断风暴、内核锁竞争、cgroup 节流等多种机制——必须靠 vmstat 定向、ps/iostat/perf 多点交叉,才能揪出那个“不动声色却堵死通道”的元凶。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

185

2023.09.27

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

233

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

387

2023.09.04

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

467

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

13

2025.12.06

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

17

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

22

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号