Linux內(nèi)存管理神器:smem工具
大家好,我是良許。今天給大家分享一款 Linux 系統(tǒng)里的內(nèi)存管理神器:smem 。smem 是Linux系統(tǒng)上的一款可以生成多種內(nèi)存耗用報(bào)告的命令行工具。與現(xiàn)有工具不一樣的是 smem 可以報(bào)告 PSS【Proportional Set Size(按比例占用大小)】,這是一種更有意義的指標(biāo)??梢院饬刻摂M內(nèi)存系統(tǒng)的庫和應(yīng)用程序所占用的內(nèi)存數(shù)量。由于大部分的物理內(nèi)存通常在多個(gè)應(yīng)用程序之間共享,名為駐留集大小(RSS)的這個(gè)標(biāo)準(zhǔn)的內(nèi)存耗用衡量指標(biāo)會(huì)大大高估內(nèi)存耗用情況。PSS這個(gè)參數(shù)而是衡量了每個(gè)應(yīng)用程序在每個(gè)共享內(nèi)存區(qū)中的「公平分配」,給出了一個(gè)切合實(shí)際的衡量指標(biāo)。
1. 安裝 smem 工具
如果你使用的是 Fedora 19 以上系統(tǒng), smem 默認(rèn)在存儲(chǔ)庫中,因此你可以使用 yum 來安裝它:
$ sudo yum install smem
對(duì)于 Ubuntu 用戶,可以使用 apt-get 命令來安裝 smem :
$ sudo apt-get install smem
如果無法正常安裝的話,可以下載它的源碼直接安裝,地址為:https://www.selenic.com/smem/download/
2. smem 工具常見用法
默認(rèn)情況下, smem 將顯示每個(gè)正在運(yùn)行的進(jìn)程及所使用的內(nèi)存。在這里,你可以留意 RSS 相對(duì)于 USS 和 PSS 的大小,可以看到它明顯高于另外二者。
$ smem
此外, smem 還可顯示每個(gè)庫所使用的內(nèi)存。這個(gè)結(jié)果比較長,可能需要耗費(fèi)一些時(shí)間,取決于你的系統(tǒng)。
$ smem -m
這個(gè)命令產(chǎn)生的結(jié)果太多了,如果我們想要查看特定應(yīng)用程序使用內(nèi)存情況,例如 Firefox,那么我們可以配合 grep 命令使用,同時(shí)使用 -p 選項(xiàng)以百分比形式查看內(nèi)存使用情況。
$ smem -m -p | grep firefox
smem 命令還可以顯示每個(gè)用戶的內(nèi)存使用情況,需要使用 -u 選項(xiàng):
$ smem -u -p
你還可以使用 -w 選項(xiàng)查看系統(tǒng)內(nèi)存使用情況:
$ smem -w -p
3. 結(jié)果可視化輸出
顯示數(shù)字畢竟不直觀,我們還可以使用 smem 生成圖形圖表來顯示內(nèi)存使用情況,一目了然。要達(dá)到這個(gè)目的,我們需要使用到除了不能生孩子啥都可以干的 Python 。但光有 Python 還不行,還需要安裝用于生成圖表的 matplotlib 庫。Fedora 用戶可以通過運(yùn)行以下命令來安裝它:
$ sudo yum install python-matplotlib
Ubuntu 用戶可以通過運(yùn)行下面命令獲得它:
$ sudo apt-get install python-matplotlib
庫安裝之后,現(xiàn)在就可以以條形圖或餅圖的形式將獲得的內(nèi)存使用情況以可視化表示。
3.1 餅形圖
使用 smem 以餅圖的形式查看內(nèi)存使用情況,需要加上 --pie 選項(xiàng),如下所示:
$ smem --pie name -s pss
命令運(yùn)行之后將生成一個(gè)餅圖。請(qǐng)注意,這條命令里我們還加了 -s pss ,意思是顯示 PSS 的內(nèi)存使用情況。要獲取 USS 和 RSS 的餅圖,只需將命令中的 pss 替換為 uss 或 rss 即可。
從兩個(gè)餅圖中,可以看到 RSS 報(bào)告還有 41.74% 的未使用內(nèi)存,而 PSS 報(bào)告有 53.02% 的未使用內(nèi)存??梢钥闯鰜?,RSS 顯示的可用內(nèi)存偏小,但實(shí)際還有很充足的內(nèi)存空間。
3.2 柱狀圖
smem 的另一個(gè)很酷的特性是以柱狀圖的形式生成輸出。有了這個(gè)功能,你可以一次性查看 USS、PSS 和 RSS 報(bào)告的內(nèi)存使用情況。要實(shí)現(xiàn)這個(gè)功能,需要加上 --bar 選項(xiàng):
$ smem --bar pid -c "pss uss rss"
上面的命令將給出帶有進(jìn)程 ID 號(hào)的內(nèi)存使用情況的輸出結(jié)果。如果想要查看進(jìn)程的名稱,可以將 pid 替換為 name 即可。命令運(yùn)行之后,可以生成如下圖所示的條柱狀圖。