taskset命令:查看、指定进程运行在哪个cpu上

2023-05-16

reference:

https://baijiahao.baidu.com/s?id=1592330790387359245&wfr=spider&for=pc

https://www.cnblogs.com/LubinLew/p/cpu_affinity.html

 

1、CPU亲和性(cpu affinity)

CPU affinity 是一种调度属性(scheduler property), 它可以将一个进程"绑定" 到一个或一组CPU上.

在SMP(Symmetric Multi-Processing对称多处理)架构下,Linux调度器(scheduler)会根据CPU affinity的设置让指定的进程运行在"绑定"的CPU上,而不会在别的CPU上运行.

Linux调度器同样支持自然CPU亲和性(natural CPU affinity): 调度器会试图保持进程在相同的CPU上运行, 这意味着进程通常不会在处理器之间频繁迁移,进程迁移的频率小就意味着产生的负载小。

因为程序的作者比调度器更了解程序,所以我们可以手动地为其分配CPU核,而不会过多地占用CPU0,或是让我们关键进程和一堆别的进程挤在一起,所有设置CPU亲和性可以使某些程序提高性能。

 

CPU affinity 使用位掩码(bitmask)表示, 每一位都表示一个CPU, 置1表示"绑定"。最低位表示第一个逻辑CPU, 最高位表示最后一个逻辑CPU

CPU affinity典型的表示方法是使用16进制,具体如下.

0x00000001 is processor #0

0x00000003 is processors #0 and #1

0xFFFFFFFF is all processors (#0 through #31)

 

2、为什么要指定进程在固定的cpu上运行

由于各个cpu都有自己的缓存,如L1,L2等,程序中的指令在CPU内部,往往通过分支预测,提前放到了流水线上。也就是说,一个进程在cpuA上运行时,其未来要执行的指令往往被cpuA预估了,会把未来要执行的指令提前写到自己的一、二级缓存中。当进程换到了cpuB运行后,除了cpuA上的之前做的缓存白做之外,还要把这些缓存丢弃以避免不要影响新的进程,而且cpuB为了提速,还需要重新做一次缓存,即使可以把cpuA的缓存拷贝到cpuB中,这样在电路间也很麻烦,而且也不能保证两个cpu之间的缓存规格一样,万一大小不同,该怎样截断,都是问题,因此不如到了那边重建。

因此,保证进程在同一个cpu上运行,可减少在cpu之间切换时产生的“原来缓存丢弃与重建新缓存”的损失。

 

3、查看进程运行在哪个逻辑cpu上

ps -eo pid,args,psr

(这里应该显示的是该进程中,tid(lwp)和pid相等的那个线程运行在哪个cpu上)

 

4、查看某个进程的每个线程运行在哪个逻辑cpu上

ps -To 'pid,lwp,psr,cmd' -p PID

(同一个进程中,不同线程的lwp是唯一的,但是不同进程之间,可能存在相同的lwp;当一个进程只有一个线程时,pid和lwp总是相同的)

 

5、查看和设置CPU亲和性

1) 使用指定的CPU亲和性运行一个新程序

 taskset [-c] mask command [arg]...

 举例:使用CPU0运行ls命令显示/etc/init.d下的所有内容

   taskset -c 0 ls -al /etc/init.d/

 

2) 显示已经运行的进程的CPU亲和性

taskset -p pid

举例:查看init进程(PID=1)的CPU亲和性

taskset -p 1

 

3) 改变已经运行进程的CPU亲和力

taskset -p[c] mask pid

举例:打开2个终端,在第一个终端运行top命令,第二个终端中

   首先运行:[~]# ps -eo pid,args,psr | grep top #获取top命令的pid和其所运行的CPU号

   其次运行:[~]# taskset -cp 新的CPU号 pid #更改top命令运行的CPU号

   最后运行:[~]# ps -eo pid,args,psr | grep top #查看是否更改成功

 

mast可以是一个cpu号,也可以是多个

taskset -cp 10 pid (运行在10号cpu上)

taskset -cp 10,12 pid (运行在10和12号cpu上)

taskset -cp 10-12 pid (运行在10\11\12号cpu上)

 

(改变已经启动的进程的cpu affinity,设置之后不是立刻生效的,似乎要等一小会,十几秒的样子?)

(固定在不同的线程也可能会造成性能损失,比如https://stackoverflow.com/questions/39495136/why-settting-cpu-affinity-make-threads-run-slower#中提到的情况)

(此外在我的系统(4.15.0-43-generic #46~16.04.1-Ubuntu SMP)上,还观察到了这个现象:如果通过taskset启动进程,该进程的所有线程都是跑在指定cpu上的,如果是启动之后再用taskset去改,就只有主线程的cpu会固定为指定cpu

 

另外如果想通过隔离cpu达到更好的cpu控制效果,可以参考https://blog.csdn.net/tang05505622334/article/details/96477552

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

taskset命令:查看、指定进程运行在哪个cpu上 的相关文章

  • Spring Cloud OpenFeign详解

    作为Spring Cloud的子项目之一 xff0c Spring Cloud OpenFeign以将OpenFeign集成到Spring Boot应用中的方式 xff0c 为微服务架构下服务之间的调用提供了解决方案 首先 xff0c 利用

随机推荐

  • Docker容器支持IPv6的方法

    1 设置Docker Engine支持IPv6 1 启动Docker Engine时即开启对IPv6的支持 默认启动时Docker Engine只支持IPv4 启动Docker Engine时 xff0c 指定 ipv6选项即可支持IPv6
  • 总线带宽计算公式(解析)

    总线带宽 xff1a 一定时间内总线上可以传输的数据量 xff0c 使用MByte s表示 总线位宽 xff1a 总线能同时传送的数位数 xff0c 使用bit表示 xff08 常见的如32位 xff0c 64位 xff09 总线频率 xf
  • macOS终端命令行配置网络代理

    一 前言 xff1a 在下载一些需要vpn下载公司内网的源码或者认证时 xff0c 必不可少的需要使用代理 xff0c 与普通的网页及应用代理不同 xff0c 在mac的终端中并没有开启默认的代理模式 xff0c 所以需要手动进行设置 xf
  • VUE源码浅读

    首先我们要知道vue代码如何运行的 xff1f 初始化及挂载 61 gt 编译 xff08 parse optimize generate xff09 61 gt render function渲染 xff08 响应式 xff09 61 g
  • 一文解决Vue2过渡Vue3痛点

    项目升级vue3 0总结 醉逍遥neo的博客 CSDN博客 升级项目vue版本
  • 前端vue需求:将当前页面转成图片或者PDF并下载

    一 xff0c 下载依赖并引用 npm install html2canvas jspdf import html2canvas from 34 html2canvas 34 import jsPDF from 34 jspdf 34 二
  • react数据之dispatch,reducer

    1 之前写了一篇fetch的简单用法 xff0c 实际项目中数据比那个要复杂 xff0c 下面看一下通过dispatch和reducer来控制数据的更新 xff1b 2 还是以上一个添加分组的组件为例 xff1a 首先我们写一个MoveGr
  • 定时器/计数器介绍

    第一次在学习定时器的时候模模糊糊 xff0c 在做过一些题目之后对定时器有了更新的理解 xff0c 现在整理一下 xff0c 做笔记使用 目录 一 基础知识 定时器的作用 xff1a 定时器的实质 xff1a 定时器的工作原理 xff1a
  • echarts图表大小自适应

    1 还是我上一篇echarts简单使用的例子 xff1a 如果是随windows的width和height自适应的话 xff0c 如下 xff1a var echartsWarp 61 document getElementById 39
  • audio自动播放完美兼容实现方案

    前述 xff1a 最近解决的一个疑难杂症 xff0c 是关于audio自动播放与监听audio加载完成在ios上的兼容性问题 xff0c 其表现为pc xff0c 安卓谷歌浏览器正常 xff0c ios微信 xff0c 谷歌浏览器不正常 需
  • uni-app开发流程一(项目搭建)

    uni app其实是DCloud推出的众多产品之一 xff0c 当然我只研究目前能用到的 DCloud的官网 xff1a https www dcloud io uni app的官网 xff1a https uniapp dcloud io
  • uni-app开发问题总结(小程序与h5)2:兼容性

    前端时间连着开发了俩个项目 xff0c 都是在线教育类的 xff0c uni app架构 xff0c 一套代码兼容移动端h5 43 小程序 碰到一些兼容性问题 xff0c 这里做个记录 xff1a 一 默认使用uni app创建的css 有
  • nginx location proxy_pass的一些坑

    常规博客是 xff0c 先讲自己的经历 xff0c 然后再啰嗦一段话 xff0c 并且再穿插一些自己的感想之类的 不 xff0c 我的博客力求最高效率 需求 xff1a 把 URL 中带 proxy 的统统转发至另外的机子 1 loacat
  • mysql 5.7.28版本 my.cnf 文件的路径

    缘起改mysql的 slow query log 的配置 xff0c 在下 5 7 28版本 etc my cnf 文件据说在5 7 1X版本更改了 xff0c 此后版本把该文件丢在 etc mysql mysql conf d mysql
  • mysql 跨服务器导入

    本机a 服务器b 服务器c xff0c 在本机a 通过终端操作 xff0c 把服务器b上mysql 数据 导入到服务器C mysqldump h192 168 79 130 P3306 ushit pyoueat database youe
  • mysql 查看help手册

    作用 xff1a 解决 记得函数 xff0c 不记得语法的窘境 查看总的目录 mysql gt contents 其下的是各大分类 You asked for help about help category 34 Contents 34
  • vim 查看help命令

    并不需要查找vim 的工作手册 xff0c vim 自带说明书 步骤1 xff1a xff1a help 步骤2 xff1a quickref 步骤3 xff1a 找到 步骤4 xff1a ctrl键 键 同时按下 步骤5 xff1a 会来
  • ubuntu自带的命令查看

    xff1a man ls 比如查ls 命令
  • 【无标题】安装ROS E: 无法定位软件包 ros-melodic-desktop-full

    一 遇到问题 二 可能的原因和解决方法 1 源换一下 xff1a xff08 1 xff09 我是看这位大佬的 5条消息 记录 解决Ubuntu安装ros报错E Unable to locate package ros kinetic de
  • taskset命令:查看、指定进程运行在哪个cpu上

    reference xff1a https baijiahao baidu com s id 61 1592330790387359245 amp wfr 61 spider amp for 61 pc https www cnblogs