先要說的是,並不是所有的場景都適合綁定的,當出現內存交叉訪問,或者緩存命中較低時,或者你想把某進程運行在特定的CPU上時可以進行綁定。那么要先知道怎么查看是否出現了交叉內存訪問。
那么除了交叉內存訪問,還有什么值得我們去綁定進程呢?
那就了解下內存貶值吧:
如果很多進程運行在CPU的某一個核心之上,我們都知道,CPU核心都是和L1直接打交道的,而各個進程間呢,還是切換着輪流運行的,如果我L1中全部緩存了進程A的數據,那么當我進程B或進程C運行時,極有可能會置換L1中的緩存數據,如果A進程沒有運行完,當進程A再次執行時,還需要去置換L1中的緩存數據,這樣,各個進程運行時可能每次都要置換L1中的數據,可能大部分時間都浪費在了置換緩存上,所以,我們可以將對性能敏感的進程綁定到某一個或一組核心,將多線程的程序也綁定到某一核心,這樣,將大大提高服務器性能。
先來說numastat這個命令:
這個命令主要是顯示進程與每個numa節點的內存分配的統計數據和分配的成功與失敗情況。先上個圖:
可以看到我這里只有一個Node節點,也就是說只有一顆CPU,所以可能看不出效果。
numa_hit---命中的,也就是為這個節點成功分配本地內存訪問的內存大小
numa_miss---把內存訪問分配到另一個node節點的內存大小,這個值和另一個node的numa_foreign相對應。
numa_foreign--另一個Node訪問我的內存大小,與對方node的numa_miss相對應
interleave_hit---這個參數暫時不明確
local_node----這個節點的進程成功在這個節點上分配內存訪問的大小
other_node----這個節點的進程 在其它節點上分配的內存訪問大小
很明顯,miss值和foreign值越高,就要考慮綁定的問題。
numastat的常用參數:
-c:緊湊的顯示信息,並將內存四舍五入到MB單位,如果節點較多,可以使用這個參數,看圖,來看下效果:
單位都變成了MB了
-m:顯示每個節點中,系統范圍內使用內存的情況,可以與其它參數組合使用:
-n:以原格式顯示,但單位為MB
-p:可以指定pid或指定某Node
-s:進行排序,查看的更直觀:
-z:忽略所有為0的行和列
下面再來說一下一個綁定的命令,numactl,這個命令可以將某個進程綁定到某個node或某個node上的某個或某組核心上。
--show:可以查看當前的numa策略,
-H:可以顯示各Node中內存使用情況
--membind:只從某節點分配內存,當某節點內存不足,則會分配失敗,格式:
numactl --membind=nodes program(nodes寫你要分配的節點0或1或者其它節點數,后面是程序,可以寫絕對路徑,也可寫服務啟動腳本)
--numactl:把進程綁定到某節點上,用法如下:
numactl --cpunodebind=nodes program(nodes為Cpu節點,后面跟程序,)
--physcpubind:把進程綁定到某核心上,如果程序運行,用法如下(參數太長就簡寫了,其它簡寫參數自己Man):
numactl -C 1,3 httpd
--localalloc:指令永遠在當前節點分配內存,用法:
numactl -l httpd
--preferred:如果指定的內存無法分配足夠的空間,可以指定去某一個節點的內存分配,格式如下:
numactl --preferred=0 httpd
上面的大部分參數需要停止服務后執行。機器重啟配置失效。
在redhat6中,有一個numad的服務(需手工安裝),它可以自動的監控我們cpu狀況,並自動平衡資源,這個服務需要在內存使用量非常大的時候才會有明顯的效果,當內存空余量較大時,需要關閉KSM,避免發生沖突。官方說在某些內存使用巨大的環境中,可能會提高50%的性能。
兩種使用方法:
1.service numad start
2.numad -S 0 -p pid 使用numad -i 0 停止
numad暫時沒有使用過,了解的不多。。
-----------------------------------
©著作權歸作者所有:來自51CTO博客作者胡研的原創作品,如需轉載,請與作者聯系,否則將追究法律責任
CPU性能監控之二-----Numa架構下進程與CPU綁定
https://blog.51cto.com/hl914/1557615