linux下将不同线程绑定到不同core和cpu上 pthread_setaffinity_np——005最全面
来源:互联网 发布:手机端回到顶部 js 编辑:程序博客网 时间:2024/05/16 07:00
http://blog.csdn.net/zdy0_2004/article/details/54730611
将线程绑定到不同的processor上:
这里加入有两个cpu,一个cpu五个核
转载:http://blog.csdn.NET/xluren/article/details/43202201
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_setaffinity 2 * (which sets the affinity of processes to processors). 3 * Compile: gcc sched_setaffinity_test.c 4 * -o sched_setaffinity_test -lm 5 * Usage: ./sched_setaffinity_test 6 * 7 * Open a "top"-window at the same time and see all the work 8 * 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 a10 * 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用户指定的进程。
- linux下将不同线程绑定到不同core和cpu上 pthread_setaffinity_np——005最全面
- linux下将不同线程绑定到不同core和cpu上 pthread_setaffinity_np
- linux下将不同线程绑定到不同core和cpu上 pthread_setaffinity_np
- Linux技巧:多核下绑定网卡中断到不同CPU(core)总结
- 将进程或线程attach到一个特定CPU核上的方法(sched_setaffinity pthread_setaffinity_np example)
- linux下绑定硬件中断到不同的cpu
- Linux技巧:多核下绑定硬件/进程到不同CPU
- Linux技巧:多核下绑定硬件进程到不同CPU
- 线程与cpu进行绑定——006非常全面
- linux线程绑定到指定cpu运行
- OpenGL学习 将不同纹理映射到不同面上
- 将不同纹理映射到不同面上nehe
- OpenGL学习 将不同纹理映射到不同面上
- OpenGL学习 将不同纹理映射到不同面上
- 将不同文本框的值更新到不同的表
- linux下浅谈线程绑定cpu
- linux下浅谈线程绑定cpu
- Linux下CPU绑定线程、进程
- hibernate中get 和 load 的区别
- Windows 下使用Visual Studio 2013编译国密算法库GMSSL
- STL_queue
- Linux vi编辑后如何进行保存操作
- 深入理解java中的流
- linux下将不同线程绑定到不同core和cpu上 pthread_setaffinity_np——005最全面
- 低估一件事的二级效应
- Leetcode-6. ZigZag Conversion
- 产生随机数
- WebSphere连接池参数详解
- ubuntu 安装pycharm
- bmp图片格式详解
- android中的定时任务
- 关于QueryRunner的使用