我的服务器的免费命令输出目前如下:
# 免费 -m 已使用的、可用的、缓存的共享缓冲区总数 内存:995 780 205 0 49 599 -/+ 缓冲区/缓存:140854 交换:0 0 0
我们知道dd应用程序一般都会使用page cache来加速文件访问。
发出命令后:
dd if=/dev/zero of=2.txt bs=1M count=10
以下输出显示页面缓存增加了10M左右。
# 免费 -m 已使用的、可用的、缓存的共享缓冲区总数 内存:995 790 215 0 49 599 -/+ 缓冲区/缓存:140854 交换:0 0
上述输出是正常的。
然后我就跑了
同步该命令会将页面缓存中的内容再次同步到硬盘,同时
免费-m命令。
如下所示,没有任何变化。这与写回机制有关吗?该机制规定,尽管执行了同步命令,但页面缓存也不会被回收,除非这部分页面缓存正在被更改。
或者,直到内核参数 /proc/sys/vm/drop_caches 被修改之前,页面缓存根本不会被回收?
# 免费 -m 已使用的、可用的、缓存的共享缓冲区总数 内存:995 790 205 0 49 599 -/+ 缓冲区/缓存:140854 交换:0 0 0
如果是,那么 free -m 中的缓存最大可以达到多少?是否有任何内核参数控制它?谢谢。
答案1
dd 不直接使用页面缓存,而是执行自动缓存的 I/O。
仅仅因为提交了某项操作就删除缓存是低效的。下一次读取需要来自底层设备,这可能比 RAM 慢数百到数千倍。
预计缓存将使用几乎所有未使用的 RAM。如果将其视为可用内存,则如果程序分配内存,缓存将首先被回收。
不要在生产操作中使用 /proc/sys/vm/drop_caches,它没有帮助。来自文档/sysctl/vm.txt
该文件不是控制各种内核缓存(inodes、dentry、pagecache 等)增长的手段。当系统的其他地方需要内存时,这些对象会被内核自动回收。
使用此文件可能会导致性能问题。由于它会丢弃缓存的对象,因此可能需要大量 I/O 和 CPU 来重新创建丢弃的对象,尤其是在这些对象使用率很高的情况下。因此,不建议在测试或调试环境之外使用。
vm 的 sysctl 文档确实列出了一些用于控制虚拟内存子系统的调整参数,包括脏页行为和最小可用空间。我不建议更改它们,除非您详细了解这样做的好处。在此之前,请使用默认值或预定义的tuned
配置文件。