如何设置指定进程的python 设置cpu亲和性性

cpu亲和性设置
cpu亲和性设置
  #include&stdlib.h&
  #include&stdio.h&
  #include&unistd.h&
  #include&sched.h&
  int main(int argc, char* argv[])
  int num = sysconf(_SC_NPROCESSORS_CONF);
  int created_thread = 0;
  int j = 0;
  cpu_set_
  cpu_set_
  if (argc != 2)
  printf("usage : ./cpu num\n");
  exit(1);
  myid = atoi(argv[1]);
  printf("system has %i processor(s). \n", num);
  CPU_ZERO(&mask);
  CPU_SET(myid, &mask);
  if (sched_setaffinity(0, sizeof(mask), &mask) == -1)
  printf("warning: could not set CPU affinity, continuing...\n");
  while (1)
  CPU_ZERO(&get);
  if (sched_getaffinity(0, sizeof(get), &get) == -1)
  printf("warning: cound not get cpu affinity, continuing...\n");
  for (i = 0; i & i++)
  if (CPU_ISSET(i, &get))
  printf("this process %d is running processor : %d\n",getpid(), i);
  return 0;
  在设置cpu亲和性后,启动的其他线程也会绑定到对应的CPU上。
  CPU Affinity (CPU亲合力)
  CPU亲合力就是指在Linux系统中能够将一个或多个进程绑定到一个或多个处理器上运行.
  一个进程的CPU亲合力掩码决定了该进程将在哪个或哪几个CPU上运行.在一个多处理器系统中,设置CPU亲合力的掩码可能会获得更好的性能.
  一个CPU的亲合力掩码用一个cpu_set_t结构体来表示一个CPU集合,下面的几个宏分别对这个掩码集进行操作:
  CPU_ZERO() 清空一个集合
  CPU_SET()与CPU_CLR()分别对将一个给定的CPU号加到一个集合或者从一个集合中去掉.
  CPU_ISSET()检查一个CPU号是否在这个集合中.
  其实这几个的用法与select()函数那几个调用差不多.
  下面两个函数就是最主要的了:
  sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
  该函数设置进程为pid的这个进程,让它运行在mask所设定的CPU上.如果pid的值为0,则表示指定的是当前进程,使当前进程运行在 mask所设定的那些CPU上.第二个参数cpusetsize是
  mask所指定的数的长度.通常设定为sizeof(cpu_set_t).如果当前pid所指定的CPU此时没有运行在mask所指定的任意一个CPU上,则该指定的进程会从其它CPU上迁移到mask的指定的
  一个CPU上运行.
  sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
  该函数获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中.即获得指定pid当前可以运行在哪些CPU上.同样,如果pid的值为0.也表示的是当前进程.
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&今天看到运维的同事在配置nginx的CPU亲和性时候,运维同事说他在所有的机器上都是按照8核的方式来配置worker进程的CPU亲和性的。
但我觉得就是有点不太对劲,就查了一下nginx的处理worker_cpu_affinity的源代码,发现nginx并不会在发现配置错误的时候拒绝启动worker进程,而是仅仅打印一条错误日志&sched_setaffinity() failed&。
如果设置亲和性失败则按照SMP负载策略进行处理,linux的SMP负载均衡是基于进程数的,每个cpu都有一个可执行进程队列,只有当其中一个cpu的可执行队列里进程数比其他cpu队列进程数多25%时,才会将进程移动到另外空闲cpu上,也就是说cpu0上的进程数应该是比其他cpu上多,但是会在25%以内,呈现的是一种梯形分布。
如果都使用8核的方式,那么配置在4核的机器上,就会有约一半进程是按照SMP方式分配CPU的;配置在16核机器上,就会有约一半的CPU核心空闲。
我是喜欢打破砂锅问到底的,那么就顺道写了一些测试程序来研究一下Linux下的CPU亲和性在不同设置的情况下是什么状况。
测试前提:
系统是8个CPU逻辑核心(cpu0-cpu7)。
可以通过cat /proc/cpuinfo查看. 也可以使用 int num_procs = sysconf(_SC_NPROCESSORS_CONF); 获取CPU逻辑核心的数量
#define _GNU_SOURCE
#include &sched.h&
#include &unistd.h&
运行之后,
ps -eo pid,args,psr | grep cpu_affinity_test 查看该进程所占用的cpu,
可以看到这个程序一定是运行在cpu7上。
如果把 CPU_SET(7, &mask);
修改为 CPU_SET(8, &mask);
再编译运行,则CPU亲和性设置会失败,系统会随机给该进程分配一个cpu,但也会固定下来。
如果修改为 CPU_SET(6, &mask); CPU_SET(7, &mask);
再编译运行,理论上会绑定两个CPU,由于这个进程再每次打印之前会休息1秒,所以基本都是在占用cpu6, 如果再修改一下程序,把休息时间修改为1毫秒,则会发现该进程会交替使用cpu6和cpu7。
如果修改为 CPU_SET(6, &mask); CPU_SET(8, &mask);
再编译运行,则cpu6被绑定成功,而cpu8是不存在的,所以该进程就只会在cpu6上运行。
备注: linux的SMP负载均衡是基于进程数的,每个cpu都有一个可执行进程队列,只有当其中一个cpu的可执行队列里进程数比其他cpu队列进程数多25%时,才会将进程移动到另外空闲cpu上,也就是说cpu0上的进程数应该是比其他cpu上多,但是会在25%以内。它也自带负载均衡策略,可以在运行时将某些进程从某一个cpu核心的进程队列移到另外一个cpu核心的进程队列。
https://my.oschina.net/xuhh/blog/755825
Views(...) Comments()LINUX下如何指定进程运行的CPU
《性能调优攻略》在“多核CPU调优”章节提到“我们不能任由操作系统负载均衡,因为我们更了解自己的程序,所以,我们可以手动地为其分配CPU核,而不会过多地占用CPU0,或是让我们关键进程和一堆别的进程挤在一起。”。在文章中提到了Linux下的一个工具,taskset,可以设定单个进程运行的CPU。
下文,将会介绍taskset命令,schedtool命令以及sched_setaffinity系统调用,三者均可以指定进程运行的CPU实例。
taskset是LINUX提供的一个命令(ubuntu系统可能需要自行安装,schedutils
package)。他可以让某个程序运行在某个(或)某些CPU上。
1)显示进程运行的CPU
命令taskset -p 21184
显示结果:
pid 21184's current affinity mask: ffffff
注:显示结果的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,就比较清楚了。
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.Debian提供了一个工具:schedtool(其他发行版还没有验证),可以使用他来设置一个pid的Affinity
命令schedtool
-a 0x3f -e passthrough
3.sched_setaffinity系统调用
sched_setaffinity可以将某个进程绑定到一个特定的CPU。你比操作系统更了解自己的程序,为了避免调度器愚蠢的调度你的程序,或是为了在多线程程序中避免缓存失效造成的开销,你可能会希望这样做。
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
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 a
10 // coincidence.
13 #include
14 #include
15 #include
17 double waste_time(long n)
19 & & double res = 0;
20 & & long i = 0;
21 & & while(i 200000) {
22 & & & & i++;
23 & & & & res += sqrt (i);
25 & & return
28 int main(int argc, char **argv)
30 & & unsigned long mask = 1; // processor 0
32 & & // bind process to processor 0
33 & & if (sched_setaffinity(0, sizeof(mask), &mask) &&/span&0) {
34 & & & & perror("sched_setaffinity");
37 & & // waste some time so the work is visible with "top"
38 & & printf ("result: %f\n", waste_time (2000));
40 & & mask = 2; // process switches to processor 1 now
41 & & if (sched_setaffinity(0, sizeof(mask), &mask) &&/span&0) {
42 & & & & perror("sched_setaffinity");
45 & & // waste some more time to see the processor switch
46 & & printf ("result: %f\n", waste_time (2000));
根据你CPU的快慢,调整waste_time的参数。然后使用top命令,就可以看到进程在不同CPU之间的切换。(启动top命令后按“1”,可以看到各个CPU的情况)。
父进程和子进程之间会继承对affinity的设置。因此,大胆猜测,taskset实际上是首先执行了sched_setaffinity系统调用,然后fork+exec用户指定的进程。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 vbs结束指定进程 的文章

 

随机推荐