指定代码放哪个cpu运行
如何指定进程运行的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):
![](/assets/blank.gif)
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 }
![](/assets/blank.gif)
根据你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. 购买服务器 如果你是学生的话,想折腾的可以去阿里云那里购买,因为有学生机优惠,只需要9.9一个月,但是只能购买一次,在下一次购买需要做任务才可以继续享用学生机优惠.我就直接买了一年,114,我在 ...
- GPU版TensorFlow怎么指定让CPU运行
由于某些原因GPU版的TensorFlow运行起来会出现一些问题,比如内存溢出等情况.此时我们可以用CPU和系统内存来运行我们的程序. 代码如下: import os os.environ[" ...
- linux 下进程和线程指定CPU运行
大概的介绍一下linux 的指定CPU运行,包括进程和线程,这个只是最基本的方法,看一下基本就会了,至于其他的进程间通信和线程同步的话,这里暂不做任何介绍. 算了,还是比较整体的介绍一下如何去学习这个 ...
- linux指定cpu运行程序,进程/线程绑定到特定CPU核的linux实现(有代码有实例)
前言 现在计算机上的CPU大多都是多核的,有4核甚至是8核的.但是一个计算机启动之后其进程数是远远多于CPU核数的,因为操作系统会给自动调度这些进程在CPU核上轮流运行.但是对于应用程序或者进程,其性 ...
- CentOS查看显卡及GPU相关信息,指定GPU、CPU运行
一.查看信息 在一套标准的系统上通常有多个计算设备. TensorFlow 支持 CPU 和 GPU 这两种设备. 我们用指定字符串 strings 来标识这些设备. 比如: "/cpu:0 ...
- Systrace 线程 CPU 运行状态分析技巧 - Sleep 和 Uninterruptible Sleep 篇
本文是 Systrace 线程 CPU 运行状态分析技巧系列的第三篇,本文主要讲了使用 Systrace 分析 CPU 状态时遇到的 Sleep 与 Uninterruptible Sleep 状态的 ...
- zynq双CPU运行
AMP: 非对称多处理,每个 CPU 内核运行一个独立的操作系统或同一操作系统的独立实例 SMP: 对称多处理,一个操作系统实例可以管理所有 CPU 内核,且应用并不绑定某一内核 BMP: 混合多处理 ...
- ARM微控制器-MCU基础及CPU运行过程(堆栈/中断/寄存器操作)
目录 为什么计算机能读懂1和0? 一. CPU的基本结构和运行机制 1. 一个基本的MCU内部结构 2. MCU Structure 3. 分析其中的CPU: 一个完整的CPU: 4. 堆栈 5. 堆 ...
- ubuntu 查看cpu运行频率_Ubuntu下调整CPU运行频率并对其进行监视
3.调整cpu频率 代码: sudo cpufreq-selector -f 你所需要的频率 或者 代码: sudo cpufreq-set -f 你所需要的频率 注意,此处的频率必须是以KHz为单位 ...
最新文章
- python基础代码事例-python基础第三章
- linux cp指令报错:cp: omitting directory ‘xxx‘(需要加-r递归拷贝)
- 硬件知识:什么是扩展坞,看完你就明白了!
- tomcat在linux下开机启动
- pandas入门(2)
- Tesla对德国政府的审批流程表示受够了
- 【转】基于Ubuntu 14.04 LTS编译Android4.4.2源代码
- POJ-2262 Goldbach's Conjecture
- 薄荷Toolbar(ActionBar)的适配方案
- 为SQL Server 增加链接到SQL Server 的链接服务器
- 柯特斯公式 | 数值积分
- HashMap,TreeMap,Hashtable,LinkedHashMap的区别
- 测试工程师六大能力模型
- vue中的混入mix
- 聊聊Ping命令的返回值Pong
- 上传声音 微信小程序_微信小程序实现录制、试听、上传音频功能(带波形图)...
- Zynga公布2020年第三季度财务业绩
- Python解释大数定律
- VSCode 插件大全
- 数据结构与算法笔记:分治策略之Greatest Slice,2-Way Merge,Counting Inversions,linearSelect,Diameter,Closest Pair