radix_tree_node
是否可以在不减少总体缓存大小的情况下减少 Linux 中用于缓存的空间?
例如,我目前有
$ sudo slabtop -sc --once | awk '{ if (0 + $1 > 0) { printf "%20s: % 6d MB, active %3.0f%%\n", $8, $7 / 1024, (100*$2/$1); } }'
ext4_inode_cache: 10387 MB, active 100%
dentry: 2042 MB, active 100%
radix_tree_node: 263 MB, active 90%
buffer_head: 117 MB, active 100%
kmalloc-rcl-64: 92 MB, active 100%
kmalloc-rcl-96: 79 MB, active 100%
dmaengine-unmap-2: 43 MB, active 100%
vm_area_struct: 18 MB, active 99%
task_struct: 13 MB, active 98%
ext4_extent_status: 12 MB, active 100%
ext4_groupinfo_4k: 10 MB, active 100%
inode_cache: 10 MB, active 90%
kmalloc-4k: 7 MB, active 99%
kmalloc-rcl-128: 7 MB, active 100%
kernfs_node_cache: 5 MB, active 100%
proc_inode_cache: 5 MB, active 99%
所以所有其他缓存都有至少98% 活跃,但radix_tree_node
只有 90% 活跃。该系统并没有浪费大量内存,但如果radix_tree_node
减小大小以消除非活动缓存,似乎整体缓存使用率将会提高。如果我只是跑步slabtop -sc
,USE 0%
但radix_tree_node
我认为这只是不正确的会计。
例如,似乎我可能需要减少,/proc/sys/vm/vfs_cache_pressure
因为dentry
缓存只有 20%,而ext4_inode_cache
两者都具有 100% 活动状态。对于我的工作负载,系统需要统计大量目录条目。
答案1
经过试验后,我想说您应该运行 Linux 内核版本 5.4 或更高版本,然后/proc/sys/vm/vfs_cache_pressure
根据需要进行调整。我会尝试使用尽可能小的值,但仍然不会导致系统速度变慢。根据我的经验,vfs_cache_pressure
1-10 范围内的值适用于内核版本 5.3,但内核版本 5.4 需要接近 100 的值才能获得类似的行为。
较低的值vfs_cache_pressure
有利于将更多的目录元数据保存在 RAM 中,这样当进程访问文件时,存储介质只需要获取文件的实际内容。这对于随机访问速度较慢的 HDD 尤其重要。对于存储介质而言,获取深层目录层次结构的元数据似乎是随机数据访问,因为系统需要读取多个级别的目录,并且每个目录位于实际存储介质上的不同区域。
但是,如果减少vfs_cache_pressure
太多,系统可能会开始交换而不是从缓存中删除目录元数据,这显然也会导致性能不佳。我认为这是内核版本 5.3 和 5.4 之间最重要的区别。在 5.3 版本中,您可以vfs_cache_pressure
一直设置为1
,系统不会开始交换以保留dentries
在 RAM 中。对于内核版本 5.4 的系统,如果您了解以下内容,那么交换会更加愉快100
。
我想我需要尝试对/proc/sys/vm/vfs_cache_pressure
和的不同组合进行基准测试/proc/sys/vm/swappiness
。我目前的运行速度
vfs_cache_pressure
为 120 和swappiness
80,当后台进程检查系统中的大量目录(例如,备份脚本检查系统中的新文件)时,有时会遇到速度变慢的情况。在我看来,目前系统使用 RAM 进行缓存的方式dentries
有点过于激进,当在请求得到服务之前需要通过删除一些其他缓存来释放 RAM 时,请求更多内存的程序会变慢。