在閱讀Nginx模組開發與架構模式一書時:
"Nginx 上的程式數 與CPU核心數相等時(最好每個worker程式都繫結特定的CPU核心),程式間切換的代價是最小的;" && "我們不能任由作業系統負載均衡,因為我們自己更瞭解自己的程式,所以,我們可以手動地為其分配CPU核,而不會過多地佔用CPU0,或是讓我們關鍵程式和一堆別的程式擠在一起"
引申出此文:
繫結CPU核心:
1.taskset
taskset是LINUX提供的一個命令(ubuntu系統可能需要自行安裝,schedutils package)。他可以讓某個程式執行在某個(或)某些CPU上。
以下均以Nginx舉例。
1)顯示程式執行的CPU
命令
[oracle@oracle ~]$ taskset -p 1765
pid 1765's current affinity mask: 3 --- 轉化為 2進位制 11
// 1765 是oracle 程式
顯示結果的3實際上是二進位制3個低位均為1的bitmask,每一個1對應於1個CPU,表示該程式在2個CPU上執行
2)指定程式執行在某個特定的CPU上
[root@oracle ~]# taskset -pc 0 1765
pid 1765's current affinity list: 0,1 --- 當前系統 cpu core
pid 1765's new affinity list: 0
//注:0表示CPU將只會執行在第1個CPU上(從0開始計數)。
3)程式啟動時指定CPU
命令
taskset -c 0 /usr/sbin/nginx -c /etc/nginx/nginx.conf
2.sched_setaffinity系統呼叫#include <stdio.h>
#include <math.h> // -lm #include <sched.h> double waste_time(long n) { double res = 0; long double i = 0; for(i=0; i <n * 200000; i++)
res += sqrt(i); return res; } int main(int argc, char **argv) { unsigned long mask = 1; /* processor 0 */ /* bind process to processor 0 */ if (sched_setaffinity(0, sizeof(mask), &mask) <0) { // int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask); perror("sched_setaffinity error\n"); } /* waste some time so the work is visible with "top" */ printf ("result: %f\n", waste_time (200000)); mask = 2; /* process switches to processor 1 now */ if (sched_setaffinity(0, sizeof(mask), &mask) <0) { perror("sched_setaffinity error\n"); } /* waste some more time to see the processor switch */ printf ("result: %f\n", waste_time (20000)); }
執行時 進入 top 然後摁 1 即可看到每個CPU執行狀態;