为什么我不能通过 /proc/sys/vm/drop_caches 释放内存缓存

为什么我不能通过 /proc/sys/vm/drop_caches 释放内存缓存

今天发现服务器内存不多了,执行后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也不会在内存不足的情况下被释放。

相关内容