一个经常被问到的 Linux
问题:为啥 Linux
系统没运行多少程序,显示的可用内存这么少?
其实 Linux
与 Windows
的内存管理不同,会尽量缓存内存以提高读写性能,通常叫做 Cache Memory
。
比较老的资料都会介绍 Linux
的 Cache
占用很多并没有关系,因为 Linux
会尽可能利用内存进行缓存。但是缓存的回收也是需要资源的,比较好的一篇文章是 Poor Zorro 写的 Linux
内存中的 Cache 真的能被回收么?。
虽然大部分情况下我们看到 Cache
占用很高时是没有问题的,但是我们还是想弄清楚到底是哪个程序把 Cache
弄的那么高,这居然不是一件容易的事。
内核的模块在分配资源的时候,为了提高效率和资源的利用率,都是透过 Slab
来分配的。Slab
为结构性缓存占用内存,该项也经常占用很大的内存。不过借助 slabtop
工具,我们可以很方便的显示内核片缓存信息,该工具可以更直观的显示 /proc/slabinfo
下的内容。
1 | # 显示了一台机器缓存中占用对象的情况 |
虽然上面的命令显示了 Cache
中 Slab
的情况,但是还是没有显示什么程序占用的 Cache
。
方案一:使用 Pcstat 来实现
经过搜索,发现 linux-ftools
这个工具可以显示某个文件占用的 Cache
的情况, fincore
只是它其中的一个工具。
1 | $ fincore [options] files... |
fincore
的工作原理是将指定文件的相应 Inode Data
与 Kernel
的 Page Cache Table
做对比,如果 Page Cache Table
有这个 Inode
信息,就找到该 Inode
对应的 Data Block
的大小。
因为 Kernel
的 Page Cache Table
只存储 Data Block
的引用而不是文件名,即文件的 Inode
信息。所以并没有任何一个工具运行一次就可以找出所有的文件使用缓存的情况。所以使用 linux-fincore
这个工具也只能加文件名来判断该文件是否被缓存,如果缓存,大小是多少。问题是你不能随便猜哪个文件是否被缓存吧。
Shanker
提供了一个脚本来解决此问题,那就是查看哪些进程使用的物理内存最多,就找到该进程打开的文件,然后用 fincore
来查看这些文件的缓存使用率。
这个办法在大部分情况下都可以找到占用 Cache
较多的程序和进程。脚本内容如下:
1 | #!/bin/bash |
比较遗憾的是,linux-ftools
目前已经不再维护了。在新版本的操作系统上没法编译好这个程序,所以这个方法失效了。
再次通过万能的 Google
搜索,后来我找到了 pcstat
这个工具,pcstat
使用 Go 语言开发,功能基本和 linux-ftools
一样 。
然后我修改了 Shanker
的脚本,让它使用 pcstat
来进行处理,这样就可以很好的找到 Cache
所占用的情况。修改后的脚本如下:
1 | #!/bin/bash |
脚本运行成功后的显示结果如下:
1 | +------------------------------------------+----------------+------------+-----------+---------+ |
从结果我们可以看到 uuid.log
占用 Cache
比较多。这个文件是打开的,程序一直在往里面写日志,Linux 应该是把它缓存了。
方案二:使用 Vmtouch 来实现
除了上面提到的 pcstat
工具外,你还可以使用 vmtouch
来实现同样的目的。vmtouch
是一个可以查询到缓存的文件和目录,并且能把文件推入缓存或者驱逐出缓存的工具。
安装 Vmtouch
1 | $ git clone https://github.com/hoytech/vmtouch |
使用 Vmtouch
- vmtouch 命令语法
1 | $ vmtouch |
- 一些使用的例子
由于 vmtouch
直接支持目录级查询,所以使用起来简单得多了。
- 查看 /tmp 目录在内存中的缓存
1 | $ vmtouch /tmp/ |
如果需要查看更详细信息,可以使用 -v
参数。
1 | $ vmtouch -v /tmp/ |
- 查看一个文件被缓存了多少
1 | $ vmtouch -v ~/Downloads/phoronix-test-suite_6.0.1_all.deb |
- 把指定的文件缓存起来
1 | $ vmtouch -vt ~/Downloads/phoronix-test-suite_6.0.1_all.deb |
- 把缓存中指定的数据驱逐出去
1 | $ vmtouch -ve ~/Downloads/phoronix-test-suite_6.0.1_all.deb |
更多关于 vmtouch
使用的具体信息,你可以参考官网:https://hoytech.com/vmtouch/ 。
如果你还有更多 Linux
下查看 Cache
或 Buffer
占用的方法,请直接留言告诉我们哟!