我使用笔记本电脑工作,因此每天只暂停到 RAM,而不是关机。这样我就不必每天重新启动每个应用程序。
经过几天的“运行时间”后,我看到缓存已满,但我无法完全清除它。这会导致交换使用,然后导致 OOM。
# echo 3 > /proc/sys/vm/drop_caches; free -wht
total used free shared buffers cache available
Mem: 23Gi 2.2Gi 15Gi 4.7Gi 0.0Ki 5.2Gi 15Gi
Swap: 2.0Gi 0B 2.0Gi
Total: 25Gi 2.2Gi 17Gi
# free -wht
total used free shared buffers cache available
Mem: 23Gi 4.4Gi 457Mi 9.1Gi 3.5Gi 14Gi 9.2Gi
Swap: 2.0Gi 0.0Ki 2.0Gi
Total: 25Gi 4.4Gi 2.4Gi
# echo 3 > /proc/sys/vm/drop_caches; free -wht
total used free shared buffers cache available
Mem: 23Gi 4.3Gi 9.0Gi 9.0Gi 0.0Ki 9.8Gi 9.4Gi
Swap: 2.0Gi 0.0Ki 2.0Gi
Total: 25Gi 4.3Gi 11Gi
# echo 3 > /proc/sys/vm/drop_caches; free -wht
total used free shared buffers cache available
Mem: 23Gi 4.3Gi 9.0Gi 9.0Gi 0.0Ki 9.8Gi 9.4Gi
Swap: 2.0Gi 0.0Ki 2.0Gi
Total: 25Gi 4.3Gi 11Gi
# uptime
10:57:09 up 3 days 19:26, 5 users, load average: 0.89, 1.94, 1.69
# uname -a
Linux xxxxx-00164 5.3.18-150300.59.76-preempt #1 SMP PREEMPT Thu Jun 16 04:23:47 UTC 2022 (2cc2ade) x86_64 x86_64 x86_64 GNU/Linux
#
我还不知道如何检查缓存中卡住了哪些应用程序或文件。我假设 3 > drop_caches 删除全部文件缓存的条目。但随着我的笔记本电脑运行时间增加,删除缓存操作每次都会释放更少的资源。上面的输出跨越约 8 小时。尽管我尝试在 1 秒内两次清除缓存(最后两个 echo 命令),但缓存中剩余的内容在可用中丢失了
如何分析这样的行为?缓存中还剩下什么?
非常感谢!斯特凡·K.
答案1
经过几天的“运行时间”后,我看到缓存已满,但我无法完全清除它。这会导致交换使用,然后导致 OOM。
我认为你正在寻找错误的问题。 drop_caches 命令无法删除正在使用的任何内容 - 这就是它不会变为零的原因。但这通常不是问题。您可能可以在这个网站上找到十几个答案(例如如何清空 Linux 系统上的缓冲区和缓存?)告诉你这通常毫无意义。
但话虽如此,我认为这些都不能解释为什么echo 3 > /proc/sys/vm/drop_caches
不能使cached
数字直接为零。我知道至少有两件事可能会产生影响:文件tmpfs
(包括仍然打开但可能被删除的文件(请参阅Serverfault 上的这个答案)和zram
(参见zramctl
命令)。可能还有其他一些。
基本问题不是缓存——有什么东西正在使用你的内存真正的。