CPU 架構SMP/NUMA,調優 SMP:全稱是“對稱多處理”(Symmetrical Multi Processing)技術 。 是指在一個電腦上彙集了一組處理器(多CPU),各CPU之間共用記憶體以及匯流排。 弱點:CPU變多後,但是記憶體和記憶體控制器只有一個,CPU是通過記憶體控制器訪問記憶體的,所 ...
CPU 架構SMP/NUMA,調優
SMP:全稱是“對稱多處理”(Symmetrical Multi-Processing)技術 。
是指在一個電腦上彙集了一組處理器(多CPU),各CPU之間共用記憶體以及匯流排。
弱點:CPU變多後,但是記憶體和記憶體控制器只有一個,CPU是通過記憶體控制器訪問記憶體的,所以多個CPU對記憶體控制器就會產生競爭,為了避免競爭就出現了NUMA架構。
NUMA:Non Uniform Memory Access
各個CPU有自己專用的記憶體(學名叫node),但是也可以訪問別的CPU的專業記憶體,這時性能就會下降。
Linux下NUMA相關的命令
numastat:查看節點的狀態。
可以看到自己CPU下的進程命中了自己的記憶體(node)多少次,沒命中多少次,如果沒命中的次數多了怎麼辦?就要強制把這進程綁定到自己的CPU上。
經典的應用場景:把nginx的worker進程綁定到numa架構下的特定的CPU上,性能會大幅度提升。
numactl:可以實現把進程綁定到特定的CPU上
但是,當機器重新啟動後,綁定就失效了。如何解決呢,使用numad
numad:守護進程
numademo
非numa架構,如何把進程綁定到特定的CPU上呢,使用taskset
$ taskset -p -c 0,1,2-4,5,9 1234
上面命令的意思:把進程ip為1234的進程,綁定到0號,1號,2號,3號,4號,5號,9號CPU上。
這隻是個例子,一般都綁定到1個CPU上,但是當系統重啟後,還需要重新綁定,因為pid也變了。
Nginx比較厲害,可以配置哪個worker綁定到哪個CPU,事先寫到配置nginx的配置文件里。
用上面的方法可以讓某個進程專門讓某幾個CPU執行,但是這幾個CPU除了要執行這個進程外,還要執行內核,怎麼避免不讓這些CPU不執行內核,只執行這個進程呢?
解決辦法:假設有6個CPU,系統啟動時,只讓2個CPU執行內核的指令,其餘4個不讓執行內核指令。
編輯/etc/default/grub 文件,在 quiet splash 後面加上 isolcpus=2,3。回到終端執行update-grub 。其將自動依照剛纔編輯的配置文件(/etc/default/grub)生成為引導程式準備的配置文件(/boot/grub/grub.cfg)
即便預留了CPU,被預留的CPU不處理內核的指令了,但是也要處理中斷啊,那麼如何把中斷也不讓這些CPU處理呢?
修改/proc/irq/
$ echo cpu_mask > /proc/irq/<irq_num>/smp_affinity
cpu_mask:用比特位表示。
0001:代表1號CPU
0011:代表1號和2號CPU
0101:代表1號和3號CPU
非numa架構,如何判斷要把哪些進程綁定到特定CPU上呢?如何判斷哪些線程被頻繁的切換了呢?有如下命令
sar -q
使用sar之前要配置一下
1,修改:/etc/default/sysstat, 將 ENABLED=“false“ 改為ENABLED=“true“
2,執行:sudo /etc/init.d/sysstat restart
top
w
uptime
wmstat 1 5
下麵的是查看CPU的使用率
mpstat 1 2
sar -P 1 2
iostat -c 1
cat /proc/stat
命令iostat -c 1的截圖,含義查看CPU的占用率
- %user:用戶進程的CPU占用率
- %system:內核的CPU占用率
- %iowait:io處理的CPU占用率
- %steal:虛擬機的CPU占用率
- %idle:CPU空閑
ys:~$ iostat -c 1
Linux 4.15.0-20-generic (ys-VirtualBox) 2019年09月27日 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.26 0.03 0.08 0.05 0.00 99.57
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.00 0.00 0.00 100.00
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.00 0.00 0.00 100.00
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.00 0.00 0.00 100.00
命令【dstat】比較強大,可以直觀的得到如下信息:
--top-bio
show most expensive block I/O process
顯示最消耗blockI/O的進程
--top-bio-adv
show most expensive block I/O process (incl. pid and other stats)
顯示最消耗blockI/O的進程
--top-childwait
show process waiting for child the most
顯示等待子進程時間最長的父進程
--top-cpu
show most expensive CPU process
顯示最消耗CPU的進程
--top-cpu-adv
show most expensive CPU process (incl. pid and other stats)
顯示最消耗CPU的進程
--top-cputime
show process using the most CPU time (in ms)
顯示最消耗CPU時間片的進程
--top-cputime-avg
show process with the highest average timeslice (in ms)
顯示最消耗CPU時間片的進程
--top-int
show most frequent interrupt
顯示最經常發生的中斷信號
--top-io
show most expensive I/O process
顯示最消耗I/O的進程
--top-io-adv
show most expensive I/O process (incl. pid and other stats)
顯示最消耗I/O的進程
--top-latency
show process with highest total latency (in ms)
顯示等待時間最長的進程
--top-latency-avg
show process with the highest average latency (in ms)
顯示等待時間最長的進程
--top-mem
show process using the most memory
顯示使用記憶體最多的進程
命令【sar -w 1(秒為單位)】比較強大,可以直觀的得到進程在指定秒數里的平均切換次數