当您想要清空磁盘缓存/缓冲区时,通常会发出以下命令:
# sync && echo 3 > /proc/sys/vm/drop_caches
但输入该命令后,free
并没有真正0
在buff/cache
列中报告。这是一个例子:
# free -m
total used free shared buff/cache available
Mem: 7.6Gi 2.9Gi 3.6Gi 238Mi 1.1Gi 4.1Gi
Swap: 9.8Gi 1.0Mi 9.8Gi
Total: 17Gi 2.9Gi 13Gi
# sync && echo 3 > /proc/sys/vm/drop_caches
# free -m
total used free shared buff/cache available
Mem: 7.6Gi 2.8Gi 4.2Gi 224Mi 588Mi 4.2Gi
Swap: 9.8Gi 1.0Mi 9.8Gi
Total: 17Gi 2.8Gi 13Gi
所以,缓存中有1.1G
,然后下降到了588M
。
这能588M
降到吗0
?如果(可能)不是,为什么?并且,有没有办法知道发出sync
并写入文件后会提前留下多少缓存/缓冲区/proc/sys/vm/drop_caches
?
答案1
不,它永远不会降至零,因为缓存不仅包括(通常打开的)文件的缓冲区,还包括还正在运行的应用程序和库的磁盘映像。
并且,有没有办法知道发出同步并写入 /proc/sys/vm/drop_caches 文件后将提前留下多少缓存/缓冲区?
对我来说,这看起来是一个非常不平凡的任务,但可能有一个解决方案。计算打开的应用程序/库文件的大小可能会让您找到正确的方向,但事实并非如此,因为例如,如果您正在运行 Google Chrome,其二进制文件的大小为 160MB,但它并没有完全缓存,因为您没有同时运行每个功能。
您可以计算内存范围,从中/proc/$PID/maps
必须接近所需的答案,并且还允许您查看正在运行的应用程序之间共享哪些范围。