点击上方蓝色字体,关注我 ——
一个在阿里云打工的清华学渣!
图 by:我是严肃的于海童@清华
本文作者:杨牧原(花名牧原),阿里云技术专家,多年操作系统和应用调试经验,理论功底深厚,实践经验丰富。目前专注Linux性能调优,容器集群和系统网络。
本文经原作者授权发于公众号【程序猿石头】,原文基础上稍作措辞改动。
背景
某次遇到一个客户尝试用 Java (其实跟具体用什么语言没关系)申请使用 4G 的内存申请,机器(ECS)总内存是 8G,free 的内存也超过 4G,按道理是 OK 的,但总是直接 OOM。
于是便找上门来说,“你们这玩意有问题啊?”
内心 :“bug 是不可能有的,一定是你的打开姿势不对”,恩,不行,本着“客户第一”的原则,还是要来帮客户解锁姿势的。
本文就详细记录了这个 case 的排查过程。
具体过程
如上图所示,记录显示为申请 4G 内存失败(4294967296 B / 1024 / 1024 = 4096 M
)。
是否是 min_free_kbytes & nr_hugepage
配置错误?
第一反应是想起来之前的
vm.min_free_kbytes & nr_hugepage
导致的free大于available案例有关
memfree
统计的是所有内存的 free
内存,而 memavailable
统计的是可以拿来给程序用的内存,而客户设置了 vm.min_free_kbytes(2.5G)
,这个内存在 free
统计,但是不在 memavailable
统计,nr_hugepage
也会有这个问题。
二者的统计方式不一样, 具体参考 Documentation/filesystems/proc.txt
MemFree: The sum of LowFree+HighFree
MemAvailable: An estimate of how much memory is available for starting new applications, without swapping. Calculated from MemFree, SReclaimable, the size of the file LRU lists, and the low watermarks in each zone. The estimate takes into account that the syste