你可能沒有好好用過top命令(2)

你可能沒有好好用過top命令(2)

你可能沒有好好用過top命令(1)中,我們介紹了top命令的基本知識,你已經可以基本上了解了top的主要結構和默認輸出的指標,這一節的內容,我們進行一些拓展,看看top還能獲取哪些有用且非常關鍵的信息。

一、我的進程到底消耗多少內存

通過 top -mc 將返回如下結果

你可能沒有好好用過top命令(2)

這裡增加了 -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進行排序,將消耗最大的進程放在第一列

你可能沒有好好用過top命令(2)

在這個案例中,可以看到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技術分享。

你可能沒有好好用過top命令(2)


分享到:


相關文章: