如何指定进程运行的CPU

coolshell最新的文章《性能调优攻略》在“多核CPU调优”章节,提到“我们不能任由操作系统负载均衡,因为我们自己更了解自己的程序,所以,我们可以手动地为其分配CPU核,而不会过多地占用CPU0,或是让我们关键进程和一堆别的进程挤在一起。”。在文章中提到了Linux下的一个工具,taskset,可以设定单个进程运行的CPU。

同时,因为最近在看redis的相关资料,redis作为单进程模型的程序,为了充分利用多核CPU,常常在一台server上会启动多个实例。而为了减少切换的开销,有必要为每个实例指定其所运行的CPU。

下文,将会介绍taskset命令,以及sched_setaffinity系统调用,两者均可以指定进程运行的CPU实例。

1.taskset

taskset是LINUX提供的一个命令(ubuntu系统可能需要自行安装,schedutils package)。他可以让某个程序运行在某个(或)某些CPU上。

以下均以redis-server举例。

1)显示进程运行的CPU

命令taskset -p 21184

显示结果:

pid 21184’s current affinity mask: ffffff

注:21184是redis-server运行的pid

显示结果的ffffff实际上是二进制24个低位均为1的bitmask,每一个1对应于1个CPU,表示该进程在24个CPU上运行

2)指定进程运行在某个特定的CPU上

命令taskset -pc 3 21184

显示结果:

pid 21184’s current affinity list: 0-23
pid 21184’s new affinity list: 3

注:3表示CPU将只会运行在第4个CPU上(从0开始计数)。

3)进程启动时指定CPU

命令taskset -c 1 ./redis-server ../redis.conf

结合这上边三个例子,再看下taskset的manual,就比较清楚了。

OPTIONS
-p, –pid
operate on an existing PID and not launch a new task

-c, –cpu-list
specify a numerical list of processors instead of a bitmask. The list may contain multiple items, separated by comma, and ranges. For example, 0,5,7,9-11.

2.sched_setaffinity系统调用

如下文章部分翻译自:http://www.thinkingparallel.com/2006/08/18/more-information-on-pthread_setaffinity_np-and-sched_setaffinity/

问题描述

sched_setaffinity可以将某个进程绑定到一个特定的CPU。你比操作系统更了解自己的程序,为了避免调度器愚蠢的调度你的程序,或是为了在多线程程序中避免缓存失效造成的开销,你可能会希望这样做。如下是sched_setaffinity的例子,其函数手册可以参考(http://www.linuxmanpages.com/man2/sched_getaffinity.2.php):

 1 /* Short test program to test sched_setaffinity2 * (which sets the affinity of processes to processors).3 * Compile: gcc sched_setaffinity_test.c4 *              -o sched_setaffinity_test -lm5 * Usage: ./sched_setaffinity_test6 *7 * Open a "top"-window at the same time and see all the work8 * being done on CPU 0 first and after a short wait on CPU 1.9 * Repeat with different numbers to make sure, it is not a
10 * coincidence.
11 */
12
13 #include <stdio.h>
14 #include <math.h>
15 #include <sched.h>
16
17 double waste_time(long n)
18 {
19     double res = 0;
20     long i = 0;
21     while(i <n * 200000) {
22         i++;
23         res += sqrt (i);
24     }
25     return res;
26 }
27
28 int main(int argc, char **argv)
29 {
30     unsigned long mask = 1; /* processor 0 */
31
32     /* bind process to processor 0 */
33     if (sched_setaffinity(0, sizeof(mask), &mask) <0) {
34         perror("sched_setaffinity");
35     }
36
37     /* waste some time so the work is visible with "top" */
38     printf ("result: %f\n", waste_time (2000));
39
40     mask = 2; /* process switches to processor 1 now */
41     if (sched_setaffinity(0, sizeof(mask), &mask) <0) {
42         perror("sched_setaffinity");
43     }
44
45     /* waste some more time to see the processor switch */
46     printf ("result: %f\n", waste_time (2000));
47 }

根据你CPU的快慢,调整waste_time的参数。然后使用top命令,就可以看到进程在不同CPU之间的切换。(启动top命令后按“1”,可以看到各个CPU的情况)。

父进程和子进程之间会继承对affinity的设置。因此,大胆猜测,taskset实际上是首先执行了sched_setaffinity系统调用,然后fork+exec用户指定的进程。

在内核空间中如何实现呢?

linux4.4内核kernel/sched/core.c文件中也有相应的函数实现类似的功能:

int sched_setaffinity(pid_t pid, unsigned int len, unsigned long *mask);

使用示例可参考内核源码:
vi ./Documentation/ia64/err_inject.txt
vi ./arch/tile/kernel/smpboot.c +68

指定代码放哪个cpu运行相关推荐

  1. 学生如何搭建自己的服务器 如何把代码放上服务器运行

    1. 购买服务器 如果你是学生的话,想折腾的可以去阿里云那里购买,因为有学生机优惠,只需要9.9一个月,但是只能购买一次,在下一次购买需要做任务才可以继续享用学生机优惠.我就直接买了一年,114,我在 ...

  2. GPU版TensorFlow怎么指定让CPU运行

    由于某些原因GPU版的TensorFlow运行起来会出现一些问题,比如内存溢出等情况.此时我们可以用CPU和系统内存来运行我们的程序. 代码如下: import os os.environ[" ...

  3. linux 下进程和线程指定CPU运行

    大概的介绍一下linux 的指定CPU运行,包括进程和线程,这个只是最基本的方法,看一下基本就会了,至于其他的进程间通信和线程同步的话,这里暂不做任何介绍. 算了,还是比较整体的介绍一下如何去学习这个 ...

  4. linux指定cpu运行程序,进程/线程绑定到特定CPU核的linux实现(有代码有实例)

    前言 现在计算机上的CPU大多都是多核的,有4核甚至是8核的.但是一个计算机启动之后其进程数是远远多于CPU核数的,因为操作系统会给自动调度这些进程在CPU核上轮流运行.但是对于应用程序或者进程,其性 ...

  5. CentOS查看显卡及GPU相关信息,指定GPU、CPU运行

    一.查看信息 在一套标准的系统上通常有多个计算设备. TensorFlow 支持 CPU 和 GPU 这两种设备. 我们用指定字符串 strings 来标识这些设备. 比如: "/cpu:0 ...

  6. Systrace 线程 CPU 运行状态分析技巧 - Sleep 和 Uninterruptible Sleep 篇

    本文是 Systrace 线程 CPU 运行状态分析技巧系列的第三篇,本文主要讲了使用 Systrace 分析 CPU 状态时遇到的 Sleep 与 Uninterruptible Sleep 状态的 ...

  7. zynq双CPU运行

    AMP: 非对称多处理,每个 CPU 内核运行一个独立的操作系统或同一操作系统的独立实例 SMP: 对称多处理,一个操作系统实例可以管理所有 CPU 内核,且应用并不绑定某一内核 BMP: 混合多处理 ...

  8. ARM微控制器-MCU基础及CPU运行过程(堆栈/中断/寄存器操作)

    目录 为什么计算机能读懂1和0? 一. CPU的基本结构和运行机制 1. 一个基本的MCU内部结构 2. MCU Structure 3. 分析其中的CPU: 一个完整的CPU: 4. 堆栈 5. 堆 ...

  9. ubuntu 查看cpu运行频率_Ubuntu下调整CPU运行频率并对其进行监视

    3.调整cpu频率 代码: sudo cpufreq-selector -f 你所需要的频率 或者 代码: sudo cpufreq-set -f 你所需要的频率 注意,此处的频率必须是以KHz为单位 ...

最新文章

  1. python基础代码事例-python基础第三章
  2. linux cp指令报错:cp: omitting directory ‘xxx‘(需要加-r递归拷贝)
  3. 硬件知识:什么是扩展坞,看完你就明白了!
  4. tomcat在linux下开机启动
  5. pandas入门(2)
  6. Tesla对德国政府的审批流程表示受够了
  7. 【转】基于Ubuntu 14.04 LTS编译Android4.4.2源代码
  8. POJ-2262 Goldbach's Conjecture
  9. 薄荷Toolbar(ActionBar)的适配方案
  10. 为SQL Server 增加链接到SQL Server 的链接服务器
  11. 柯特斯公式 | 数值积分
  12. HashMap,TreeMap,Hashtable,LinkedHashMap的区别
  13. 测试工程师六大能力模型
  14. vue中的混入mix
  15. 聊聊Ping命令的返回值Pong
  16. 上传声音 微信小程序_微信小程序实现录制、试听、上传音频功能(带波形图)...
  17. Zynga公布2020年第三季度财务业绩
  18. Python解释大数定律
  19. VSCode 插件大全
  20. 数据结构与算法笔记:分治策略之Greatest Slice,2-Way Merge,Counting Inversions,linearSelect,Diameter,Closest Pair

热门文章

  1. api质量等级_润滑油的API等级分类
  2. eclipse中jsp和html文件中文乱码
  3. IENet:分支交互一步无锚的定向遥感目标检测
  4. P4实战特训营听课笔记(一)
  5. 幕后故事 | YRCloudFile助力顶级视效制作公司MORE VFX打造视觉盛宴
  6. 关于公众号接单赚money的知识
  7. 计算机毕设(附源码)JAVA-SSM旅游网站设计
  8. java中不执行if判断语句
  9. 我为什么飞行 10000 公里去西班牙参加 KubeCon?
  10. c++读取文件夹中文件