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);
原文作者:han'er
原文地址:CPU亲和力 - han'er - 博客园(版权归原文作者所有,侵权留言联系删除)