常常感覺系統資源不夠用,一台機子上跑了不下3個比較重要的服務,但是每天我們還要在上面進行個備份壓縮等處理,網路長時間傳輸,這在就很影響本就不夠用的系統資源;
這個時候我們就可以把一些不太重要的比如copy/備份/同步等工作限定在一顆cpu上,或者是多核的cpu的一顆核心上進行處理,雖然這不一定是最有效的方法,但可以最大程度上利用了有效資源,降低那些不太重要的程序占用cpu資源;
檢視系統下cpu資訊: cat /proc/cpuinfo
taskset就可以幫我們完成這項工作,而且操作非常簡單;
利用 taskset 可以充分利用多核cpu的好處,可以讓某個程式或指令碼,執行在某個具體的cpu上。
這個工具系統可能沒有預設安裝:,rpm包名util-linux
#taskset --help
taskset (util-linux 2.13-pre7)
usage: taskset [options] [mask | cpu-list] [pid | cmd [args...]]
set or get the affinity of a process
-p, –pid operate on existing given pid
-c, –cpu-list display and specify cpus in list format
-h, –help display this help
-v, –version output version information
檢視pid和哪個cpu親和:
taskset -pc pid
例子:taskset -pc 3687
返回pid 3687's current affinity list:0,1,2,3
taskset -pc 0-1 3687或者taskset -pc 0,1 3687
設定執行緒3678和0,1兩個cpu核心親和
1)顯示程序執行的cpu
命令taskset -p 21184
顯示結果:
pid 21184's current affinity mask: ffffff
注:21184是redis-server執行的pid
顯示結果的ffffff實際上是二進位制24個低位均為1的bitmask,每乙個1對應於1個cpu,表示該程序在24個cpu上執行
1:讓某個程式執行在特定cpu上面
taskset -c 0 sh wade.sh
2:切換某個程序到特定的cpu上。
taskset -pc 0 12345
比如你有乙個cpu是4 core你可以這樣寫你的指令碼
#!/bin/bash
taskset -c 0 sh a.sh &
taskset -c 1 sh b.sh &
taskset -c 2 sh c.sh &
taskset -c 3 sh d.sh &
應該可以充分利用你的cpu了。
對執行中的程序,文件上說可以用下面的命令,把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繫結cpu
剛才說nginx除外,是因為nginx提供了更精確的控制。 在
conf/nginx.conf
worker_processes 1;
這是用來配置nginx啟動幾個工作程序的,預設為1。而nginx還支援乙個名為worker_cpu_affinity的配置項,也就是說,nginx可以為每個工作程序繫結cpu。我做了如下配置:
worker_processes 3;
worker_cpu_affinity 0010 0100 1000;
這裡0010 0100 1000是掩碼,分別代表第2、3、4顆cpu核心。
重啟nginx後,3個工作程序就可以各自用各自的cpu了。
應用例項:
在一台多核 cpu 的 web 伺服器上,存在負載不均衡問題,其中 cpu0 的負載明顯高於其它 cpux,進一步調查表明 php-fpm 的嫌疑很大。話說以前我曾經記錄過軟中斷導致過類似的問題,但是本例中可以排除嫌疑。
讓我們在一台四核伺服器上取樣分析一下資料確認看看是否存在負載不均衡問題:
shell> mpstat -p all 1 10
cpu %usr %nice %sys %iowait %irq %soft ... %idle
all 17.57 0.03 1.78 0.00 0.35 0.23 ... 80.04
0 43.17 0.00 4.12 0.00 1.41 1.00 ... 50.30
1 9.80 0.00 0.81 0.00 0.00 0.00 ... 89.39
2 9.31 0.00 1.20 0.00 0.00 0.00 ... 89.49
3 7.94 0.10 0.80 0.00 0.00 0.00 ... 91.16
如上命令的含義是每秒執行一次 mpstat,一共取樣 10 次取平均值,可以明顯看出 cpu0 的空閒 idle 明顯小於其它 cpux,而且大部分都消耗在了使用者態 usr 上面。
再讓我們通過 pidstat 來確認一下是不是 php-fpm 導致的 cpu0 負載問題:
shell> pidstat | grep php-fpm | awk 『『 | sort | uniq -c
157 0
34 1
34 2
32 3
可見分配給 cpu0 的 php-fpm 程序比其他三個 cpux 總和還要多。為什麼大部分程序被分配給了 cpu0?我模模糊糊有一些印象是因為作業系統偏愛使用 cpu0,但我暫時也沒找到實質的線索可以佐證,如果有人知道,麻煩告訴我。
問題總要解決,既然 php-fpm 沒有類似 nginx 那樣 cpu 親緣性(affinity)繫結的指令,那麼我們可以使用 taskset 繫結 php-fpm 程序到固定的 cpux 來解決問題:
#!/bin/bash
cpus=$(grep -c processor /proc/cpuinfo)
pids=$(ps aux | grep "php-fpm[:] pool" | awk 『『)
let i=0
for pid in $pids; do
cpu=$(echo "$i % $cpus" | bc)
let i++
taskset -pc $cpu $pid
done
如上指令碼執行後,讓我們再來看看各個 cpu 負載分配情況如何:
shell> mpstat -p all 1 10
cpu %usr %nice %sys %iowait %irq %soft ... %idle
all 15.73 0.03 1.61 0.00 0.20 0.23 ... 82.20
0 16.28 0.10 1.62 0.10 0.81 0.91 ... 80.18
1 16.16 0.10 1.51 0.00 0.00 0.10 ... 82.13
2 14.46 0.10 1.71 0.00 0.00 0.00 ... 83.73
3 15.95 0.00 1.71 0.00 0.00 0.00 ... 82.35
終於平均了,不過需要提醒的是,一旦 php-fpm 處理的請求數超過 max_requests 的設定,那麼對應的程序將自動重啟,先前的 taskset 設定也將失效,所以為了一直有效,我們需要把 taskset 指令碼新增到 cron 配置中去,例如每分鐘自動設定一遍!
本文把 php-fpm 程序平均分配給了 0,1,2,3 四個 cpu,實際操作的時候可以更靈活一些,比如前文我們提過,作業系統總是偏愛使用 cpu0,如果 cpu0 的負載已經很高了的話,那麼我們不妨把 php-fpm 程序平均分配給 1,2,3 三個 cpu。
oracle 效能調優 解決CPU問題
你能解決cpu容量問題,通過以下幾步 1.從負載消費上監測並解決cpu問題。2.通過利用oracle 資料庫資源管理器優化配置cpu資源來減少峰值負載的影響 3.當多個cpu的系統上執行多個資料庫例項的能夠利用例項限制策略來限制單個 資料庫例項能夠利用的cpu資源。4.增加硬體容量,提公升系統結構 ...
效能調優 CPU方面,記憶體方面
innodb儲存引擎一般都應用於oltp的資料庫應用,這種應用的特點如下所示 使用者操作的併發量大。事務處理的時間一般比較短。查詢的語句較為簡單,一般都走索引。複雜的查詢較少。可以看出,oltp的資料庫應用本身對cpu的要求並不高,因為複雜的查詢可能需要執行比較 排序 連線等非常耗cpu的操作,這些...
Linux記憶體 效能調優
記憶體是影響linux效能的主要因素之一,記憶體資源的充足與否直接影響應用系統的使用效能。free命令 監控linux記憶體使用狀況。由上圖可知,空閒記憶體是free buffers cached 155mb 一般來說如果空閒記憶體 物理記憶體 70 記憶體效能優 如果小於20 則效能差,需要新增記...