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);
不斷學習中。。。
總結
- 上一篇: 【五校联考7day1】游戏
- 下一篇: 体验Impress.js