[转帖]Linux命令拾遗-top中的%nice是啥
https://www.cnblogs.com/codelogs/p/16060663.html
简介#
这是Linux命令拾遗系列的第八篇,本篇主要介绍top命令中nice%这个指标的含义以及进程优先级相关内容。
本系列文章索引
Linux命令拾遗-入门篇
Linux命令拾遗-文本处理篇
Linux命令拾遗-软件资源观测
Linux命令拾遗-硬件资源观测
Linux命令拾遗-剖析工具
Linux命令拾遗-动态追踪工具
Linux命令拾遗-理解系统负载
在各种查看CPU使用率的工具中(如top),一般都有us%、sy%、ni%等,us%与sy%含义是比较容易理解的,一个是用户态CPU使用率,一个是内核态CPU使用率。
但ni%就比较晦涩难懂了,它代表被调整过nice值的进程占用的CPU使用率,很难理解对不对,来看看下面的例子。
调整进程nice值#
首先,我们使用stress命令起2个进程,对CPU制造一些压力,如下:
# 起2个吃CPU的后台进程
$ stress -c 2 &
# 查看两个stress进程,进程号为194022、194022
$ pstree -Tp $$
bash(193921)─┬─pstree(194101)
└─stress(194017)─┬─stress(194022)
└─stress(194023)
由于我机器是多核的,操作系统会将两个stress进程调度到两个核上,为了达到效果,我们将这2个进程绑定到1号核上运行,如下:
# 绑定2个stress进程到CPU的1号核上
$ taskset -pc 1 194022
$ taskset -pc 1 194023
# 然后使用top查看,如下图
$ top

可以看到,此时%Cpu1是占满的100%,两个stress进程各占50%,这很好理解,两个同样吃CPU进程跑在一个核上,大家各分一半嘛!
这里需要注意一下进程的PR与NI列,这两个都代表了进程的优先级,PR是内核调度时使用的优先级(priority),默认20,值越大优先级越低,而NI是开放给用户调整的优先级(nice),默认0,nice值越大,则进程会表现得越谦让(nice),先让别的进程获得CPU,表现为优先级越低。
如下,我们通过renice命令调整194023进程的nice值为5,以降低它的优先级:
$ renice -n 5 -p 194023
$ top

可以发现,现在%Cpu1的us是75.7,ni是24.3,没被调整nice的进程194022的%CPU是75.1,而调整了的进程194023的%CPU是24.6,同时NI列从0变成了5,PR列从20变成了25,可以发现%ni的值24.3几乎等于被调整过nice值进程的CPU使用率,即24.6。
再看看我开头说的ni%的定义,ni%代表被调整过nice值的进程占用的CPU使用率,现在感觉这句话是不是再清楚不过了,被调整了nice值的进程,会从us%中分离出来单独显示,这样当一批非常吃CPU的进程被调整nice值后,调整的人就能非常清楚的知道,这些进程现在占用多少CPU了。
如下,再通过renice命令调用194023进程的nice值为19,这是nice值能设置的最大值:
$ renice -n 19 -p 194023
$ top

可以发现194023这个进程CPU使用率更低了,且%Cpu1的ni也更低了,并且NI变成了19,PR变成了39。
PR与NI#
上面可以看到,PR与NI好像满足这样一种等式关系:PR = 20 + NI,那么为什么Linux要设计这两套优化级呢?
其实,在进程执行的过程中,就算你调整了进程NI值导致PR变化,PR还是可以再次由CPU调度器根据需要动态调整的,在这种情况下,上面的公式就不成立了。并且,在内核代码里,PR才是CPU调度器真正使用的优化级,而NI只是开放给用户修改的。
另外,NI值是给普通进程使用的,范围是[-20 ~ 19]共39个级别,对应PR就是[0 ~ 39]。
而PR的取值范围可以是[-100 ~ 39]共139个级别,其中[-100, -1]是给实时进程用的。
所以在Linux中PR大于0是普通进程,小于0是实时进程。
注:在top中会看到 PR = rt 的进程,这个rt等同于-100
可以发现,对于普通进程,不管用户怎么调整NI值,进程的PR都不会低于0,也就是保证所有实时进程的优先级,都要大于普通进程,像Linux中的一些内核进程就是实时进程(如:migration/0),必须保证他们被优先执行。
如下,在Linux中,可以通过chrt命令查看内核支持的实时进程调度策略:
$ chrt -m
SCHED_OTHER min/max priority : 0/0
SCHED_FIFO min/max priority : 1/99
SCHED_RR min/max priority : 1/99
SCHED_BATCH min/max priority : 0/0
SCHED_IDLE min/max priority : 0/0
SCHED_DEADLINE min/max priority : 0/0
是的,你会发现SCHED_FIFO/SCHED_RR策略都有[1,99]共99个实时优先级(real_time_priority)可用,它和PR的关系是:PR = -1 - real_time_priority。
如下,之前通过增大NI值而降低了优先级的194023进程,我再把它修改为实时进程:
# 设置194023进程为实时进程,调度策略为SCHED_RR,实时优先级为10,PR = -1 -10 = -11
$ sudo chrt --rr --pid 10 194023
# 查看实时优先级
$ chrt -p 194023
pid 194023's current scheduling policy: SCHED_RR
pid 194023's current scheduling priority: 10
# 再看CPU使用率
$ top

可以看到,194023被调整为实时进程后,把CPU占满了,没有给同核心运行的普通进程194022留下任何CPU时间。
所以实时进程的调度是抢占式的,只要其不结束,低优先级进程完全没有机会使用CPU,而对于普通进程而言,多少会留一点CPU时间给其它低优先级的普通进程使用的。
另外,使用ps -l也可以查看进程的PR与NI,如下:
$ ps -lp 194022 194023
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
1 R 0 194022 194017 97 80 0 - 964 - ? 1943:32 stress -c 2
1 R 0 194023 194017 2 49 - - 964 - ? 52:08 stress -c 2
看PRI这一列,可以发现,194022在top中是20,在ps中是80,而194023在top中是-11,在ps中是49,它们都相差60。
是的,他们含义是一致的,只是显示的基准值不同而已,top中0以下代表实时进程,而ps -l中60以下代表实时进程。
往期内容#
[转帖]Linux命令拾遗-top中的%nice是啥的更多相关文章
- Linux命令工具 top详解
Linux命令工具 top详解 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top是一个动态显示过程,即可以通过用户按键来不 ...
- 2018/03/11 每日一个Linux命令 之 top
每日一个Linux命令 之 top 今天在公司测试服务器上跑了一个我写的功能[本地测试过的],但是不知道怎么跑了个无限死循环出来,一个文件的体积在不停的变大,如果不管的话这能行? 上去一看,PHP ...
- 每天一个linux命令之top
每天一个linux命令之top 转 https://www.linuxprobe.com/chapter-02.html 在图2-6中,top命令执行结果的前5行为系统整体的统计信息,其所代表的含义 ...
- linux命令---查找文件中的内容
linux命令---查找文件中的内容 [yang@localhost ~]$ cat 1.txt |egrep '123456789|second'-------匹配123456789或者seco ...
- [转帖]Linux命令中特殊符号
Linux命令中特殊符号 转自:http://blog.chinaunix.net/uid-16946891-id-5088144.html 在shell中常用的特殊符号罗列如下:# ; ;; . ...
- Linux命令:TOP
top命令 是Linux下常用的性能 分析工具 ,能够实时显示系统 中各个进程的资源占用状况,类似于Windows的任务管理 器.下面详细介绍它的使用方法. top - 02:53:32 up 16 ...
- 每天一个linux命令(34)--top命令
今天给领导发邮件,我这边虽然显示发出去了,但是他那边一直没收到,结果我以为我发了,他又一直在那边等结果.所以说,以后要另外发个信息或者QQ微信之类的说一声. top命令是Linux 下常用的性能分析工 ...
- linux命令总结top命令
简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按 ...
- linux 命令——44 top (转)
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top是 一个动态显示过程,即可以通过用户按键来不断刷 ...
- 每天一个linux命令:top命令
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top是一个动态显示过程,即可以通过用户按键来不断刷新 ...
随机推荐
- MySQL篇:第三章_详解DQL语言
DQL语言的学习 基础查询 一.语法: SELECT 要查询的东西 [FROM 表名]; 类似于Java中 :System.out.println(要打印的东西); 特点: ①通过select查询完的 ...
- 关于汽车OTA,这篇科普文能告诉你
随着汽车中软件发挥的作用越来越重要,软件定义汽车已经是行业内的共识.汽车行业的发展极有可能最终像手机产业一样,基础硬件差异会越来越小,关键在于汽车给用户的体验的多样性,以及汽车产品在不同场景下满足用户 ...
- 绝了,华为云服务器“The 3”出道,每款都很能打
近年来,随着企业上云转型.互联网信息产业技术不断发展与革新,云服务器在主机市场逐渐占领主导地位,云服务器品牌层出不穷,各家云厂商都想占据一席之地,这也就对各云厂商的提供的云服务器算力和云端服务能力的要 ...
- 认识BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor
本文分享自华为云社区<Spring高手之路13--BeanFactoryPostProcessor与BeanDefinitionRegistryPos>,作者: 砖业洋__ . 在Spri ...
- Spark-submit执行流程,了解一下
摘要:本文主要是通过Spark代码走读来了解spark-submit的流程. 1.任务命令提交 我们在进行Spark任务提交时,会使用"spark-submit -class .....&q ...
- 从 Uber 数据泄露事件我们可以学到什么?
Uber 数据泄露始于一名黑客从暗网市场购买属于一名 Uber 员工的被盗凭证.最初尝试使用这些凭据连接到 Uber 的网络失败,因为该帐户受 MFA 保护.为了克服这一安全障碍,黑客通过 What' ...
- 火山引擎DataLeap基于Apache Atlas自研异步消息处理框架
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 字节数据中台DataLeap的Data Catalog系统通过接收MQ中的近实时消息来同步部分元数据.Apache ...
- Linux 查找进程所在目录
查找进程所在目录位置 # 打出进程ID [root@iZuf64tp28136djioi3ki8Z /]# ps -ef|grep redis root 3451 1 0 Jun10 ? 07:02: ...
- peewee 操作 sqlite 锁表问题分析
在使用python orm 框架 peewee 操作数据库时时常会抛出以一个异常,具体的报错就是 database is locked 初步了解是因为sqlite锁的颗粒度比较大,是库锁.当一个连接在 ...
- EXECL函数
1 COUNTIF 对比两列数据,有相同的即计为1 找一列空白列,输入=COUNTIF(范围,条件),按回车,然后再点击表格右下角的"+" 就可以拉动持续执行这个函数 2 CONC ...