如何使用 sysctl 清除内存缓存
我们还可以使用 sysctl -w vm.drop_caches=[number] 命令触发缓存丢弃。
- 要释放 pagecache、dentries 和 inode,请使用以下命令。
sysctl -w vm.drop_caches=3
- 要仅释放 dentries 和 inode,请使用以下命令。
sysctl -w vm.drop_caches=2
3.要仅释放页面缓存,请使用以下命令。
sysctl -w vm.drop_caches=1
注意:如果系统内存和 I/O 负载过重,使用 vm.drop_caches 会导致死锁!!!
“干净”的缓存数据可以丢弃。
“脏”缓存数据需要写入某处。
使用 vm.drop_caches 永远不会触发内核丢弃脏缓存。
什么是内存缓存
为了加速操作并减少磁盘 I/O,内核通常会尽可能多地缓存内存 根据设计,包含缓存数据的页面可以按需重新用于其他用途(例如,应用程序) 重新调整内存用于此方式并不比声称原始未触及的页面慢。
/proc/sys/vm/drop_caches 的目的是什么
写入 /proc/sys/vm/drop_caches 允许请求内核立即删除尽可能多的干净缓存数据。
这通常会导致一些内存变得更明显可用;然而,在正常情况下,这应该不是必要的。
如何使用 /proc/sys/vm/drop_caches 清除内存缓存
将适当的值写入文件 /proc/sys/vm/drop_caches 会导致内核从内存中删除干净的缓存、dentries 和 inode,从而导致该内存变为空闲。
- 要清除PageCache,只需运行:
# sync; echo 1 > /proc/sys/vm/drop_caches
- 为了清除 dentries(也称为目录缓存)和 inode 运行:
# sync; echo 2 > /proc/sys/vm/drop_caches
- 为了清除 PageCache,运行 dentries 和 inode:
# sync; echo 3 > /proc/sys/vm/drop_caches
运行sync会将脏页写出到磁盘。
通常脏页是正在使用的内存,因此它们不可用于释放。
因此,运行同步可以帮助随后的删除操作释放更多内存。
页面缓存是读取文件后保留的内存。
Linux 内核倾向于保留未使用的页面缓存,假设读取一次的文件很可能在不久的将来再次读取,从而避免对磁盘 IO 的性能影响。
dentry 和 inode_cache 是读取目录/文件属性后保留的内存,例如 open() 和 stat()。
dentry 在所有文件系统中都很常见,但 inode_cache 是基于每个文件系统的。
Linux 内核更喜欢保留这些信息,假设在不久的将来会再次需要它,从而避免磁盘 IO。
注意:以上面 3 个命令中显示的同步命令开始是可选的。
sync 命令允许内核将尽可能多的脏缓存页面写入磁盘(以最大化可以删除的数据缓存页面的数量)
我们是否面临性能问题并怀疑它可能与缓存使用有关?
高速缓存使用率高通常不会导致性能问题,但在某些极少数情况下可能是根本原因。