![为什么我不能通过 /proc/sys/vm/drop_caches 释放内存缓存](https://linux22.com/image/738048/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%B8%8D%E8%83%BD%E9%80%9A%E8%BF%87%20%2Fproc%2Fsys%2Fvm%2Fdrop_caches%20%E9%87%8A%E6%94%BE%E5%86%85%E5%AD%98%E7%BC%93%E5%AD%98.png)
今天发现服务器内存不多了,执行后free -h
显示有60G内存被缓存占用,于是执行命令释放缓存,结果如下:
$ free -h; sudo sync; echo 3 > sudo /proc/sys/vm/drop_caches; free -h
total used free shared buffers cached
Mem: 126G 114G 11G 5.6M 465M 60G
-/+ buffers/cache: 53G 72G
Swap: 75G 607M 74G
total used free shared buffers cached
Mem: 126G 114G 11G 5.6M 465M 60G
-/+ buffers/cache: 53G 72G
Swap: 75G 607M 74G
似乎根本没有释放任何缓存,并且该服务器上没有虚拟机。为什么?除了重启服务器(我的操作系统是 Debian 8)外,我还应该做什么来释放缓存?
谢谢!
答案1
/proc/sys/vm/drop_caches
没有任何操作用途。不要尝试,否则只会损害性能。唯一实际用例是用于基准测试的冷缓存。
缓存可供应用程序使用,但 Linux 将其称为已使用。强制性要求: https://www.linuxatemyram.com/
为什么要花费金钱和精力去购买快速内存,而不是用它来提高性能呢?
答案2
无法释放内存的原因之一drop_caches
是某些缓存仍在使用中,例如tmpfs
(内存中)文件系统。为了找出为此类内容分配了多少内存,您可以使用df
实用程序:
df -t tmpfs --total -h
此命令将打印出当前正在使用的所有 tmpfs 的使用情况。-t tmpfs
将列表限制为tmpfs
仅限系统,--total
生成列出的所有文件系统的总计,并-h
以人类可读的格式格式化所有大小。
问题是,有些应用程序习惯性地创建临时文件,打开它们然后删除,而不关闭。因此,tmpfs 无法释放内存,因为文件仍在使用中。为了找到这样的应用程序,您可以使用以下命令:
lsof -nP +L1 /dev/shm | grep DEL
这将列出/dev/shm
(常用系统tmpfs
)中所有打开的已删除文件以及打开这些文件的应用程序。-nP
优化以提高执行速度,+L1
限制链接计数并/dev/shm
指定要扫描打开文件的目录。然后,| grep DEL
从列表中仅选择已删除的文件。
Chromium 是最流行的软件之一,但它滥用了/dev/shm
这些功能,因此,您可能会删除由基于 Chromium 或 Electron 的应用程序创建的几 GB 的文件。而且这些缓存不会被删除,drop_caches
也不会在内存不足的情况下被释放。