0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

马哥Linux运维 来源:马哥Linux运维 2024-12-05 16:38 次阅读

一、调度策略

调度进程

单个 CPU一次只能执行一个进程,虽然 Linux 系统通过使用多任务同时处理多个进程,但当多个进程同时运行在一个CPU 上时,它通过交错执行这些进程。

内核使用进程调度器来决定在某一时间点上哪个进程在运行。调度器必须平衡几个选项:

快速决定下一个该运行的进程

进程可以公平的活动 CPU 时间,但高优先级的进程会活动更多的运行时间并且可以抢占低优先级的进程。

响应有力的交互式应用程序

在各种工作负载下可预测和可扩展

进程优先级

在 Linux 中,调度器根据分配给每个线程或进程的调度策略和优先级来控制执行顺序。

这些调度策略分为:实时策略和非实时策略。

调度策略

RHEL提供六种调度策略,分为实时调度策略和非实时调度策略。

c8ab4f12-afde-11ef-93f3-92fbcf53809c.png

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。

期限:指任务需要交付结果的最长时间,必须在这个期限结束前完成任务。

运行时间:表示处理一个任务的最长时间。

c8b62d9c-afde-11ef-93f3-92fbcf53809c.png

注意:单位都为 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

例如为某个新进程指定策略和优先级:

c8cb16f8-afde-11ef-93f3-92fbcf53809c.png

使用 systemd 的方式更改调度选项

在服务启动时指定调度策略和优先级,需要在[Service]段落中指定:

CPUSchedulingPolicy:设置服务的CPU 调度策略。other,batch,idle,fifo,rr。(当前不支持 deadline 策略)

CPUSchedulingPriority:设置优先级,对于实时调度策略,范围是1(最低)-99(最高)

c8da9ee8-afde-11ef-93f3-92fbcf53809c.png


完成后,需要重启 systemctl daemon-reload,然后再重启服务

二、CPU亲和性

Pinning 进程

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

c8f20092-afde-11ef-93f3-92fbcf53809c.png

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

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

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

c8fd5c94-afde-11ef-93f3-92fbcf53809c.png

使用 cgroup 管理 CPU 亲和性

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

NUMA

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

c90a3716-afde-11ef-93f3-92fbcf53809c.png

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

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

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

链接:https://www.cnblogs.com/OpenSourceSite/p/18567209

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10850

    浏览量

    211517
  • Linux
    +关注

    关注

    87

    文章

    11285

    浏览量

    209265

原文标题:Linux之CPU调度策略和CPU亲和性

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式Linux系统CPU控制常见办法测试

    不是实时。为了保证实时,可以根据应用场景,对CPU实行更加精确的控制。常见的办法有,进程CPU隔离、CPU
    的头像 发表于 11-26 14:17 5104次阅读

    Linux内核进程管理与调度策略优化与实践分析

    相关的优先级,如果有多个可执行的进程等待CPU资源,那么具有更高优先级的进程将优先被调度执行。今天就给大家讲解一下Linux内核中的进程管理和
    发表于 05-08 09:42 1124次阅读
    <b class='flag-5'>Linux</b>内核进程管理与<b class='flag-5'>调度</b>:<b class='flag-5'>策略</b>优化与实践分析

    【Nanopi2试用体验】高级(十):进程绑定CPU核心

    NanoPi2具有4个CPU核心。当运行一个程序时,想让它运行在特定的CPU核心上。那就要改变CPU亲和性(affinity)了。那么什么是CPU
    发表于 02-03 17:28

    Linux系统调度简介

    )线程的情况下,只有当系统产生软时间中断时,CFS才会被调用来判断下一个执行的线程并使其占有CPU开始执行,这个现象看起来就好象是Linux调度策略简单的给每个线程分配了10ms的时间
    发表于 01-18 14:12

    干货分享:基于嵌入式Linux中进程调度实现方法

    可运行队列中。Linux 的进程调度采用了动态优先级 和权值调控的方法,既可实现上述三种调度策略,又能保证实时进程总是比普通进程优先使用 CPU
    发表于 12-10 14:17

    CPU频率调度策略有哪些?

    CPU频率调度策略有哪些?
    发表于 03-10 06:54

    技术术语CPU术语篇

    技术术语CPU术语篇
    发表于 06-30 19:45 1224次阅读

    基于GPU/CPU的流程序多粒度划分与调度

    并实现了面向GPU/CPU混合架构的数据流程序任务划分方法和多粒度调度策略,包括任务的分类处理、GPU端任务的水平分裂和CPU端离散任务的均衡化,构造了软件流水
    发表于 11-23 14:29 0次下载

    一种灵活高效的虚拟CPU调度算法

    目前,虚拟化已经广泛应用于数据中心,但主流的虚拟CPU调度策略并没有实现对I/O性能的保障,尤其是当延时敏感型负载的虚拟机和计算敏感型负载的虚拟机竞争CPU资源时,其性能显著下降.针对
    发表于 01-02 17:51 0次下载

    linux CPU是这样动态调频

    针对sep4020的linux低功耗研究也有一段时间了,基本把低功耗的实现方式想清楚了(主要分成机制和策略),这段时间的工作主要在机制上。暂时想实现的主要的机制有:cpu级,设备驱动级,系统平台级。管理颗粒度不断递增,形成三驾马
    发表于 04-22 17:26 1622次阅读
    <b class='flag-5'>linux</b> <b class='flag-5'>CPU</b>是这样动态调频

    Linux 中线程与 CPU 核的绑定

    最近在对项目进行性能优化,由于在多核平台上,所以了解了些进程、线程绑定cpu核的问题,在这里将所学记录一下。不管是线程还是进程,都是通过设置亲和性(affinity)来达到目的。对于
    发表于 04-02 14:40 1083次阅读

    Linux CPU的性能应该如何优化

    Linux系统中,由于成本的限制,往往会存在资源上的不足,例如 CPU、内存、网络、IO 性能。本文,就对 Linux 进程和 CPU 的原理进行分析,总结出
    的头像 发表于 01-18 08:52 3370次阅读

    Linux发行版CPU漏洞及修复

    Linux 操作系统发行版,其深度集成与优化阿里云基础设施,旨在为阿里云 ECS 客户提供丰富功能、高性能且稳定的操作系统服务,欢迎大家使用。) 然而在测试过程中发现很多子系统例如网络子系统的性能与 CPU 调度性能密切相关
    的头像 发表于 10-08 14:54 2263次阅读

    容器进程调度时是该优先考虑CPU资源还是内存资源

    当然实际中 k8s 的调度策略不是这么简单的,系统默认的 kube-scheduler 调度器外还有直接指定Node主机名、节点亲和性、Pod亲和性
    的头像 发表于 08-16 18:20 1345次阅读

    如何将进程与 CPU 进行绑定

    Linux 系统提供了一个名为 sched_setaffinity 的系统调用,此系统调用可以设置进程的 CPU 亲和性。我们来看看 sched_setaffinity 系统调用的原型。
    发表于 10-26 10:29 516次阅读