Vrutime Nice

一、进程调度器

(一)概念

进程调度器是操作系统内核的重要组成部分,它负责决定在多个等待执行的进程中,哪一个将获得 CPU 资源并在何时执行。在多任务操作系统中,由于 CPU 资源是有限的,同一时刻只能有一个进程在 CPU 上运行(单核 CPU 情况),因此需要进程调度器来合理分配 CPU 时间片,以确保系统的高效、公平和稳定运行。 调度算法

不同的调度算法适用于不同的场景,常见的调度算法有:

先来先服务(FCFS):按照进程到达的先后顺序进行调度,先到达的进程先执行,直到完成或阻塞。这种算法简单公平,但可能导致长进程长时间占用 CPU,使短进程等待时间过长。

短作业优先(SJF):优先调度预计执行时间最短的进程。可以提高系统的吞吐量,但难以准确预估进程的执行时间,并且可能导致长进程饥饿。

时间片轮转(RR):将 CPU 时间划分为固定长度的时间片,每个进程轮流在一个时间片内执行。当时间片用完后,进程被暂停,调度器选择下一个进程执行。这种算法保证了每个进程都能在一定时间内获得 CPU 资源,响应性较好,常用于分时系统。

优先级调度:为每个进程分配一个优先级,调度器总是选择优先级最高的进程执行。优先级可以根据进程的类型、重要性等因素确定。但可能会出现低优先级进程长时间得不到执行的情况。

完全公平调度(CFS):现代 Linux 内核中主要的调度器。CFS 基于虚拟运行时间的概念,为每个进程维护一个虚拟运行时间,总是选择虚拟运行时间最短的进程执行,确保每个进程都能公平地获得 CPU 时间。

(二)作用

资源分配:合理分配 CPU 资源,提高 CPU 的利用率。

响应性:保证交互式进程能够快速响应用户的操作,提供良好的用户体验。

公平性:确保每个进程都能获得一定的 CPU 时间,避免某些进程独占资源。

系统稳定性:在系统负载过高时,通过调整调度策略,保证系统的稳定运行。

二、chrt 指令

(一)功能概述

chrt 是 Linux 系统中的一个命令行工具,用于查看和修改进程的调度策略和优先级。通过 chrt 命令,用户可以手动调整进程的调度行为,以满足不同的应用需求。

(二)基本语法

chrt [选项] [优先级] [命令 [参数...]]

常用选项

-p:查看或修改已存在进程的调度策略和优先级。例如,查看 PID 为 1234 的进程的调度信息:

chrt -p 1234

-f:使用实时 FIFO(先进先出)调度策略。实时进程具有较高的优先级,能够优先获得 CPU 资源。例如,将 PID 为 1234 的进程设置为实时 FIFO 调度策略,优先级为 50:

sudo chrt -f -p 50 1234

-r:使用实时 RR(时间片轮转)调度策略。与 FIFO 不同,RR 调度策略为每个实时进程分配一个时间片,当时间片用完后,进程会被暂停,调度器选择下一个实时进程执行。例如,将新启动的 top 命令设置为实时 RR 调度策略,优先级为 20:

sudo chrt -r 20 top

-o:使用普通调度策略(CFS)。例如,将 PID 为 1234 的进程恢复为普通调度策略:

sudo chrt -o -p 0 1234
💡

注意事项

权限要求:修改实时调度策略和优先级需要 root 权限,因为实时进程可能会对系统性能产生较大影响,为了保证系统的稳定性,需要进行严格的权限控制。

优先级范围:实时调度策略的优先级范围通常是 1 到 99,数值越大,优先级越高。普通调度策略(CFS)没有显式的优先级参数,而是通过 nice 值来调整进程的相对优先级。

(三)示例

以下是一个完整的示例,展示如何使用 chrt 命令修改进程的调度策略和优先级:

# 启动一个 CPU 密集型进程
yes > /dev/null &
PID=$!
 
# 查看进程的初始调度信息
chrt -p $PID
 
# 将进程设置为实时 FIFO 调度策略,优先级为 30
sudo chrt -f -p 30 $PID
 
# 再次查看进程的调度信息
chrt -p $PID
 
# 终止进程
kill $PID

通过上述示例,可以看到如何使用 chrt 命令查看和修改进程的调度策略和优先级,从而更好地控制进程的执行行为。

三. vruntime(虚拟运行时间)

(一)概念

vruntime 是 Linux 内核中完全公平调度器(CFS,Completely Fair Scheduler)里的核心概念。CFS 的设计目标是让每个进程都能公平地使用 CPU 资源,而 vruntime 就是衡量进程使用 CPU 时间公平性的一个指标。简单来说,vruntime 反映了一个进程实际占用 CPU 的时间,并且会根据进程的优先级进行调整。

(二)工作原理

累积计算:每个进程在获得 CPU 时间片执行时,其 vruntime 会不断增加。增加的量与进程在 CPU 上运行的实际时间相关,同时也和进程的优先级有关。对于优先级高的进程,其 vruntime 增长相对较慢;而优先级低的进程,vruntime 增长相对较快。

调度依据:CFS 调度器在选择下一个要执行的进程时,会优先选择 vruntime 最小的进程。这意味着那些之前获得 CPU 时间较少的进程,其 vruntime 相对较小,会被优先调度执行,从而保证了每个进程都能公平地获得 CPU 时间。

(三)示例说明

假设系统中有三个进程 A、B、C,它们的初始 vruntime 都为 0。进程 A 的优先级较高,进程 B 为普通优先级,进程 C 的优先级较低。当它们依次获得 CPU 时间片执行时,进程 A 的 vruntime 增长速度会比进程 B 慢,而进程 C 的 vruntime 增长速度会比进程 B 快。在调度时,CFS 调度器会优先选择 vruntime 最小的进程执行,以确保每个进程都能公平地使用 CPU 资源。

四. NICE 值

(一)概念

NICE 值是 Linux 系统中用于调整进程优先级的一个参数。它的取值范围通常是 -20 到 19,其中 -20 表示最高优先级,19 表示最低优先级。默认情况下,进程的 NICE 值为 0。

(二)作用

调整优先级:通过修改进程的 NICE 值,可以改变进程在系统中的调度优先级。较高的 NICE 值(如正数)意味着进程的优先级较低,会让出更多的 CPU 时间给其他进程;较低的 NICE 值(如负数)则表示进程的优先级较高,会优先获得 CPU 时间。

系统资源管理:NICE 值可以帮助系统管理员更好地管理系统资源。例如,在系统负载较高时,可以将一些不重要的进程的 NICE 值调高,以减少它们对 CPU 资源的占用,保证关键进程的正常运行。

相关命令

nice 命令:用于在启动新进程时指定其 NICE 值。例如,启动一个 top 进程,并将其 NICE 值设置为 10:

nice -n 10 top

renice 命令:用于修改已经运行的进程的 NICE 值。例如,将 PID 为 1234 的进程的 NICE 值修改为 5:

renice 5 -p 1234

(三)与 vruntime 的关系

在 CFS 调度器中,NICE 值会影响进程的 vruntime 增长速度。NICE 值越低(优先级越高),进程的 vruntime 增长越慢;NICE 值越高(优先级越低),进程的 vruntime 增长越快。这样,CFS 调度器就能根据进程的优先级和 vruntime 来公平地调度进程。例如,一个 NICE 值为 -10 的进程,其 vruntime 增长速度会比 NICE 值为 0 的进程慢,从而更有可能被优先调度执行。