我的linode十分繁忙,在跑一些密集運算元據庫的rake任務時尤其如此。但我觀察發現,linode伺服器的4核cpu,只有第1個核心(cpu#0)非常忙,其他都處於idle狀態。
不了解linux是如何排程的,但在linode的這種狀態下,顯然有優化的餘地。除了處理正常任務,cpu#0還需要處理各種中斷。因此,若能將cpu#0分擔的任務攤派到其他cpu核心上,可以預見,系統的處理能力將有更大的提公升。
兩個名詞一、在linux上修改程序的「cpu親和力」smp (symmetrical multi-processing):指在乙個計算機上匯集了一組處理器(多cpu),各cpu之間共享記憶體子系統以及匯流排結構。 [更多...]
cpu affinity:中文喚作「cpu親和力」,是指在cmp架構下,能夠將乙個或多個程序繫結到乙個或多個處理器上執行。[更多...]
在linux上,可以通過 taskset
命令進行修改。以ubuntu為例,執行如下命令可以安裝taskset工具。
# apt-get install schedutils對執行中的程序,文件上說可以用下面的命令,把cpu#1 #2 #3分配給pid為2345的程序:
# taskset -cp 1,2,3 2345但我嘗試沒奏效,於是我關掉了mysql,並用taskset將它啟動:
# taskset -c 1,2,3 /etc/init.d/mysql start對於其他程序,也可如此處理(nginx除外,詳見下文)。之後用top檢視cpu的使用情況,原來空閒的#1 #2 #3,已經在辛勤工作了。
二、配置nginx繫結cpu
剛才說nginx除外,是因為nginx提供了更精確的控制。
在conf/nginx.conf中,有如下一行:
worker_processes 1;這是用來配置nginx啟動幾個工作程序的,預設為1。而nginx還支援乙個名為worker_cpu_affinity的配置項,也就是說,nginx可以為每個工作程序繫結cpu。我做了如下配置:
worker_processes 3;這裡0010 0100 1000是掩碼,分別代表第2、3、4顆cpu核心。worker_cpu_affinity 0010 0100 1000;
重啟nginx後,3個工作程序就可以各自用各自的cpu了。
三、刨根問底
如果自己寫**,要把程序繫結到cpu,該怎麼做?可以用sched_setaffinity
函式。在linux上,這會觸發一次系統呼叫。
如果父程序設定了affinity,之後其建立的子程序是否會有同樣的屬性?我發現子程序確實繼承了父程序的affinity屬性(其實用taskset啟動程序就是一次fork+exec)。
四、windows?
在windows上修改「cpu親和力」,可以通過任務管理器搞定。
* 個人感覺,windows系統中翻譯的「處理器關係」比「cpu親和力」容易理解點兒
—————–
進行了這樣的修改後,即使系統負載達到3以上,不帶快取開啟blogkid.net首頁(有40多次查詢)依然順暢;以前一旦負載超過了1.5,響應就很慢了。效果很明顯。
linux下讓程序執行在指定的cpu上
最近負責的svr壓力比較大,業務邏輯有點複雜,能優化的地方已經全部優化了,目前每秒3k次,cpu負載還是比較高 top看一下,4核的cpu負載不是太均衡,打算考慮一下將業務程序指定到3個cpu上執行,另外乙個cpu專門負責處理網路收發包 打算嘗試一下,如果還是不行,再過段時間,訪問量再增加的話,就要...
linux下讓程序執行在指定的cpu上
最近負責的svr壓力比較大,業務邏輯有點複雜,能優化的地方已經全部優化了,目前每秒3k次,cpu負載還是比較高 top看一下,4核的cpu負載不是太均衡,打算考慮一下將業務程序指定到3個cpu上執行,另外乙個cpu專門負責處理網路收發包 打算嘗試一下,如果還是不行,再過段時間,訪問量再增加的話,就要...
linux下讓程序執行在指定的cpu上
收藏 最近負責的svr壓力比較大,業務邏輯有點複雜,能優化的地方已經全部優化了,目前每秒3k次,cpu負載還是比較高 top看一下,4核的cpu負載不是太均衡,打算考慮一下將業務程序指定到3個cpu上執行,另外乙個cpu專門負責處理網路收發包 打算嘗試一下,如果還是不行,再過段時間,訪問量再增加的話...