0

0

vmstat r 队列长期高但无明显 CPU 消耗的等待锁或 IO 等待分析

舞姬之光

舞姬之光

发布时间:2026-01-20 17:25:02

|

670人浏览过

|

来源于php中文网

原创

r值持续偏高而CPU使用率低,说明就绪进程因D状态进程阻塞、内核锁争用、cgroups限制或内核缺陷等原因无法被调度执行。

vmstat r 队列长期高但无明显 cpu 消耗的等待锁或 io 等待分析

vmstat 中的 r(运行队列长度)持续偏高,但 ussywa 等 CPU 使用率指标却很低时,说明系统中有大量进程处于“就绪态”(ready to run),却迟迟得不到 CPU 时间片——这不是因为 CPU 忙,而是因为调度受阻。最常见且容易被忽略的原因是:不可中断睡眠(D状态)进程阻塞了调度器路径,或内核锁争用导致就绪进程无法被及时唤醒和调度

检查是否存在 D 状态进程(不可中断睡眠)

D 状态进程通常在等待慢速 I/O(如挂起的 NFS、坏盘、cgroup 冻结、内核模块死锁等),它们不响应信号,也不释放资源,但会持续占据运行队列槽位,使 r 值虚高。注意:D 进程本身不消耗 CPU,也不会体现在 wa 中(尤其在非存储 I/O 场景下)。

  • 运行 ps -eo pid,stat,comm,wchan --sort=-time | head -20,重点关注 STAT 列含 D 的进程,及其 WCHAN(等待的内核函数)
  • 配合 cat /proc/[pid]/stack 查看 D 进程的内核调用,确认卡在哪个路径(如 nfs_wait_bit_killable__mutex_lock_slowpathcpuhp_state_wait
  • 检查是否有异常挂载(mount | grep -E "(nfs|cifs)")、cgroup v1 冻结(cat /sys/fs/cgroup/freezer/*/freezer.state)、或 SCSI 设备超时(dmesg -T | grep -i "timeout\|reset\|hang"

排查内核锁竞争(尤其是调度器/RCU/Per-CPU 锁)

现代内核中,即使没有明显 I/O 或 CPU 消耗,高并发场景下对调度器数据结构(如 rqcfs_rq)、RCU 全局状态、或 per-CPU 资源(如 task_struct 分配缓存)的激烈争用,会导致就绪进程反复尝试获取锁失败而自旋或短暂休眠,表现为 r 高但 sy 不高(因锁等待未计入传统上下文切换开销)。

  • 使用 perf record -e 'sched:sched_switch' -a sleep 10perf script | awk '{print $9}' | sort | uniq -c | sort -nr | head -10,观察是否频繁在 try_to_wake_uppick_next_task_fair 等调度路径上切换
  • 检查 RCU stall(dmesg -T | grep -i "rcu.*stall"),RCU 宽限期过长会拖慢整个调度周期
  • 查看 /proc/sched_debugnr_cpusnr_switches、各 CPU 的 rq->nr_running 是否严重不均衡;若某 CPU 的 nr_running 远高于其他,可能是负载均衡失效或该 CPU 被锁住

确认是否受 cgroups 或 namespace 机制限制

cgroups v1 的 CPU 子系统(特别是 cpu.sharescpu.cfs_quota_us 设置不当)、或容器 runtime(如 runc)在创建进程时触发的 namespace 初始化延迟(如 user ns 映射、seccomp 加载),都可能让进程卡在内核态初始化阶段,处于就绪态但无法真正进入可运行状态。

白果AI论文
白果AI论文

论文AI生成学术工具,真实文献,免费不限次生成论文大纲 10 秒生成逻辑框架,10 分钟产出初稿,智能适配 80+学科。支持嵌入图表公式与合规文献引用

下载
  • 执行 find /sys/fs/cgroup/cpu -name "tasks" -exec sh -c 'echo {} ; wc -l /dev/null | awk '$1 > 100 {print}',快速定位任务数异常多的 cgroup
  • 检查容器内进程的 /proc/[pid]/statusCapEffNSpid 字段是否完整;若 NSpid 显示为 0,说明其 PID namespace 初始化卡住
  • 对比 cat /sys/fs/cgroup/cpu/cpu.statnr_throttledthrottled_time,确认是否因 CFS 配额耗尽导致进程被 throttle 后仍留在运行队列

验证是否由内核缺陷或特定驱动引发

某些内核版本存在已知调度器 bug(如 4.19~5.4 间部分版本的 dl_task 处理缺陷)、或特定硬件驱动(如某些 NVMe 驱动、虚拟化平台 paravirt 驱动)在异常路径下未正确更新调度状态,也会造成运行队列堆积。

  • 比对当前内核版本是否在 kernel.org bugzilla 或发行版 errata 中有相关报告(搜索关键词:"runqueue stuck" "D state" "scheduler hang"
  • 临时禁用可疑模块(如 modprobe -r nvme_core 后观察 r 值变化),或升级到 LTS 内核(如 6.1+)验证是否缓解
  • 启用调度器调试:启动参数加 sched_debug,然后 cat /proc/sched_debug 查看 rq->clock 是否停滞、nr_switches 是否增长缓慢

这类问题本质是“调度可见性”与“实际执行能力”的脱节。不要只盯着 CPU 百分比,要深入内核态行为。从 D 进程入手,再查锁与 cgroup,最后考虑内核版本,往往能准确定位根源。

相关专题

更多
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语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

232

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

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

535

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

21

2026.01.06

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

392

2023.07.18

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

8

2026.01.20

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

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

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