BUG 分析: 大量 D 进程卡在 shrink_inactive_list 导( 七 )


系统调用,会建议内核,在从 addr 指定的地址开始,长度等于 len 参数值的范围内,该区域的用户虚拟内存应遵循特定的使用模式,使内核可以选择适当的预读和缓存技术 。如果使用 () 函数的程序明确了解其内存访问模式,则使用此函数可以提高系统性能 。
自 4.5 开始,引入参数(这是为什么 4.9 内核才出现该问题,这需要上层和底层同时支持,才会出现本问题) 。简单来说,就是让上层设置一段内存可以释放内存的标志,但是底层并不会立即释放,以便让上层可以在短时间内重复访问,以免增加缺页异常等性能开销 。也叫 lazy free,它只能用于匿名页面 。
根据描述,触发file 统计增大的路径是:(代码省略不贴)
所以,需要在 PPR 中过滤页面,避免这个计数异常,导致的卡 .
匿名页面一开始就会设置 =1, 并且只有在上层设置页面时才会清除 (page),没别的地方了 。
所以,(page) && !(page) 能指示这是页面 。
ok,已经理清了前因后果 。再退一步,试想下,假如上游没有修复这个 patch 。我们能不能想出来?我觉得很难,因为我们缺乏的相关认识,并且它经过了 dirty,标志的变化(好像几乎没办法做这么微观的页面标志追踪?),才导致 /FLIE 的变化 。
请作者吃根辣条