如上图内核打印分配4K内存失败,但是normal 类型的buddy系统还有大量内存。居然分配失败。源码分析:
根据log+faddr2line定位到,调用栈为__alloc_pages_slowpath——》get_page_from_freelist——》zone_watermark_fast
可以看到buddy内存低于一定水平,又不能立即触发kswapd回收内存就会失败。从代码看支持多种watermark.
解决方案1)设置watermark为较小的值
2)可以看到28.489040] 265014 total pagecache pages 很大,可以手动drop cache释放内存
buddy算法通过如下公式找到page的buddy page 和父BUDDY page