linux 独占 cpu,宋宝华:谈一谈Linux让实时 高性能任务独占CPU的事

本文主要讨论在高实时要求、高效能计算、DPDK等领域,Linux如何让某一个线程排他性独占CPU;独占CPU涉及的线程、中断隔离原理;以及如何在排他性独占的状况下,甚至让系统的timer tick也不打断独占任务,从而实现最低的延迟抖动。网络

阅读本文大约须要20分钟。负载均衡

本文目录:less

工程需求

用户态隔离

内核态隔离

3.1 中断

3.2 内核线程

最佳实践指南

1. 工程需求

在一个SMP或者NUMA系统中,CPU的数量大于1。在工程中,咱们有时候有一种需求,就是让某个可以独占CPU,这个CPU什么都不作,就只作指定的任务,从而得到低延迟、高实时的好处。性能

好比在DPDK中,经过设置线程

GRUB_CMDLINE_LINUX_DEFAULT=“isolcpus=0-3,5,7”

隔离CPU0,3,5,7,让DPDK的任务在运行的时候,其余任务不会和DPDK的任务进行上下文切换,从而保证网络性能最佳[1]。在Realtime应用场景中,经过isolcpus=2隔离CPU2,而后把实时应用经过taskset绑定到隔离的核:3d

taskset-c 2 pn_dev

从而保证低延迟要求[2]。code

2. 用户态隔离

这个地方,咱们能够看出,它们统一都使用了isolcpus这样一个启动参数。blog

实践是检验真理的惟一标准,下面咱们来启动一个8核的ARM64系统,运行Ubuntu,并指定isolcpus=2这个启动参数:进程

e21fe84dea7745269659c364.html

系统启动后,咱们运行下面简单的程序(启动8个进程运行while死循环):文档

e21fe84dea7745269659c364.html

咱们是8核的,如今又是运行8个进程,因此理论上来说,负载均衡后,8个进程应该均分地运行在8个核上面,可是咱们来看看实际的htop结果:

e21fe84dea7745269659c364.html

咱们发现3(也就是CPU2)上面的CPU占用率是0.0%。这实证了CPU2已经被隔离,用户空间的进程不能在它上面跑。

固然,这个时候,咱们能够经过taskset,强行把其中的一个a.out,绑定到CPU2上面去:

e21fe84dea7745269659c364.html

从上面命令的结果看出,663本来的affinity list只有0,1,3-7是没有2的,而咱们强行把它设置为了2,以后再看htop,CPU2上面占用100%:

e21fe84dea7745269659c364.html

经过上面的实验,咱们明显能够看出isolcpus=2使得CPU2上没法再运行用户空间的进程了(除非手动设置affinity)。

3. 内核态隔离

中断

可是,能在CPU2上面运行的,不是只有用户态的任务,还能够有内核线程、中断等,那么isolcpus=可否隔离内核线程和中断呢?

对于中断,咱们特别容易查看,就是实际去验证每一个IRQ的smp_affinity就行了:

5f737e79c53f1543faa65eb546dc0fd8.png

从上图明显能够看出,对于4四、47号这种外设的中断,Linux内核把smp_affinity设置为了FB(11111011),明显避开了CPU2,因此,实际外设中断也不会在CPU2发生,除非咱们强行给中断绑核,好比让44号中断绑定到CPU2:

echo 2 >/proc/irq/44/smp_affinity_list

以后,咱们发现44号中断在CPU2能够发生:

697973837af8abb8307200f46ca18403.png

可是,系统的timer中断、IPI,因为是Linux系统的运行基石,实际仍是要在CPU2上面运行的。这里面最可能给任务带来延迟抖动的,天然是timer tick。

下面咱们重点探讨下tick的问题,因为Linux通常状况下,已经配置IDLE状态的NO_HZ tickless,因此CPU2上面什么都不跑的时候,实际timer中断几乎不发生。

下面,咱们仍是在isolcpus=2的状况下,运行前面那个8个进程的a.out,默认状况下没有任务会占用CPU2。经过前后运行几回cat /proc/interrupts | head 2,咱们会看到其余core的timer中断频繁发生,而CPU2几乎不变,这显然是IDLE时候的NO_HZ在发挥省电的做用:

4895c24708fb11717d765a90803d3c7b.png

可是,一旦咱们听任务到CPU2,哪怕只是放1个,就会发现CPU2上面的timer中断开始增长:

d86533bf00c4fcd4293f3ab630f3c322.png

这说明一点,哪怕隔离的CPU上面只有一个线程去跑,timer tick就会开始跑,固然,这个timer tick也会频繁打断这一个线程,从而形成大量的上下文切换。你确定会以为Linux怎么这么傻,既然只有一我的,那也没有时间片分片的必要,不须要在2个或者多个任务进行时间片划分地调度,为啥还要跑tick?其实缘由是咱们的内核默认只是使能了IDLE的NO_HZ:

0707d6566e12d46151b008625820b5ec.png

咱们来从新编译一个内核,使能NO_HZ_FULL:

cb3d916e4dfa597e0b882df606fd9af0.png

当咱们使能了NO_HZ_FULL后,Linux支持在CPU上仅有1个任务的时候,是能够NO_HZ的。可是有2个就傻眼了,因此这个“FULL”也不是真地FULL[3]。这固然也能够理解,由于有2个就涉及到时间片调度的问题。何时应该使能NO_HZ_FULL,内核文档Documentation/timers/no_hz.rst有明确地“指示”,只有在实时和HPC等的场景,才须要,不然默认的NO_HZ_IDLE是你最好的选择:

703d98a13207ab01765e04f1e6c5906d.png

咱们从新编译了内核,选中了NO_HZ_FULL,下面启动Linux,注意启动的时候参数添加nohz_full=2,让CPU2支持NO_HZ_FULL:

c8dd1162b02451012b2c0b8aaaa9a263.png

从新运行CPU2只有一个任务的场景,看看它的timer中断发生状况:

ba5e69e3fb1912899159407d95090d14.png

发现CPU2上面的tick稳定在188上面,这样相信你会更加开心,由于你独占地更加完全了!

下面,咱们再放一个task进去CPU2,有2个任务的状况下,CPU2上面的timer tick开始增长:

981d4bcfde06db7e74c0a1ea1a378e19.png

不过,这或许不是个问题,由于咱们说好了“独占”,1个任务独占的时候,timer tick不来打扰,应该已是很是理想的状况了!

内核态线程

内核态的线程其实和用户态差很少,当它们没有绑定到隔离的CPU的时候,是不会跑到隔离CPU运行的。下面用笔者在内核里面添加的dma_map_benchmark来作实验[4],开启16个内核线程来进行DMA map和unmap(注意咱们只有8个核):

./dma_map_benchmark -s 120 -t 16

咱们看到CPU2上面的CPU占用也是0:

7f7268699619238f1341f1bbecbaaf19.png

内核里面的dma_map_benchmark线程在狂占CPU0-1, 3-7,可是就是不去占CPU2:

bb7859a142bc1bce359728c920f011f2.png

可是,内核线程若是用kthread_bind_mask()相似API把线程绑定到了隔离的CPU,则状况就不同了,这就相似用taskset把用户态的任务绑定到CPU同样。

4. 最佳实践指南

对于实时性要求高、高性能计算等场景,若是要让某个任务独占CPU,最理想的选择是:

采用isolcpus隔离CPU

将指定任务绑定到隔离CPU

当心意外地把中断、内核线程绑定到了隔离CPU,排查到这些“意外”分子

使能NO_HZ_FULL,则效果更佳,由于连timer tick中断也不打扰你了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode347. 前 K 个高频元素(排序)

给定一个非空的整数数组&#xff0c;返回其中出现频率前 k 高的元素。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2] 示例 2: 输入: nums [1], k 1 输出: [1] 代码 class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer,Integer>…

如何在React中从其父组件更改子组件的状态

by Johny Thomas约翰尼托马斯(Johny Thomas) 如何在React中从其父组件更改子组件的状态 (How to change the state of a child component from its parent in React) We will be building a simple React app which shows the real name of a superhero on a button click.我们…

vue-property-decorator 提供 OO 的风格 Vue Component 方便类型声明

Prop 父子组件之间传值 Install: npm install --save vue-property-decoratorChild: <template><div>{{fullMessage}}</div> </template><script lang"ts">import Vue from vue import {Component, Prop} from vue-property-decorato…

python学习笔记(1)

变量的命名 变量名只能包含字母、数字、下划线&#xff0c;不能以数字打头不要用Python关键字、函数名、保留用于特殊用途的单词作变量名变量名应短且有描述性慎用小写l和大写O字符串 就是一系列字符 在Python中&#xff0c;用引号扩起的都是字符串&#xff0c;引号可以是单引号…

使用这些HTTP标头保护您的Web应用程序

by Alex Nadalin通过亚历克斯纳达林 使用这些HTTP标头保护您的Web应用程序 (Secure your web application with these HTTP headers) This is part 3 of a series on web security: part 2 was “Web Security: an introduction to HTTP”这是有关Web安全的系列文章的第3部分&…

leetcode547. 朋友圈(并查集)

班上有 N 名学生。其中有些人是朋友&#xff0c;有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友&#xff0c;B 是 C 的朋友&#xff0c;那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈&#xff0c;是指所有朋友的集合。 给定一个 N * N 的矩阵 M&#xff0c;表…

linux ssh Unused,安装openssh-portable时遇到的问题及解决办法

问题1&#xff1a;configure: error: Your OpenSSL headers do not match yourlibrary. Check config.log for details.If you are sure your installation is consistent, you can disable the checkby running “./configure –without-openssl-header-check”.Also see cont…

windows 删除删除不掉的文件

DEL /F /A /Q \\?\%1RD /S /Q \\?\%1 windows下删除删除不掉的文件&#xff1a; 1、打开记事本&#xff0c;把上面的命令复制进去 2、保存&#xff0c;后缀名改为.bat&#xff0c;ok 3、把想要删除的文件托放到这个文件的图标上 转载于:https://www.cnblogs.com/Mike_Chang/p…

云计算技术的跃进睿云智合专业先进水平

对于未来的云计算数据中心&#xff0c;网络虚拟化方案需要适应计算和存储虚拟化的浪潮&#xff0c;快速的实现云计算业务的发放&#xff0c;以及能够满足动态的应用程序工作负载的需求;同时需要帮助管理员更简单的管理物理网络和虚拟网络&#xff0c;实现网络可视化。睿云智合&…

CSS 选择器权重计算规则

CSS 选择器&#xff08;Selector&#xff09;的权重&#xff08;Specificity&#xff09;决定了对于同一元素&#xff0c;到底哪一条 CSS 规则会生效。且仅有当多条 CSS 规则都对同一元素声明了相应样式时&#xff0c;才会涉及到权重计算的问题。 选择器的分类 正式计算选择器权…

本地构建和自动化构建_如何构建最强大,最安全的家庭自动化系统

本地构建和自动化构建by Amir Off由Amir Off 如何构建最强大&#xff0c;最安全的家庭自动化系统 (How to build the most robust and secure home automation system) In this article, I’ll discuss how I built a Smart Home Automation System with Angular and Node.js …

leetcode990. 等式方程的可满足性(并查集)

给定一个由表示变量之间关系的字符串方程组成的数组&#xff0c;每个字符串方程 equations[i] 的长度为 4&#xff0c;并采用两种不同的形式之一&#xff1a;“ab” 或 “a!b”。在这里&#xff0c;a 和 b 是小写字母&#xff08;不一定不同&#xff09;&#xff0c;表示单字母…

random对文件随机重命名

对文件随机重命名&#xff0c;这个用途可广了&#xff0c;大家可以想想 echo off setlocal ENABLEDELAYEDEXPANSION for /r %%a in (*.txt) do ( set c!random! ren %%~dpnsa.txt !c!.txt) pause 本文转自sucre03 51CTO博客&#xff0c;原文链接&#xff1a;http://blog…

AC日记——Periodic RMQ Problem codeforces 803G

G - Periodic RMQ Problem 思路&#xff1a; 题目给一段序列&#xff0c;然后序列复制很多次&#xff1b; 维护序列很多次后的性质&#xff1b; 线段树动态开点&#xff1b; 来&#xff0c;上代码&#xff1a; #include <cstdio> #include <cstring> #include <…

数据之路 - Python爬虫 - 数据存储

一、文件存储 1.文件打开方式 文件打开方式说明r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式rb以二进制只读方式打开一个文件。文件指针将会放在文件的开头r以读写方式打开一个文件。文件指针将会放在文件的开头rb以二进制读写方式打开一个文件。文件指针…

创建react应用程序_如何使用React创建一个三层应用程序

创建react应用程序Discover Functional JavaScript was named one of the best new Functional Programming books by BookAuthority!“发现功能JavaScript”被BookAuthority评为最佳新功能编程书籍之一 &#xff01; Splitting a Single Page Application into layers has a …

linux update语句,MySQL 多表 update sql语句总结

MySQL 多表 update 有几种不同的写法。假定我们有两张表&#xff0c;一张表为Product表存放产品信息&#xff0c;其中有产品价格列Price&#xff1b;另外一张表是ProductPrice表&#xff0c;我们要将ProductPrice表中的价格字段Price更新为Price表中价格字段的80%。在Mysql中我…

linux延时与定时操作

1、at ---系统延迟任务发起命令 at time >command ---任务指令 >ctrld ---发起任务 at -l ---列出延时任务Id at -r id ---删除改id任务 at -m ---让无输出的命令产生邮件 at -M ---让有输…

windows修改PowerShell(命令提示符)默认中文编码方式

如果以下方法都没有作用的话&#xff0c;可以直接在代码中调用<stdlib.h>中的system("mode con cp select65001")或者是system("chcp 65001")。当然&#xff0c;前提是你用的也是C、C、C#等强类型编程语言。 **************************************…

leetcode面试题 17.07. 婴儿名字(并查集)

每年&#xff0c;政府都会公布一万个最常见的婴儿名字和它们出现的频率&#xff0c;也就是同名婴儿的数量。有些名字有多种拼法&#xff0c;例如&#xff0c;John 和 Jon 本质上是相同的名字&#xff0c;但被当成了两个名字公布出来。给定两个列表&#xff0c;一个是名字及对应…