Linux之CPU调度策略和CPU亲和性

一、调度策略

调度进程

单个 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,然后再重启服务

二、CPU亲和性

Pinning 进程

默认情况下,调度策略可以将进程放置在任何一个CPU上去执行,但为了增加效率,可以将某个进程与哪些 CPU 进行绑定,提供了缓存命中率,提供了整体性能。

基于 systemd 的服务提供了一种方便的方式,可以在服务单元中的[Service]段落中使用CPUAffinity,设置,该参数接受一个以空格为分隔符的 CPU 索引列表,例如 0 代表第-个CPU,1代表第二个CPU。

使用 tuna 命令查看CPU 绑定
yum install tuna

选顶: -t -P (大写)查看特定线程的信息,例如调度策略,优先级,CPU绑定等

使用 cgroup 管理 CPU 亲和性

在 NUMA 架构中,一个 NUMA 节点上包含了连接在该节点上的 CPU,内存等硬件设备。由此也引出了 CPU 亲和性的概念。即CPU 访问同一个节点中的内存速度最快效率最高。利用 lscpu 命令查看 CPU 处于哪个 NUMA 节点中。

NUMA

NUMA,非一致性内存访问。将不同的CPU核心划分到不同的 node 节点。每个 node都有自己的内存控制器,允许不同 node 中的 CPU 只访问属于同一个 node 的内存区域。
而不同的 node 节点通过 QPI进行通信,如图:

利用 cpuset cgroup 控制器可以将程序绑定到特定的核心上。cuset 目录已经被挂载到了/sys/fs/cgroup 目录下。管理员可以手工对该目录下的文件进行读写(修改)。

  • cpuset.cpus:指定 cgroup 中任务可以访问的CPU 数。“-”代表连续的 CPU 数。

  • Cpuset.mems:指定 cgroup 中的任务可以访问的 NUMA 内存节点。

posted @ 2024-11-25 11:22  *一炁化三清*  阅读(125)  评论(0编辑  收藏  举报