在你可能沒有好好用過top命令(1)中,我們介紹了top命令的基本知識,你已經可以基本上了解了top的主要結構和默認輸出的指標,這一節的內容,我們進行一些拓展,看看top還能獲取哪些有用且非常關鍵的信息。
一、我的進程到底消耗多少內存
通過 top -mc 將返回如下結果
這裡增加了 -mc參數後,額外返回了以下內容:
- -m: 使用USED 替換了VIRT,這裡USED=進程物理內存佔用+SWAP佔用,相當於進程對物理內存的佔用,對於排查進程是否存在內存溢出,佔用是否過高非常有意義
- -c:在COMMAND處,直接顯示了該進程的部分運行命令信息,方便迅速定位進程用途
二、哪個進程佔用了系統SWAP空間
當我們的系統大量使用了SWAP時,需要對消耗SWAP的進程進行排查 使用的方法是:
1.將每個進程的SWAP佔用情況顯示出來,執行top之後按f->p->Enter ,SWAP將會出現在COMMAND列之前
2.將顯示結果按照SWAP進行排序,按F->p->Enter,輸出結果將按照SWAP進行排序,將消耗最大的進程放在第一列
在這個案例中,可以看到PID為10121的java進程消耗了45MB的SWAP空間。
這裡有些同學一定遇到過,實際服務器還有大量內存剩餘,但為什麼還是使用了大量SWAP空間呢。
那麼你需要排查以下兩點:
- 內核參數vm.swappiness,默認為60,使用sysctl -a|grep swappiness可獲取該值,意思是在進程在申請內存時,系統將內存分配到swap的積極性。一般建議修改為1,讓操作系統儘量不適用swap。 修改方式: 在/etc/sysctl.conf文件中增加vm.swappiness=1,使用sysctl -p使配置生效。 注意:修改只對之後的內存申請有效,所以沒辦法釋放已經分配在swap中的內存,可以使用進程重啟的方式進行釋放。
- numactl –hardware,查看內存bind的情況,這涉及到SMP/NUMA架構,已遠超過本主題要討論的範圍,大家可以自行查詢相關知識,解決方法可以通過調整BIOS,不再使用NUMA架構,或者使用在啟動進程時,增加numactl –interleave=all的方式,避免NUMA架構帶來的進程使用SWAP的問題。
仔細思考,你一定會有所收穫。
歡迎關注:雲架構那些事兒,專注實用性雲架構分享與IT技術分享。