首页 > 其他分享 >为什么percpu上的nr_uninterruptible这么奇怪

为什么percpu上的nr_uninterruptible这么奇怪

时间:2022-10-29 08:56:20浏览次数:48  
标签:uninterruptible rq percpu 状态 任务 nr cpu

背景

有一次无意间发现/proc/sched_debug中有一个nr_uninterruptible指标特别奇怪,有正数,有负数:

cat /proc/sched_debug | grep nr_uninterruptible
  .nr_uninterruptible            : 18606
  .nr_uninterruptible            : -19061
  .nr_uninterruptible            : 21195
  .nr_uninterruptible            : -20740

我的理解nr_uninterruptible这个不表示状态为(D)TASK_UNINTERRUPTIBLE的任务个数吗,为什么会这样,有点奇怪。

分析

在/proc/sched_debug中的nr_uninterruptible取自于各个cpu的就绪队列rq->nr_uninterruptible。但是它是怎么计算的呢?

代码分析

nr_uninterruptible在任务离开就绪队列时,如果任务是D状态(实际上并不准确,其实还有其他状态的判断,参考task_contributes_to_load(task)函数),则将这个任务当前所在rq->nr_uninterruptible++;

在任务被唤醒的时候都时候,会检查这个任务是否是D状态(同上),如果是则将任务将要运行的目标cpu对应的rq->nr_uninterruptible--

这里有一个情况,任务前一次D状态移出队列的时候可能是在cpuA,此时cpuA对应的就行队列rq[A]->nr_uninterruptilble就会++;但是下一次该任务被唤醒时是调度到cpuB运行,此时是对rq{B}->nr_uninterruptible--;这就造成了各个cpu的nr_uninterruptilble可能会有正值、负值的情况出现。

结论

各个cpu上rq->nr_uninterruptible有正有负是因为任务阻塞离开就绪队列前的cpu与被唤醒时调度运行的cpu并不是绝对一样的;如果一个cpu经常被唤醒的D状态任务调度到上面那rq->nr_uninterruptilble很可能就会变成负数,而一个cpu如果经常有任务发生D状态睡眠,那rq->nr_uninterruptilble很可能就是一个正数。

各个cpu上rq->nr_uninterruptible的总和就是系统中真实的D状态任务个数。

各个cpu上就绪各个cpu上rq->nr_uninterruptible的总和理论上就是系统中D状态任务的总数。

标签:uninterruptible,rq,percpu,状态,任务,nr,cpu
From: https://www.cnblogs.com/liuhailong0112/p/16832149.html

相关文章

  • 【PNR#2 Div1 D】找零(DP)(贪心)
    找零题目链接:PNR#2Div1D题目大意有500,100,50,10,5,1这些面额的纸币,你有X块钱,使用最少的纸币数表示的。然后有一些物品,每种只有一个,有费用。每次你可以选择一些......
  • renren-fast 无法启动 org.springframework.beans.factory.UnsatisfiedDependencyEx
    org.springframework.beans.factory.UnsatisfiedDependencyException:Errorcreatingbeanwithname'scheduleJobController':Unsatisfieddependencyexpressedthrou......
  • OpenResty+mysql+redis
    1、       ad_load.lua  nginx.conf1、读取mysql并缓存redis     参考:https://www.cnblogs.com/bbgs-xc/p/14437703.html https:/......
  • Service超时导致应用ANR问题记录
    需求:需要机器在第一次开机后,后台执行Service拷贝文件到机器的另一个目录Bug描述:发现拷贝不全,有一部分文件没有拷贝,抓取日志分析:10-1508:27:49.39116691669DTXZ......
  • 安装openruler详细步骤
    openeuler安装教程1.下载镜像版本:openEuler-20.03-LTS-x86_64-dvd.iso下载地址:https://repo.openeuler.org/openEuler-20.03-LTS/ISO/x86_64/需要工具:vmware2.安装操......
  • nrm 又增加小常识嘿嘿
    npminstall-gcnpm--registry=https://registry.npm.taobao.org,先安装cnpmnpmconfigsetregistryhttps://registry.npm.taobao.org,在切换国内镜像,使用淘宝镜像npmc......
  • nrf52840 设置128bit服务uuid
    sdk版本:nRF5_SDK_17.1.0_ddde560主要更改以下函数:uint32_tble_nus_init(ble_nus_t*p_nus,ble_nus_init_tconst*p_nus_init){ret_code_terr_code;b......
  • hyperf/go/springboot通过jsonrpc通信
    一、背景随着用户的增长和业务的增多,单节点服务已经满足不了需求,用hyperf对主业务进行了重构。hyperf是一个后现代的php框架,基于php+swoole,支持协程,解决了php让人诟病的......
  • Istio DestinationRule
    DestinationRule配置要点DestinationRule用于配置路由完成之后的应用于服务的流量策略,即配置如何将流量调度至上游端点,同时也是为VirtualService的Destination指定的目标......
  • LTE/NR物理层帧结构
    1.LTE学习笔记五:LTE两种帧结构https://blog.csdn.net/jyqxerxes/article/details/78988526?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blo......