我的服务器的 nfs_inode_cache = 11G 使用率很高,我试图弄清楚是什么消耗了这一切,我已经知道一些 java 应用程序会搜索和遍历具有大量条目和深层目录结构的目录。
有什么方法可以查看 dentry 缓存以了解所有这些内存是什么(正在缓存的路径是什么)?
这是我的 slabtop 命令:
OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
8603424 8603424 100% 1.01K 2867808 3 11471232K nfs_inode_cache
3080826 3080737 99% 0.21K 171157 18 684628K dentry_cache
24717 12515 50% 0.52K 3531 7 14124K radix_tree_node
11365 11108 97% 0.74K 2273 5 9092K ext3_inode_cache
这是我的缓存压力:cat /proc/sys/vm/vfs_cache_pressure 100
答案1
您遇到任何问题了吗?您的 RAM 使用情况如何?(例如free -m
)
对于 Linux 来说,使用任何可用的 RAM 进行缓存是完全正常的 - 其中一些将通过 slabtop(dentry、inodes 等)显示,其余部分将通过free -m
缓存内存(pagecache/swapcache)显示。
/proc/sys/vm/vfs_cache_pressure
控制内核释放它们的比例。100 是默认的“公平”设置。减少此值有利于修剪页面缓存(即文件内容),而增加此值有利于修剪文件系统元数据(inode 等...)。无论如何,缓存修剪只会在内存压力下发生;如果您有大量未使用的内存,内核将保持其用于缓存。
可能更重要的设置是vm.swappiness
- 该设置控制内核交换内存与回收缓存内存的行为。在大多数情况下,默认值都很好,但是如果您看到进程在密集 IO 期间挂起/交换,并且缓存的 RAM 比您需要的多得多,那么您很可能希望减少该值。此外,如果您有大量内存和相当旧的内核,您可能还需要调整这些参数之一(*bytes 或 *ratio,而不是两者!):
- 脏_背景_字节
- 脏背景比率
- 脏字节
- 脏值
所有这些设置均在此处完整记录:https://www.kernel.org/doc/Documentation/sysctl/vm.txt
但是,如果您没有遇到任何问题,挂起进程,过度交换等,那么我建议不要更改默认设置。