我有一台 Thecus N8900 NAS,它是基于 Linux 的文件服务器,通过 NFS 向六个客户端提供文件。由于 Thecus 支持尚未解释的某些原因,它会运行一个脚本,每 60 秒检查一次 /proc/meminfo,如果磁盘缓存超过可用 RAM 的 50%,它们会执行“echo 3 > /proc/sys/vm/drop_caches”命令来刷新缓存。
撇开这是否有意义的问题不谈,实际的“echo 3 > /proc/sys/vm/drop_caches”命令可能需要几个小时才能完成,这对我来说似乎太长了。
最大的问题是,当这种情况发生时,机器的负载会激增,磁盘利用率也会激增,使得所有 NFS 流量都缓慢运行,直到命令最终完成,此时一切才会再次响应。
NAS 本身有 16 GB 的 RAM,7 个驱动器采用 raid6 配置(外加一个热备用),没有任何驱动器问题(根据 SMART 测试)。
所以问题是:什么原因导致 drop_caches 命令花费这么长时间?
答案1
删除缓存根本不会花太多时间。你确定它真的几个小时都没有从那个 echo 命令返回吗?
删除缓存后机器速度变慢是有道理的,因为以前可以从缓存中读取的文件现在必须从磁盘中读取。
答案2
命令本身应该立即完成。结果,即所有内容都需要再次缓存,可能需要很长时间。这没有意义:如果你能完全删除它,那将是一个好主意。
也许你看错了命令:它是否在sync
之前也执行了echo 3 > /proc/sys/vm/drop_caches
,例如
sync; echo 3 > /proc/sys/vm/drop_caches
?因为sync
刷新所有写入磁盘的操作可能需要一点时间才能完成。此外,虽然也sync
存在性能问题,但它可能有一定的道理,万一突然断电,数据已经写入磁盘,所以你会很安全。
答案3
难道是这个?
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit /mm/vmscan.c?id=1399af7e54896c774d67f1c1acc491b07149421d