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,一经查实,立即删除!

相关文章

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

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

linux延时与定时操作

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

Windows Server 2008 部署权限管理RMS

1.1 实战:部署权限管理 试验目的: 在单域环境中部署活动目录权限管理服务,实现文档的保护。 试验环境: ? DCServer安装Windows Server 2008企业版,是ess.com的域控制器,安装企业CA。 ? RMSServer安装Wind…

编写一个字节数的rtu C语言校验程序,Modbus通信协议中CRC校验的快速C语言算法

Modbus通信协议中CRC校验的快速C语言算法2004年第11期            福 建 电 脑  63Modbus通信协议中CRC校验的快速C语言算法孟开元(西安石油大学计算机学院陕西西安710065)【摘 要】 本文主要讨论了Modbus通信协议的RTU帧格式中常用的错误校验方法,即循环冗…

如何让CloudStack使用KVM创建Windows实例成功识别并挂载数据盘

问题产生背景: 使用CloudStack KVM组合进行资源池纳管工作,通过ISO镜像文件创建了两个模板: RHEL6U3 64位系统以及WindowsServer2008 R2 SP1 64位系统。然后通过模板创建实例,挂载外接存储,实例启动后,通过…

云计算openstack介绍

转载于:https://www.cnblogs.com/WIU1905/p/11107593.html

**加密解密基础、PKI及SSL、创建私有CA**

进程间通信 socket通信 客户端-->请求--> 路由转发 --> 服务端,取出资源 --> 封装为可响应给客户端的请求报文从接收请求端口发出 SSL/TLS协议的实现 OpenSSL OpenSSL程序组件 1234[rootlocalhost CA]# rpm -ql openssl /usr/lib/libcrypto.so.10 //加…

5.3 上午

观看英语课程——《恋练有词》 学习Linux 转载于:https://www.cnblogs.com/bgd140206110/p/6801164.html

mysql索引随记

为什么80%的码农都做不了架构师?>>> 先了解下Btree:https://my.oschina.net/u/3646190/blog/1593094 为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半? 通过上面…

c语言写桌面程序unity,Unity和iOS原生界面交互示例

注意上面的Main方法中出现的UnityAppController,该类就是作为控制类来实现Unity在iOS上显示的功能,在Main方法中就是将该控制器作为参数传递,即Main方法之后就会进入该类执行。所以这是我们进入到UnityAppController.mm,来查看该类…

浏览器中插入富文本编辑器

常用的富文本编辑器有CKEditor、UEEditor、TinyEditor、KindEditor等、以下以kindeditor编辑器的使用为例。 1.官网下载KindEditor编辑器http://kindeditor.net/down.php, 当前最新版本为4.1.11,解压缩后放入项目的static目录,作为js插件引用…

获取Extjs文本域中的内容

经常在Ext.select()和Ext.query()等问题上纠结,今天终于有了点新认识: 需求,假设我们的页面上有个panel ,其id为clusterstab_edit_details,这个panel的内部有个textarea,这个textarea的name为editDetails_Description,那么我们有多少方法可以…

Asp.NetCoreWebApi - RESTful Api

REST 常用http动词 WebApi 在 Asp.NetCore 中的实现3.1. 创建WebApi项目.3.2. 集成Entity Framework Core操作Mysql 3.2.1. 安装相关的包(为Xxxx.Infrastructure项目安装)3.2.2. 建立Entity和Context3.2.3. ConfigureService中注入EF服务3.2.4. 迁移数据库3.2.5. 数据库迁移结果…

android动画影子效果,Android TV常用动画的效果,View选中变大且有阴影(手机也能用)...

因为电视屏幕比较大,而我们看电视时距离电视有一定距离,这样就需要动画效果比较明显,这个动画就是应用最广泛的,因为很酷,呵呵,你懂得,看了就知道。效果如下图:public class MainAct…

linux 高可用----keepalived+lvs

什么是高可用? HA(high availability)即高可用性;就是在高可用集群中发生单点故障时,能够自动转移资源并切换服务,以保证服务一直在线的机制。 LVS LVS:(linux virtual server&#…

用户配置相关文件

用户配置相关文件小总结 /etc/passwd 记录用户相关的信息 /etc/shadow 密码影子文件 /etc/group 记录用户组相关的信息 /etc/gshadow 密码影子文件(组密码) /etc/passwd 文件中各段的内容 第1段:用户名 第…

华为5c android n风格,华为荣耀畅玩5C的屏幕怎么样

华为荣耀畅玩5C的屏幕怎么样屏幕方面,华为荣耀畅玩5C采用了5.2英寸1080P级别GFF贴合屏幕,塑料边框采用了弧面状的设计,握感比较舒适。华为荣耀畅玩5C采用了双主天线的设计,分别在上下的塑料区域。此外,边框以及后盖的上…

spring解析配置文件(三)

一、从XmlBeanDefinitionReader的registerBeanDefinitions(doc,resource)开始 1 protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) 2 throws BeanDefinitionStoreException { 3 try { 4 …

使用kibana和elasticsearch日志实时绘制图表

前言: 此文接的是上篇,上次的内容是,用python操作elasticsearch存储,实现数据的插入和查询。 估计有些人一看我的标题,以为肯定是 logstash kibana elasticsearch的组合。这三个家伙也确实总是勾搭在一块。 其实logst…

android 网络调试 源代码,Android源代码调试环境搭建

我们在调试Android应用程序的时候,有时候遇到一些莫名其妙的问题,因此我们需要查看Android内部是如何调用的。我们都知道Android是一个伟大的开源项目,因此debug的时候肯定是支持源代码级别调试的。采用源代码调试,一方面有利于发…