CPU亲和力

  1、taskset:retrieve or set a processes's CPU affinity

  1)CPU亲和力是一种调度特性,它将一个进程“绑定”到某个CPU集合上。当然,调度程序也支持天然的CPU亲和力,这意味着进程通常不会在CPU之间频繁迁移。

  CPU亲和力可用位掩码表示,如0x3表示CPU 0和CPU 1。缺省时进程的掩码位全为1。

  fork出来的子进程继承父进程的CPU亲和力掩码,调用execve之后进程保留原本的掩码。

  2)选项:-p:指定PID;-c:指定CPU集合,如0,5,7,9-11

  3)示例:

  设置PID为14035的进程的亲和力掩码:taskset -p 03 14035

  查看PID为14035的进程的CPU亲和力掩码:taskset -p 14035

  以指定亲和力掩码启动sshd命令:taskset 03 sshd -b 1024

  查看某个watchdog进程运行在哪个CPU上:

$ ps aux|grep watchdog | grep -v grep
root         6  0.0  0.0      0     0 ?        S    Jul03   0:01 [watchdog/0]
... ...
root        50  0.0  0.0      0     0 ?        S    Jul03   0:00 [watchdog/11]
root        54  0.0  0.0      0     0 ?        S    Jul03   0:00 [watchdog/12]
root        58  0.0  0.0      0     0 ?        S    Jul03   0:00 [watchdog/13]
root        62  0.0  0.0      0     0 ?        S    Jul03   0:00 [watchdog/14]
root        66  0.0  0.0      0     0 ?        S    Jul03   0:01 [watchdog/15]
$ taskset -c -p 50
pid 50's current affinity list: 11

  4)使用CPU亲和力的几个原因:绑定到一个特定CPU有利于提高CPU缓存的命中率;可根据需要给进程专门指定一个或多个CPU;改变进程的亲和力掩码,测试复杂应用程序在不同硬件条件下的表现等。

 

  2、sched_setaffinity和sched_getaffinity

// 设置和获取进/线程的CPU亲和力掩码。这两个系统调用是Linux特有的
int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);

// 如果使用的是POSIX线程的API,则用以下两个函数
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset);

  四个操作亲和力掩码(cpu_set_t,CPU集合)的宏:CPU_ZERO:清空集合;CPU_CLR:把一个CPU从集合中移除;CPU_SET:把一个CPU加入到集合;CPU_ISSET:测试一个CPU是否在集合中。

  常量CPU_SETSIZE指出CPU集合中最多能存放的最大CPU数加1。

  获取CPU个数:int num = sysconf(_SC_NPROCESSORS_CONF);

 

 

不断学习中。。。

posted on 2014-03-07 01:11  han'er  阅读(1442)  评论(0编辑  收藏  举报

导航