进程优先级和“nice”概念
Linux进程调度和多任务
现代计算机系统中既包含每次只能执行一个指令的低端处理器,也包含高性能超级计算机,这些超级计算机每台配备数百个CPU,每个CPU上具有多个核心,它们可以并行执行数以百计的指令。但是所有这些系统往往具有一个共同点:它们需要运行的进程数量总是超出了实际具有的核心数。
通过使用称为时间片的技术,Linux(和其他操作系统)实际能够运行的进程数(和线程数)可以超出可用的实际处理单元数。操作系统进程调度程序将在单个核心上的进程之间快速切换,从而给用户一种有多个进程在同事运行的印象。
执行此切换的Linux内核部分称为进程调度程序。
相对优先级
由于不是每种进程都与其他进程同样重要,可告知调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所使用的调度策略称为SCHED_OTHER(也称为SCHED_NORMAL),但还有一些其他策略可用于不同的目的。
由于并非所有进程都以同样的方式创建,可为采用SCHED__NORMAL策略运行的进程指定相对优先级。此优先级称为进程的nice值,一个进程可以有正好40中不同级别的nice值。
这些nice级别的范围是从-20到19。默认情况下,进程将继承其父进程的nice级别,通常为0。nice级别越高,表示优先级越低(该进程容易将其CPU使用量让给其他进程);nice级别越低,表示优先级越高(该进程更加不倾向于让出CPU)。如果不存在资源争用(例如,当活动进程数少于可用CPU核心数时),即使nice级别高的进程也将仍使用它们可使用的所有可用CPU资源。但当请求CPU时间的进程数超过可用核心数时,nice级别较高的进程将比nice级别较低的进程收到更少的CPU时间。
nice级别以及top如何报告nice级别如下图:
nice级别和权限
为很占CPU资源的进程设置较低的nice级别可能会对同一系统上运行的其他进程的性能造成负面影响,所以仅允许root用户(更具体地说,具有CAP_SYS_NICE功能的用户)设置负nice级别以及降低现有的进程的nice级别。
普通非特权用户仅允许设置正的nice级别。此外,他们只能对现有进程提升nice级别,而不能降低nice级别。
重要
除nice级别以外,还有更多方法可以影响进程优先级和资源使用情况。有备用的调度程序策略和设置、控制组(cgroups)等等。但是,nice级别是最易于使用的方法,并且不仅系统管理员可以使用,普通用户也可以使用。
使用 nice 和 renice 影响进程优先级
报告 nice 级别
可以通过多种不同的方式查看现有进程的nice级别。大多数进程管理工具(如gnome-system-monitor)默认情况下已显示nice级别,或可以配置为显示nice级别。
使用 top 显示 nice 级别 top命令可用于通过交互方式查看(和管理)进程。在默认配置中,top将显示与nice级别有关的两列:NI表示实际nice级别,而PR将nice级别显示为映射到更大优先级队列:nice级别-20映射到优先级0,而nice级别+19映射到优先级39。
使用ps显示nice级别 ps命令也可以显示进程的nice级别,但它在大多数默认输出格式中并不显示。然而,用户可以通过ps准确请求列出所需的列,而nice字段的名称为nice。
以下示例请求列出所有进程,包括pid、名称和nice级别,按nice级别降序排列:
[root@yih-vps7 ~]# ps axo pid,comm,nice --sort=-nice
PID COMMAND NI
27 khugepaged 19
26 ksmd 5
1 systemd 0
2 kthreadd 0
3 ksoftirqd/0 0
4 kworker/0:0 0
6 kworker/u256:0 0
7 migration/0 -
8 rcu_bh 0
9 rcu_sched 0
启动具有不同 nice 级别的进程
启动进程时,它通常将继承父进程的nice级别。这表示从命令行启动一个进程时,它将与从其启动的shell进程具有相同的nice级别。在大多数情况下,这将导致新进程运行时的nice级别为0。
要启动具有不同nice级别的进程,用户和系统管理员可以使用nice工具运行其命令。不带任何其他选项的情况下,运行nice
[root@yih-vps7 ~]# nice -n 15 dogecoinminer &
更改现有进程的 nice 级别
可以在命令行中使用renice命令来更改现有进程的nice级别。renice命令的语法如下所示:
renice -n <NICELEVEL> <PID>...
例如,要将所有origami@home进程的nice级别更改为-7,系统管理员可以使用以下命令(请注意,可以一次指定多个PID):
[root@yih-vps7 ~]# renice -n -7 $(pgrep origami@home)
也可以使用top命令(以交互方式)更改进程的nice级别。在top中,按r,然后跟要更改的PID和新nice级别。