如何让进程或线程独占CPU核

这篇具有很好参考价值的文章主要介绍了如何让进程或线程独占CPU核。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

核孤立和绑定是一种有效的性能优化手段,能够有效降低关键线程或进程时延,提升运行稳定性。本文前两节描述如何尽量将其他用户或内核线程隔离在指定核心之外,第三节介绍如何将时延敏感进程绑定到指定隔离好的孤立核心上。

1 Core Isolation

1.1 使用tuned实现核孤立

redhat官方推荐使用tuned及其tuned-profiles-realtime模式来做核孤立

  1. 安装:yum install tuned tuned-profiles-realtime
  2. 修改/etc/tuned/realtime-variables.conf文件,配置isolated_cores=cpulist,cpulist使用逗号隔开,可是cpu标号或者标号范围,如isolated_cores=0-3,5,7。一旦设置了isolated_cores,任何用户空间线程都不会被分配在这些CPU核心上。
  3. 使用tuned-adm来激活tuned的配置:tuned-adm profile realtime
  4. 重启:reboot

1.2 tuna工具

tuna可以方便实现核孤立,修改IRQ,修改线程的调度策略及优先度信息,详见参考[REF.5]

tuna --cpus=cpu_list --isolate

1.3 直接修改grub实现核孤立

将列表中的CPU从内核SMP平衡和调度算法中剔除,该核心不能执行任何非绑定的内核线程。
提出后并不是绝对不能再使用该CPU的,操作系统仍然可以强制指定特定的进程使用哪个CPU(可以通过taskset来做到)。具体的修改方法是在/boot/grub/grub.conf的kernel列最末尾加上isolcpus=x,y,… (代表将CPUx CPUy隔离),修改后使其grub配置生效后重启。

检查是否生效

查看grub参数:cat /proc/cmdline | grep isolcpus

查看进程当前运行在哪个CPU上:taskset -p [pid]

2 解决中断Interrupt

默认情况下,Linux的中断响应会被平均分配到所有CPU核心上,这样势必会发生写新的数据和指令缓存,而且还会与CPU核心上原来存在的进程产生冲突,影响低延迟线程上的处理时间。

为了解决这个问题,可以将中断(或进程)绑定到指定的CPU核心上,让终端对于低延迟线程的影响尽可能的小;另一方面,绑定的终端(或进程)所需要的代码和数据结构就有更高的可能性位于本地CPU的数据和指令缓存内,而不必进行新的写缓存,从而提高中断响应(或进程)的处理速度。此外,将某一个进程及其相关的中断绑定在同一个CPU核心上,使它们共享缓存线路,可以提高程序性能。还有,将彼此不相关的中断与进程绑定到不同的CPU核心上,可以避免冲突,也可以提高程序性能。

管理中断的初衷是当CPU空闲时即处于IDLE状态时针对CPU的节能考虑,增加了nohz参数,后面慢慢演进可用于针对抖动和时延敏感的CPU优化。

通过配置内核参数可以避免未绑定的定时器的中断,定时器的回调,工作队列和其他内核线程影响时延敏感线程,然而还有一些硬件IRQ需要通过配置irqbalance来做隔离,下面分别对这两个方面进行介绍。

2.1 配置内核参数避免中断

nohz_full

nohz_full指定哪些CPU进入无滴答状态。当指定CPU上只运行一个任务或者运行实时任务时,关掉该CPU的周期tick,内核不会向该CPU上发送计时器信号,减少服务终端和上下文切换。开启nohz_full的同时需要开启nohz,开启nohz后nohz_full这个参数才会生效。

cpu lists格式见[REF.9]

遇到的问题:当设置nohz和nohz_full后,即使cpu处于idle状态或者运行实时任务,仍然会有周期中断(tick)。这是因为CPU从idle状态退出时,会无条件的重启tick,如果这个此时任务队列只有一个任务或者这个任务具有最高优先级,则这个tick只trigger一次,但是这个tick仍然会对正在运行的进程造成干扰。fixed patch(华为藏龙卧虎,牛批):[tip: timers/nohz] tick/nohz: Conditionally restart tick on idle exit - tip-bot2 for Yunfeng Ye

rcu_nocbs

RCU(Read-copy Update)是一个高性能的锁机制,在读多写少的情况下,对于被RCU保护的共享数据,读者不需要获得锁就可以访问(速度快)。但是对于写操作,它首先copy一个副本,然后对副本进行修改,最后使用回调机制在适当的时候将原数据指针指向被修改的数据,因此写速度很慢。

每个CPU上都有一个rcuc的内核线程,用于处理回调工作。使用rcu_nocbs=cpulist这个配置可以指定某些CPU是无回调的,当需要使用回调机制时,将工作转移到其他cpu。若设置了nohz_full会自动做rcu的回调隔离,不用再单独配置。

2.2 配置irqblance避免中断

中断平衡守护进程(irqbalance daemon)会周期性地将中断平均地公平地分配给各个CPU核心,它默认是开启的。一种方法我们可以直接关闭irqblance,中断就不会自动分配到各个核心;另一种方法就是自定义中断平衡策略,可以将时延敏感核心从策略中剔除也就是不接收中断,也可以设置中断的亲和性使中断不会分配到时延敏感核心中,下面逐一介绍。

关闭irqblance

将这个守护进程关闭就可以将中断响应都由CPU0核心处理。

查看守护进程的运行状态:systemctl status irqbalance

关闭守护进程:systemctl stop irqbalance

取消进程,使其开机不会重启:systemctl disable irqbalance

指定CPU脱离irqblance

我们可以通过修改 /etc/sysconfig/irqbalance 配置文件,将指定的CPU核心从中断平衡守护进程的列表中脱离出来,即守护进程不会再将中断分配给这些CPU核心。

打开/etc/sysconfig/irqbalance文件,找到“#IRQBALANCE_BANNED_CPUS=”位置,将注释取消,然后在等号后面填写CPU十六进制掩码,比如

IRQBALANCE_BANNED_CPUS=0000ff00

这里的掩码最多可以有64位,如果系统具有的核心数超过32个,则可以在等号后面添加两个32位掩码,并用逗号隔开,例如

IRQBALANCE_BANNED_CPUS=00000001,0000ff00

就是将8~15和33这9个核心隔离了。

设置中断的CPU亲和性

设置中断的CPU亲和性(affinity),就是让该中断只在指定CPU核心上进行响应,即中断绑定。

通过/proc/interrupts文件查看一下各种中断的响应情况,第一列显示的中断ID号,CPUn列显示的是该中断在第n个CPU核心上的响应次数,倒数第二列是中断类型,最后一列是描述。

利用echo命令将cpu掩码写入/proc/irq /中断ID/smp_affinity文件中,即可实现修改某一中断的CPU亲和性。例如:

echo 0x0004 > /proc/irq/170/smp_affinity

就可以将ID为170的中断的响应绑定到CPU3核心上。当该中断下一次发生时,再查看/proc/interrupts里面的响应数量,会发现CPU3核心的响应次数增加了,而其它核心的响应次数没有改变。

内核官方说明见[REF.10]

3 Core Bind

设置CPU亲和性指定我们的需要绑核的工作进程到前面已配置的孤立核心,

3.1 代码绑核

线程绑核

int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);

进程绑核

int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);

代码示例见[REF.1]和[REF.2]。

3.2 命令行绑核

taskset

查看进程当前运行在哪个CPU上:taskset -p [pid]

指定进程运行在第二个CPU(CPU1)上:taskset -pc 1 进程号

在启动程序时绑定CPU:taskset -c 1 ./test.sh&

Numatcl

安装:yum -y install numactl

绑定CPU:numactl -C 1 ./test.sh&

cpuset

还可以使用cpusets/cgroups,见[REF.12]文章来源地址https://www.toymoban.com/news/detail-427190.html

REF

  1. CPU Affinity | Linux Journal
  2. c - Whole one core dedicated to single process - Stack Overflow
  3. 3.13. Isolating CPUs Using tuned-profiles-realtime Red Hat Enterprise Linux for Real Time 7 | Red Hat Customer Portal
  4. 6.3. Configuration Suggestions Red Hat Enterprise Linux 7 | Red Hat Customer Portal
  5. Chapter 4. Tuna Red Hat Enterprise Linux 7 | Red Hat Customer Portal
  6. pthread_setaffinity_np(3) - Linux manual page (man7.org)
  7. sched_setaffinity(2) - Linux manual page (man7.org)
  8. CPU_SET(3) - Linux manual page (man7.org)
  9. The kernel’s command-line parameters — The Linux Kernel documentation
  10. https://www.kernel.org/doc/Documentation/IRQ-affinity.txt
  11. CPU Isolation - Introduction – by SUSE Labs (part 1) | SUSE Communities
  12. Control Groups — The Linux Kernel documentation

到了这里,关于如何让进程或线程独占CPU核的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【多线程系列-01】深入理解进程、线程和CPU之间的关系

    多线程系列整体栏目 内容 链接地址 【一】深入理解进程、线程和CPU之间的关系 https://blog.csdn.net/zhenghuishengq/article/details/131714191 【二】java创建线程的方式到底有几种?(详解) https://blog.csdn.net/zhenghuishengq/article/details/127968166 【三】深入理解java中线程的生命周期,任务调度 ht

    2024年02月16日
    浏览(34)
  • Linux 查看进程和线程CPU和内存占用情况

    linux 下查看进程内的线程有哪些 首先通过进程名称,假设为SensorDev 找到pid号。 ps -p {pid} -T 可以得到该进程里面运行的各线程的id(表现出来是spid)、对应的线程名称(不超过16字符)、运行时间等; cat /proc/{pid}/status |grep Threads 只能显示线程的个数。 top -p {pid} ,然后按H t

    2024年02月08日
    浏览(47)
  • Python并行处理数据多进程/多线程,榨干你的CPU

      最近在公司实习,给整了个活,像是数学建模一样的数据分析的活,目标是在几个互相有关联的大表中找出满足某条件的那些业务,其中第一步就是把两个表拼起来,就叫它们A和B吧,省略拼表过程中需要的逻辑判断。   两个长为M和N的表,在判断中需要一个M*N级别的

    2024年02月15日
    浏览(40)
  • 如何通过进程获取到程序运行在哪个cpu核心

    如果一个进程使用 taskset 命令明确的被固定(pinned)到 CPU 的特定内核上,你可以使用 taskset 命令找出被固定的 CPU 内核: 查看进程所属核心: 输出显示这个过程被固定在 CPU 内核 3上。 但是,如果你没有明确固定进程到任何 CPU 内核,你会得到类似下面的亲和力列表。 输出

    2024年02月09日
    浏览(29)
  • Node.js 多线程实战:如何有效利用多线程能力

    在  Node.js  的世界中,多线程技术一直是一个受到广泛关注的领域。最初,Node.js 设计为单线程模式。随着技术发展,Node.js 引入了多线程支持,进而利用多核处理器的强大性能,提升了应用性能。接下来的内容将深入探讨 Node.js 如何实现多线程,以及在何种场合应该采用这

    2024年01月20日
    浏览(30)
  • Allegro如何快速删除孤立铜皮操作指导

    Allegro 如何快速删除孤立铜皮操作指导   在做PCB设计的时候,铺铜是常用的设计方式,在PCB设计完成之后,需要删除PCB上孤立的铜皮,即铜皮有网络但是却没有任何连接 如下图 通过Status报表也可以看到Isolated shapes 如何快速地删除孤立铜皮,具体操作如下 点击Shape

    2024年02月06日
    浏览(48)
  • Linux如何查看当前占用CPU和内存最多的进程

    查看占用 CPU 最高的前10个进程 查看占用内存(MEM)最高的前10个进程 输入 top 命令,然后按下大写M按照内存MEM排序,按下大写P按照CPU排序

    2024年02月17日
    浏览(41)
  • 如何在Linux上通过cgroup限制一个进程使用CPU和内存

    Cgroup(Control Group)是 Linux 内核的一个功能,可以通过它来限制进程的 CPU 和内存占用。Cgroup 实现了对系统资源的细粒度控制和管理,可以将一组进程放入同一个 Cgroup 中,并对该 Control Group 中的所有进程共享相应的资源配额。 下面举个实际的例子,演示如何使用 Cgroup 限制一

    2024年02月15日
    浏览(28)
  • 什么是线程?线程和进程的关系?如何创建/查看线程?

    1.1.1 什么是线程 进程进一步细化为线程, 是程序内部的一条执行路径. 一个进程中至少有一个线程. 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间\\\"同时\\\"执行多份代码. 1.1.2 线程存在的意义 ① “并发编程\\\"成为\\\"刚需” 单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就

    2024年02月15日
    浏览(29)
  • 【如何使用getrusage获取消耗的CPU时间和进程使用的最大物理内存】

    getrusage 是一个用于获取系统资源使用情况的函数,它在 Unix 和类 Unix 系统中可用。要使用它,你需要包含 sys/resource.h 头文件。下面是一个简单的 C++ 示例程序,用于获取进程的资源使用情况: 使用 RUSAGE_SELF 常量,表示获取当前进程的资源使用情况。你可以根据需要使用其他

    2023年04月23日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包