调度进程
单个 CPU一次只能执行一个进程,虽然 Linux 系统通过使用多任务同时处理多个进程,但当多个进程同时运行在一个CPU 上时,它通过交错执行这些进程。
内核使用进程调度器来决定在某一时间点上哪个进程在运行。调度器必须平衡几个选项:
-
快速决定下一个该运行的进程
-
进程可以公平的活动 CPU 时间,但高优先级的进程会活动更多的运行时间并且可以抢占低优先级的进程。
-
响应有力的交互式应用程序
-
在各种工作负载下可预测和可扩展
进程优先级
在 Linux 中,调度器根据分配给每个线程或进程的调度策略和优先级来控制执行顺序。
这些调度策略分为:实时策略和非实时策略。
调度策略
RHEL提供六种调度策略,分为实时调度策略和非实时调度策略。
1、实时
SCHED FIFO:不带时间分片的先进先出策略。拥有该策略的进程会一直运行,直到被I/O 阻塞或是更改优先级的进程抢占。
SCHED RR:该策略使用时间片循环调度算法,具体同样优先级的任务轮询执行,直到耗尽预定的时间片。
2、非实时
SCHED_NORMAL(OTHER):linux 系统中大多数进程使用的默认策略。
SCHED BATCH:适合批量处理的进程。
SCHED IDLE:该策略有利于运行低优先级应用程序,
CFS 调度
从 2.6.23 版本的内核开始,CFS 就成为默认的调度程序。CFS 使用红黑树来管理可运行的进程。它是基于虚拟时间(virtualtime)。
拥有虚拟时间最长,等待时间最长的进程将获得使用 CPU。该进程在执行期间,虚拟时间将开始减少。
DEADLINE 调度
在 RHEL8 中,引入了一个新的调度策略 SCHED DEADLINE。该调度主要应用在实时系统中,保证实时任务的有效调度。
Deadline 调度使用三个参数:周期、期限和运行时间(最坏情况的运行时间)
-
周期:如果一个视频处理任务必须每秒处理60帧,新的帧每隔 16ms(毫秒)会到来,则周期为 16ms。
-
期限:指任务需要交付结果的最长时间,必须在这个期限结束前完成任务。
-
运行时间:表示处理一个任务的最长时间。
注意:单位都为 ns。
上面的例子表示:该任务将在每 16.6ms内确保得到 5ms的CPU 时间来运行,并且5ms 的 CPU 运行时间都可以在 10ms 期限内保证可用。
使用命令行方式更改调度选项
管理员可以使用 chrt 命令查看某个进程(-p)的策略和优先级。同时当使用 chrt 开启一个新程序时,需要制定策略和优先级,如果未指定策略,默认是 SCHED RR.
策略选项:
-b 指定为 SCHED BATCH
-f 指定为 SCHED FIFO
-i 指定为 SCHED IDLE
-o 指定为 SCHED NORMAL(OTHER)
-r 指定为 SCHED RR
-d 指定为 SCHED DEADLINE
例如为某个新进程指定策略和优先级:
使用 systemd 的方式更改调度选项
在服务启动时指定调度策略和优先级,需要在[Service]段落中指定:
-
CPUSchedulingPolicy:设置服务的CPU 调度策略。other,batch,idle,fifo,rr。(当前不支持 deadline 策略)
-
CPUSchedulingPriority:设置优先级,对于实时调度策略,范围是1(最低)-99(最高)
完成后,需要重启 systemctl daemon-reload,然后再重启服务