Linux内核调度程序(也称为进程调度程序)是内核的一个组件,负责从所有准备执行的进程中选择接下来运行的最合适的进程,它管理系统中这些进程之间的CPU时间分配。当一个进程仅等待CPU时间并准备好执行时,该进程被认为是可运行的。
调度程序在Linux中形成了多任务处理的核心,使用基于优先级的调度算法来在系统中选择可运行的进程。它根据最值得的进程以及对CPU时间的需求对进程进行排名。
在本文当中,小编将简要介绍Linux内核调度程序和进程优先级,主要包括如何使用修改后的优先级运行程序或命令,以及如何更改正在运行的Linux进程的优先级。
理解进程优先级和Nice值
Linux内核中存储了大量有关进程的信息,包括进程优先级,即附加到进程的调度优先级。具有较高优先级的进程将先于具有较低优先级的进程执行,而具有相同优先级的进程则被一个接一个地重复调度。
Linux中总共实现了140个优先级和两个不同的优先级范围。第一个是Nice值(niceness),范围从-20
(最高优先级值)到19
(最低优先级值),默认值是0
,这也是本文我们所以介绍的主要内容。另一个是实时优先级,默认范围为1到99 ,然后100到139是用于用户空间优先级。
Linux系统的一个重要特性是基于优先级的动态调度,它允许根据你的需要更改(增加或减少)进程的Nice值,稍后会看到。
检查Linux进程的Nice值
要查看进程的Nice值,可以使用ps、top或htop等实用程序。
使用ps命令以用户定义的格式查看进程的nice值(此处NI
列显示进程的niceness)。
ps -eo pid,ppid,ni,comm
或者,也可以使用top或htop实用程序来查看Linux进程的nice值,命令如下:
top htop
PR或PRI与NI之间的区别
从上面的top和htop输出中,你会注意到有一个分别称为PR
和PRI
的列,它显示了进程的优先级。因此,这意味着:
NI
:这是nice值,它是一个用户空间的概念PR
或者PRI
:进程在Linux内核中实际的优先级
计算PR或PRI值方法
优先级总数=140 实际优先级范围(PR或PRI):0到99 用户空间优先级范围:100到139
Nice值范围(NI):-20到19
PR = 20 + NI PR = 20 + (-20 到 + 19) PR = 20 + -20 到 20 + 19 PR = 0 到 39 ,与用户空间优先级100到139相对应
但是,如果看到一个rt
而不是如下截图所示的数字,则基本上意味着该进程正在实时调度优先级下运行。
Linux运行具有给定Nice值的命令
接下来将介绍如何确定程序或命令的CPU使用率的优先级。如果你有一个非常占用CPU资源的程序或任务,同时你也知道它可能需要很长时间才能完成,则可以使用Nice命令将其设置为高或有利的优先级。
语法如下:
nice -n niceness-value [command args] 或者 nice -niceness-value [command args] 或者 nice --adjustment=niceness-value [command args]
几下几点需要注意:
- 如果未提供任何值,nice默认设置优先级为10。
- 没有nice默认情况下运行的命令或程序的优先级为零。
- 只有root权限才能运行具有更高优先级或高优先级的命令或程序。
- 普通用户只能运行低优先级的命令或程序(即只能增加进程的Nice值)。
例如,你可以使用以下Nice命令以特定优先级启动程序或命令,而不是使用默认优先级启动程序或命令:
sudo nice -n 5 tar -czf backup.tar.gz ./Documents/* 或者 sudo nice --adjustment=5 tar -czf backup.tar.gz ./Documents/*
此外,你还可以使用第三种方法,该方法有点令人困惑,特别是对于负的Nice值,不小心比较容易弄错:
sudo nice -5 tar -czf backup.tar.gz ./Documents/*
更改Linux中进程的调度优先级
正如我们之前提到的,Linux允许基于优先级的动态调度。因此,如果程序已经在运行,可以使用以下形式的renice命令更改其优先级:
renice -n -12 -p 1055 renice -n -2 -u apache
从下图的Top输出中可以看出, PID为1055的teampe+的nice值现在为-12
,并且对于用户apache拥有的所有进程而言,其nice值为-2
。
仍然使用这个输出,使用公式PR= 20 + NI,可以看到:
ts3server进程的PR = 20 + -12 = 8 apache进程的PR=20 + -2 = 18
使用renice命令对用户进程的nice值进行的任何更改都只适用于下次重新启动之前,要设置永久性的默认值,请阅读以下内容。
设置特定用户进程的默认Nice值
可以在/etc/security/limits.conf文件中设置特定用户或组的默认nice值,其主要功能是定义通过PAM登录的用户的资源限制。
为用户定义限制的语法如下(该文件中解释了各个列的可能值):
#<domain> <type> <item> <value>
现在使用下面的语法,其中“hard”意味着强制执行硬限制(实际的限制值),“soft”意味着强制执行软限制(系统允许的临界值):
<username> <hard|soft> priority <nice value>
或者,在/etc/security/limits.d/下创建一个文件,该文件覆盖上面主文件中的设置,这些文件按字母顺序读取。
例如,首先为用户ecscoupon创建文件/etc/security/limits.d/ecscoupon-priority.conf:
vi /etc/security/limits.d/ecscoupon-priority.conf
然后添加这个配置:
ecscoupon hard priority 10
保存并关闭文件。从现在开始,ecscoupon用户拥有的任何进程的nice值为10,PR为30。
有关更多信息,请阅读Nice和renice的手册页:
man nice man renice
总结
本文小编主要介绍了Linux内核调度程序和进程优先级,同时包括使用修改后的优先级运行程序或命令,并更改了活动Linux进程的优先级。如果对Linux进程优先级不知道如何设置的话,可以参考上述教程。
简单来说,Linux内核调度程序是Linux操作系统内核的一部分,负责管理系统中运行的进程和线程的调度。它决定了在给定的时间点哪个进程或线程将在CPU上执行,并管理它们的执行顺序和时间片分配。