Linux 用戶可能經(jīng)常遇到的一個(gè)問題是,機(jī)器有 16GB 內(nèi)存之多,運(yùn)行的進(jìn)程也不多,但是剩下的 free 內(nèi)存并不多,大部分都被 buff 和 cache 占用了(比如下面我的 PC)。
$ free -h
total??????? used??????? free????? shared? buff/cache?? available
Mem:??????????? 15G??????? 6.4G??????? 2.3G??????? 1.1G??????? 6.9G??????? 7.7G
Swap:????????? 975M??????? 268K??????? 975M
雖然對(duì)于 Linux 的內(nèi)存分配機(jī)制來說,這種被 buff 和 cache 占用的內(nèi)存在系統(tǒng)需要時(shí)會(huì)及時(shí)釋放出來,但是有時(shí)候我們想知道到底 cache 了些什么卻沒有一個(gè)好的辦法。
前幾天看到有個(gè)人用 go 寫了個(gè) pcstat,可以查看某個(gè)文件是否被緩存(作者的目的是數(shù)據(jù)庫(kù)調(diào)優(yōu)),也可以根據(jù)進(jìn)程的 PID 來查看都緩存了哪些文件,不過該工具不能查看整個(gè)操作系統(tǒng)都 cache 了哪些文件。
因此,我基于 pcstat 寫了個(gè) hcache,增加了查看當(dāng)前操作系統(tǒng)所 cache 的前若干個(gè)文件的特性,你可以從這里下載下來試用。如果有什么建議的話也歡迎反饋給我:hubottle@gmail.com 。
使用方法比較簡(jiǎn)單:
$ sudo hcache --top 10
[sudo] password for silenceshell:
+----------------------------------------------------------------------------------+----------------+------------+-----------+---------+
| Name???????????????????????????????????????????????????????????????????????????? | Size (bytes)?? | Pages????? | Cached??? | Percent |
|----------------------------------------------------------------------------------+----------------+------------+-----------+---------|
| /opt/google/chrome/chrome??????????????????????????????????????????????????????? | 114911208????? | 28055????? | 25457???? | 090.740 |
| /usr/share/code/code???????????????????????????????????????????????????????????? | 67688720?????? | 16526????? | 12274???? | 074.271 |
| /home/silenceshell/Software/pycharm-community-2016.2/lib/pycharm.jar?????????????????? | 95177431?????? | 23237????? | 11325???? | 048.737 |
| /opt/atom/atom?????????????????????????????????????????????????????????????????? | 62641344?????? | 15294????? | 10578???? | 069.164 |
| /usr/bin/dockerd???????????????????????????????????????????????????????????????? | 39121168?????? | 9552?????? | 7103????? | 074.361 |
| /home/silenceshell/Software/pycharm-community-2016.2/jre/jre/lib/amd64/libjfxwebkit.so | 57455824?????? | 14028????? | 6625????? | 047.227 |
| /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4.10.2????????????????????????????????? | 36462184?????? | 8902?????? | 6316????? | 070.950 |
| /usr/lib/beyondcompare/BCompare????????????????????????????????????????????????? | 30640160?????? | 7481?????? | 5505????? | 073.586 |
| /usr/bin/SecureCRT?????????????????????????????????????????????????????????????? | 29524560?????? | 7209?????? | 4806????? | 066.667 |
| /usr/share/code/libnode.so?????????????????????????????????????????????????????? | 21135976?????? | 5161?????? | 4588????? | 088.898 |
+---------------------------------------------------------------------
讓我們來查看一下其中列出的一個(gè)文件:
$ lsof /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4.10.2
COMMAND??? PID?? USER? FD?? TYPE DEVICE SIZE/OFF??? NODE NAME
quiterss 20630 silenceshell mem??? REG??? 8,5 36462184 3936610 /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4.10.2
默認(rèn)情況下會(huì)顯示 cache 的文件的全路徑,會(huì)比較長(zhǎng),也可以使用 --bname 選項(xiàng)來僅顯示文件名:
-------------+----------------+------------+-----------+---------+
$ sudo ./hcache --top 3? --bname
+-------------+----------------+------------+-----------+---------+
| Name??????