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);
不断学习中。。。