linux应用如何进行cpu绑定

所谓cpu绑定,其实就是对进程或线程设置相应的cpu亲和力(affinity),确保进程或线程只会在设置了相应标志位的cpu上运行,进而提高应用对cpu的使用效率。如果应用可以在多个cpu上运行,操作系统会在cpu之间频繁切换应用,引起cpu缓存失效,降低缓存的命中率,导致cpu的使用效率下降。所以,如果使用cpu绑定技术,在一定程度上会避免上述问题,提升系统性能,类似技术还有gpu绑定、mic绑定等等。

There are only two hard things in Computer Science: cache invalidation and naming things. – Phil Karlton

1 安装taskset

$ yum install util-linux

如果系统没有taskset命令,使用yum安装util-linux即可,这是一个工具集,其中包含了taskset命令。

2 查看应用的cpu亲和力(affinity)

$ taskset -p 14795
pid 14795's current affinity mask: 3
$ taskset -cp 14795
pid 14795's current affinity list: 0,1

示例中,查看进程14795的cpu亲和力,使用-p选项指定需要查询的进程号,默认打印的是一个十六进制数,如果使用-cp选项打印的是一个cpu列表,表示相应的cpu核。3的二进制形式是0011,相应的第0位和第1位都是1,对应了-cp打印的0和1,表示14795进程只能运行在cpu的第0个核和第1个核。

3 将应用绑定到指定的cpu运行

$ taskset -p 0x1 14795
pid 14795's current affinity mask: 3
pid 14795's new affinity mask: 1

$ taskset -cp 0 14795
pid 14795's current affinity list: 0,1
pid 14795's new affinity list: 0

示例中,通过taskset命令重新设置了进程14795的cpu亲和力,前后2种方式设置效果一样,都表示进程14795只能运行在cpu的第0个核。因为-p指定的0x01二进制形式为0001,第0位是1,表示第0个cpu核。-cp直接指定了0,也表示第0个cpu核。

除了通过taskset命令绑定应用到指定的cpu上,也可以通过taskset命令启动应用,并指定应用运行的cpu,例如:

$ taskset 0x1 sleep 10000 &
[2] 14925
$ taskset -p 14925
pid 14925's current affinity mask: 1
$ taskset -cp 14925
pid 14925's current affinity list: 0

示例中,通过taskset启动应用(使用sleep命令模拟应用),并设置相应的cpu亲和力,即进程14925只能运行在cpu的第0个核。启动程序后查看进程的cpu亲和力,和启动时设置的相同。

另外,除了通过taskset命令实现cpu绑定,很多语言都提供了相应的api实现cpu绑定功能,例如c的sched_setaffinitysched_getaffinity,python 3的os.sched_setaffinityos.sched_getaffinity

LEo at 00:05

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

SQL Server 2005的负载均衡

SQL Server 2005仍然不直接地支持负载均衡——但是它为以前SQL Server版本中可用的所有负载均衡方法提供了令人激动的改善和支持。   目录 1...

21510
来自专栏Laoqi's Linux运维专列

Nginx为什么比Apache 高效

什么是阻塞:就是线程在执行IO操作获取数据时,这个IO可能会需要一定的时间才能等到数据返回,然后才能接着执行下面的命令。那么,此时,这个线程的等待状态我们就把它...

3036
来自专栏互联网技术栈

Tair数据迁移三步走

在多机房数据迁移中,整个过程分为三个阶段:历史数据迁移阶段、redolog迁移阶段、实时复制阶段。

1163
来自专栏编程软文

postman从入门到精通

今天总监让我给测试同事们培训postman,使用过postman的朋友应该知道,这个简直就是前后端接口调试神器。根据平时的经验以及自己到网上看了相关的帖子,对于...

1201
来自专栏性能与架构

前端构建工具grunt

grunt是什么 grunt是目前非常流行的前端构建工具,支持自定义插件,有丰富的插件帮助我们完成构建任务 自动化完成我们指定的任务,例如压缩、编译、单元测试、...

3405
来自专栏开源优测

移动测试Appium之webelement模块介绍

移动测试Appium之webelement模块介绍 前言 本文主要分析Appium Python端所提供的移动端元素操作API,其主要实现,你可以通过以下方式查...

2905
来自专栏源哥的专栏

开发统一的博客接口

现在博客很流行,很多人都在使用博客,有些人同时拥有几个不同的博客网站,不知你有没有这样的烦恼,就是你写了一篇文章,这时想传到不同的博客网站上去,就得打开不同的...

883
来自专栏魏琼东

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 模块插件集成

      前面我们在AgileEAS.NET之插件接口IModule和AgileEAS.NET之插件运行容器中对模块插件和运行容器都做了介绍,本文我们介绍Ag...

18010
来自专栏黑白安全

数以万计 Django 应用程序因配置错误泄露密码等敏感信息

近日,安全研究员 FábioCastro 发现 28,165 个配置错误的 Django 应用程序暴露敏感信息,其中包括密码,API 密钥以及 AWS 访问令牌...

1026
来自专栏钟绍威的专栏

web服务器集群集群是什么?分布式是什么?集中式是什么?例子缺点

概述 集群和分布式都是从集中式进化而来的。分布式和集群会相互合作的,同时的集群和分布式。在这里重点说说集群 集群是什么? 集群能提高单位时间内处理的任务数量,提...

4179

扫码关注云+社区

领取腾讯云代金券