#939·bbolt

MADV_RANDOM 在 Linux 6.4 及更高版本中导致主要页错误显著增加

作者: sdodson创建于 2025年4月8日更新于 2026年8月31日
标签stage/tracked

在 https://GitHub.com/torvalds/linux/commit/8788f6781486769d9598dcaedc3fe0eb12fc3e59 中,MADV_RANDOM 具有文档中描述的明确行为,可以防止内核利用预读,请参阅 posix_madvise(2) 手册页。此外,它还暗示内核保留页面缓存中的页面。自该提交以来,在 6.4 及更高版本中,隐式行为实际上被反转,内核会积极释放页面,因为它会中断内核的第二次机会 LRU 机制。在中度到严重负载的 OpenShift 集群中,最终结果是,由 Kube API Server 每五分钟触发的 etcd 紧缩操作,通常不会超过 900 毫秒,但可能会耗时 20 秒。通常具有接近零主要页面故障的主机每秒会出现 600 个以上的故障。在我们的测试中,删除 MADV_RANDOM 提示恢复了以前的性能,并且没有明显增加整体内存使用率。我们建议在所有版本的 Linux 中删除此 mmap 提示,因为它似乎对 6.3 及更早的内核没有负面影响。另一种选择是保留 MADV_RANDOM,但同时启用 mlock(2)。该提示最初添加在 https://GitHub.com/etcd-io/bbolt/commit/88f777f332022ad2b92be5ceccf1863e9fb4d53f 中。