Nginx 關於程式數 與CPU核心數相等時,程式間切換的代價是最小的-- 繫結CPU核心

Rocky_Ansi發表於2017-04-26

在閱讀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執行狀態;

            

         

 

相關文章