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

博客访问: 639891
博文数量: 203
博客积分: 7991
博客等级: 少将
技术积分: 2127
注册时间:
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
假如系统中有俩CPU,俩网卡,默认情况下,中断会在同一个CPU上,比如:# cat /proc/interrupts&&&&&&&&&& CPU0&&& && CPU1114:& &&&&&&&&& 0&&&&&& PCI-MSI-X& eth0-rx122:&& &&&&&&&&& 0&&&&&& PCI-MSI-X& eth0-tx130:&& &&&&&&&&& 0&&&&&& PCI-MSI-X& eth1-rx138:&& &&&&&&&&& 0&&&&&& PCI-MSI-X& eth1-tx……这就会使CPU1处于频繁中断之后成为瓶颈,在这种情况下,可以设置第二块网卡中断的CPU亲和性,使其在CPU1上进行中断触发:(将CPU的掩码写入)# echo 2 > /proc/irq/130/smp_affinity# echo 2 > /proc/irq/138/smp_affinity
阅读(3596) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。虚拟机与虚拟化(35)
进程的处理器亲和性和VCPU的绑定
& & &通常情况下,在SMP系统中,Linux内核的进程调度器根据自有的调度策略将系统中的一个进程调度到某个CPU上执行。一个进程在前一个执行时间是在cpuM(M为系统中的某CPU的ID)上运行,而在后一个执行时间是在cpuN(N为系统中另一CPU的ID)上运行。这样的情况在Linux中是很可能发生的,因为Linux对进程执行的调度采用时间片法则(即进行用完自己的时间片即被暂停执行),而默认情况下,一个普通进程或线程的处理器亲和性是在所有可用的CPU上,有可能在它们之中的任何一个CPU(包括超线程)上执行。
& & &进程的处理器亲和性(Processor Affinity),即是CPU的绑定设置,是指将进程绑定到特定的一个或多个CPU上去执行,而不允许调度到其他的CPU上。Linux内核对进程的调度算法也是遵守进程的处理器亲和性设置的。设置进程的处理器亲和性带来的好处是可以减少进程在多个CPU之间交换运行带来的缓存命中失效(cache missing),从该进程运行的角度来看,可能带来一定程度上的性能提升。换个角度来看,对进程亲和性的设置也可能带来一定的问题,如破坏了原有SMP系统中各个CPU的负载均衡(load
balance),这可能会导致整个系统的进程调度变得低效。特别是在多处理器、多核、多线程技术使用的情况下,在NUMA(Non-Uniform Memory Access)结构的系统中,如果不能基于对系统的CPU、内存等有深入的了解,对进程的处理器亲和性进行设置是可能导致系统的整体性能的下降而非提升。
& & &每个vCPU都是宿主机中的一个普通的QEMU线程,可以使用taskset工具对其设置处理器亲和性,使其绑定到某一个或几个固定的CPU上去调度。尽管Linux内核的进程调度算法已经非常高效了,在多数情况下不需要对进程的调度进行干预,不过,在虚拟化环境中有时却有必要对客户机的QEMU进程或线程绑定到固定的逻辑CPU上。下面举一个云计算应用中需要绑定vCPU的实例。
& & &作为IAAS(Infrastructure As A Service)类型的云计算提供商的A公司(如Amazon、Google、阿里云、盛大云等),为客户提供一个有2个逻辑CPU计算能力的一个客户机。要求CPU资源独立被占用,不受宿主机中其他客户机的负载水平的影响。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:867948次
积分:16915
积分:16915
排名:第431名
原创:814篇
转载:210篇
评论:137条
1.7 本科 计算机科学与技术 4.3 硕士 计算机系统结构。目前已签约国内某大型互联网公司。联系QQ:
(2)(12)(2)(12)(12)(14)(21)(4)(7)(6)(3)(20)(18)(14)(17)(15)(6)(17)(2)(10)(11)(14)(4)(11)(5)(7)(4)(8)(14)(8)(12)(5)(9)(3)(1)(3)(1)(19)(62)(45)(45)(31)(31)(57)(46)(22)(55)(81)(65)(19)(28)(16)(4)(23)(14)(8)(9)(8)进程和线程的CPU亲和性_中华文本库
第1页/共4页
进程和线程的亲缘性(affinity)是指可以将进程或者是线程强制限制在可用的CPU子集上运行的特性,它一定程度上把进程/线程在多处理器系统上的调度策略暴露给系统程序员。 CPU的数量和表示在有n个CPU的Linux上,CPU是用0...n-1来进行一一标识的。CPU的数量可以通过proc文件系统下的CPU相关文件得到,如cpuinfo和stat:
$ cat /proc/stat | grep "^cpu[0-9]\+" | wc -l
$ cat /proc/cpuinfo | grep "^processor" | wc -l
在系统编程中,可以直接调用库调用sysconf获得:
sysconf(_SC_NPROCESSORS_ONLN);
进程的亲缘性Linux操作系统在2.5.8引入了调度亲缘性相关的系统调用: int sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask);
int sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask);
其中sched_setaffinity是设定进程号为pid的进程调度亲缘性为mask,也就是说它只能在mask中指定的CPU之间进行调度执行;sched_getaffinity当然就是得到进程号为pid的进程调度亲缘性了。如果pid为0,则操纵当前进程。
第二个参数指定mask所指空间的大小,通常为sizeof(cpu_set_t)。
第三个参数mask的类型为cpu_set_t,即CPU集合,GNU的c库(需要在include头文件之前定义
__USE_GNU)还提供了操作它们的宏:
void CPU_CLR(int cpu, cpu_set_t *set);
int CPU_ISSET(int cpu, cpu_set_t *set);
void CPU_SET(int cpu, cpu_set_t *set);
void CPU_ZERO(cpu_set_t *set);
如果我们所关心的只是CPU#0和CPU#1,想确保我们的进程只会运作在CPU#0之上,而不会运作在CPU#1之上。下面程序代码可以完成此事:
CPU_ZERO(&set);
CPU_SET(0, &set);
CPU_CLR(1, &set);
ret = sched_setaffinity(0, sizeof(cpu_set_t), &set);
if( ret == -1)
perror("sched_se");
for( i=0; i & 3; i++)
cpu = CPU_ISSET(i, &set);
printf("cpu = %i is %s/n", i, cpu? "set" : "unset");
Linux只提供了面向线程的调度亲缘性一种接口,这也是上面只提调度亲缘性而不直言进程亲缘性的原因。当前Linux系统下广泛采用的线程库NPTL(Native Posix Thread Library)是基于线程组来实现的,同一个线程组中的线程对应于一组共享存储空间的轻量级进程,它们各自作为单独调度单位被内核的调度器在系统范围内调度,这种模型也就是我们通常所说的1-1线程模型。正因如此,目前线程的调度范围
第1页/共4页
寻找更多 ""

我要回帖

更多关于 linux指定进程的cpu 的文章

 

随机推荐