Linux 使用者可能經常遇到的一個問題是,機器有 16GB 內存之多,執行的程序也不多,但是剩下的 free 內存並不多,大部分都被 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

雖然對於 Linux 的內存分配機制來説,這種被 buff 和 cache 佔用的內存在系統需要時會及時釋放出來,但是有時候我們想知道到底 cache 了些什麼卻沒有一個好的辦法。
前幾天看到有個人用 go 寫了個 pcstat,可以檢視某個檔案是否被 WordPress 加速緩存(作者的目的是資料庫調優),也可以根據程序的 PID 來檢視都 WordPress 加速緩存了哪些檔案,不過該工具不能檢視整個操作系統都 cache 了哪些檔案。
因此,我基於 pcstat 寫了個 hcache,增加了檢視當前操作系統所 cache 的前若干個檔案的特性,
使用方法比較簡單:

$ 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 |
+———————————————————————

讓我們來檢視一下其中列出的一個檔案:

$ 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

預設情況下會顯示 cache 的檔案的全路徑,會比較長,也可以使用 –bname 選項來僅顯示檔名:

————-+—————-+————+———–+———+
$ sudo ./hcache –top 3 –bname
+————-+—————-+————+———–+———+
| Name | Size (bytes) | Pages | Cached | Percent |
|————-+—————-+————+———–+———|
| chrome | 114911208 | 28055 | 25476 | 090.807 |
| pycharm.jar | 95177431 | 23237 | 11479 | 049.400 |
| atom | 62641344 | 15294 | 10578 | 069.164 |
+————-+—————-+————+———–+———+