操作系统底层技术——CPU亲和性

头图是加拿大lake simcoe自然风光,非常漂亮,基本没有中国游客,适合深度游。

这是操作系统底层技术第二篇,前一篇是《Codegen技术学习

CPU亲和性

简单地说,CPU亲和性(affinity)就是进程要在某个给定的CPU上尽量长时间地运行而不被迁移到其他处理器的倾向性。

Linux内核进程调度器天生就具有被称为软CPU亲和性(affinity)的特性,这意味着进程通常不会在处理器之间频繁迁移。这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。2.6版本的Linux内核还包含了一种机制,它让开发人员可以编程实现硬CPU亲和性(affinity)。这意味着应用程序可以显式地指定进程在哪个(或哪些)处理器上运行。

原理

什么是Linux内核硬亲和性(affinity)?在Linux内核中,所有的进程都有一个相关的数据结构,称为task_struct。这个结构非常重要,原因有很多;其中与亲和性(affinity)相关度最高的是cpus_allowed位掩码。这个位掩码由n位组成,与系统中的n个逻辑处理器一一对应。具有4个物理CPU的系统可以有4位。如果这些CPU都启用了超线程,那么这个系统就有一个8位的位掩码。如果为给定的进程设置了给定的位,那么这个进程就可以在相关的CPU上运行。因此,如果一个进程可以在任何CPU上运行,并且能够根据需要在处理器之间进行迁移,那么位掩码就全是1。实际上,这就是Linux中进程的缺省状态。

Linux内核API提供了一些方法,让用户可以修改位掩码或查看当前的位掩码:

   sched_set_affinity()(用来修改位掩码)
   sched_get_affinity()(用来查看当前的位掩码)

注意,cpu_affinity会被传递给子线程,因此应该适当地调用sched_set_affinity。

为什么应该使用硬亲和性(affinity)?通常Linux内核都可以很好地对进程进行调度,在应该运行的地方运行进程(这就是说,在可用的处理器上运行并获得很好的整体性能)。内核包含了一些用来检测CPU之间任务负载迁移的算法,可以启用进程迁移来降低繁忙的处理器的压力。

一般情况下,在应用程序中只需使用缺省的调度器行为。然而,您可能会希望修改这些缺省行为以实现性能的优化。让我们来看一下使用硬亲和性(affinity)的2个原因。

原因1.充分利用cpu cache

如果一个给定的进程迁移到其他地方去了,那么它就失去了利用CPU缓存的优势。实际上,如果正在使用的CPU需要为自己缓存一些特殊的数据,那么所有其他CPU都会使这些数据在自己的缓存中失效。

因此,如果有多个线程都需要相同的数据,那么将这些线程绑定到一个特定的CPU上是非常有意义的,这样就确保它们可以访问相同的缓存数据(或者至少可以提高缓存的命中率)。否则,这些线程可能会在不同的CPU上执行,这样会频繁地使其他缓存项失效。

原因2保障时间敏感的、决定性的进程的cpu利用

我们对CPU亲和性(affinity)感兴趣的最后一个原因是实时(对时间敏感的)进程。例如,您可能会希望使用硬亲和性(affinity)来指定一个8路主机上的某个处理器,而同时允许其他7个处理器处理所有普通的系统调度。这种做法确保长时间运行、对时间敏感的应用程序可以得到运行,同时可以允许其他应用程序独占其余的计算资源。

应用场景

使用cpu亲和技术会显著提高cpu利用率,但是同时带来的副作用是丧失程序的扩展性,应用程序需要单独设置。这项技术在一些需要高性能,软硬结合的场景下非常有效。

云的核心技术就是虚拟化技术,首先是虚拟化技术,Cpu亲和技术在云上因此失效。

原文发布于微信公众号 - 大数据和云计算技术(jiezhu2007)

原文发表时间:2016-07-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏HappenLee的技术杂谈

分布式系统的烦恼------《Designing Data-Intensive Applications》读书笔记11

当我们在使用单机系统时,它通常以一种相当可预测的方式工作:要么它正常工作,要么不工作。

622
来自专栏沃趣科技

ASM 翻译系列第十一弹:高级知识 Offline or drop?

原作者:Bane Radulovic 译者: 庄培培 审核: 魏兴华 DBGeeK社群联合出品 Offline or drop? 当一个ASM磁盘不...

3444
来自专栏高性能服务器开发

4 关于游戏服务端架构的整理

一个大型的网落游戏服务器应该包含几个模块:网络通讯,业务逻辑,数据存储,守护监控(不是必须)。其中业务逻辑可能根据具体需要,又划分为好几个子模块。

914
来自专栏Java架构师进阶

浅谈Nginx负载均衡与F5的区别

笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道“墙”,将请求分发到web服务器后,web服务器上的Ng...

591
来自专栏aCloudDeveloper

网络虚拟化

前言 网络虚拟化相对计算、存储虚拟化来说是比较抽象的,以我们在学校书本上学的那点网络知识来理解网络虚拟化可能是不够的。 在我们的印象中,网络就是由各种网络设备(...

1948
来自专栏CaiRui

局域网技术

2.1 局域网的概念 1.数千米范围内额几台到数百台小型计算机或微型计算机通过通信线缆连接而形成的计算机系统称为计算机局域网络。局域网简称LAN,是Local ...

1779
来自专栏云计算爱好者

更新弹幕系统的心得体会

16年开始很多互联网公司都开始在涉足直播,直播业务中有弹幕的系统。今天就要给大家介绍一下弹幕系统优化的新的体会。随着直播业务的变化与发展,我司弹幕系统从最初的版...

23010
来自专栏蓝天

设计mooon调度器遇到的难题

进程模型是指内核为一个独立的进程,而每个业务又为独立的一个进程,业务可以为多线程,同时内核会产生相应个数的内核线程与业务线程一一对应,内核线程和业务进程在创建业...

572
来自专栏加米谷大数据

技术干货 | MapReduce作业调度

可以通过设置mapred.job.priority属性或JobClient的setJobPriority()方法来设置优先级(在这两种方法中,可以选VERY_H...

2546
来自专栏aoho求索

NSQ深入与实践

1. 介绍 最近在研究一些消息中间件,常用的MQ如RabbitMQ,ActiveMQ,Kafka等。NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开...

3919

扫码关注云+社区