美文网首页
MemAvailable 是怎么计算的

MemAvailable 是怎么计算的

作者: 轻松的鱼 | 来源:发表于2022-09-13 10:18 被阅读0次

背景

前两天安装 OceanBase 时遇到一个小问题: 很明显,安装OB时要求服务器可用内存至少 8G,不达标就无法安装。为了凑这3台10G内存的服务器我已经费了不少劲了,free -m 输出中 free 不是有 9G 吗,为什么还报错?

仔细一看上图,available 只有 6.3G,而 OB 安装报错的 Free 其实是 available。

那为什么 free -m 输出中:free 有 9.3G,而 available 只有 6.3G呢?

通常我们会把 MemAvailable 看成是 buffer/cache、free 之和。但实际上不是,它其实还跟 min_free_kbytes 有着密切关系。

min_free_kbytes

kswapd 是专门用来定期回收内存的进程。为了衡量内存的使用情况,定义了三个内存阈值(watermark,也称为水位),分别是 watermark[min/low/high]:

上图基本揭示了几个水位的含义,当 MemFree 低于 watermark[low] 时,kswapd 进行内存回收,直到空闲内存达到 watermark[high] 后停止回收。如果申请内存的速度太快,导致空闲内存降至 watermark[min] 后,内核就会进行 direct reclaim(直接回收),用回收上来的空闲页满足内存申请,这样会阻塞应用程序。而 watermark[min] 的大小等于内核参数 min_free_kbytes 的值,其他几个水位的关系是:

  • watermark[low] = watermark[min]*5/4
  • watermark[high] = watermark[min]*3/2

MemAvailable

显然 watermark[min] 以下的内存属于系统的自留内存,不会给普通进程申请使用。而 MemAvailable 意为可以分配使用的内存,因此它不应当包含这一块内存。实际上其计算公式为:
MemAvailable = MemFree - watermark[LOW] + (PageCache - min(PageCache / 2, watermark[LOW]))

知道了 MemAvailable 是怎么计算的,接下来就很简单了,先查看 min_free_kbytes 的设置:

[root@observer2 ~]# cat /proc/sys/vm/min_free_kbytes
2097152
2G 是OB 的部署规范,由于是测试环境,将它修改为64M后,MemAvailable 就符合要求了:

min_free_kbytes 设置建议

OB 的部署规范中,规定 min_free_kbytes=2G,不得不说这个点很细节,因为:

  1. 系统会根据内存大小自动计算出 min_free_kbytes 大小,但并不是线性关系,取值范围是 128K-64M,如果系统开启了大页,则最大值通常会超过 64M,但也不会很大,以下面这台服务器为例,256G内存,min_free_kbytes只有 132M:
root@idrc-110:~# cat /proc/sys/vm/min_free_kbytes
135168
root@idrc-110:~# free -m
              total        used        free      shared  buff/cache   available
Mem:         257897       60060        2068       18161      195768      178009
Swap:           616           6         610
  1. 如果 min_free_kbytes 设置的很小,则系统剩余可用内存容易触底,direct reclaim 会造成性能严重降低。相反如果设置的很大,则 watermark[min/low/high] 这3个水位都会很大,经常触发内存回收,使内存利用率降低。

所以为系统预留2G内存十分合理,是一个很容易被忽略的优化点。

参考资料

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773

相关文章

  • MemAvailable 是怎么计算的

    背景 前两天安装 OceanBase 时遇到一个小问题: 很明显,安装OB时要求服务器可用内存至少 8G,不达标就...

  • cornerredius 是怎么计算的

    先看几幅图: 这是边长为100的button在cornerredius 从39 到50时的转变 所以cornerr...

  • 利润是怎么计算的?

    做生意或是投资的人必须要能知道这项生意怎么样,要投入多少,现金流是多少,多长时间能回本,那么怎么衡量赚钱能力是强还...

  • TTI是怎么计算的

    参考链接:https://developer.mozilla.org/zh-CN/docs/Web/API/Doc...

  • 展现量是怎么计算的?

    这几天在头条写文不太顺利,文章、微头条、问答,全都爬窝,展现量总上不去。 全靠以前写的几个问答持续推荐产生收益。 ...

  • 能量值是怎么计算的

    昨天有很多人给我一篇文章点赞,我一一拜访他们,但点着点着就没有能量值,便停止了拜访。 今天继续拜访那些昨天没有来得...

  • 黑洞的质量是怎么计算的?

    黑洞质量的计算,主要通过测得史瓦西半径,然后根据史瓦西半径,可计算出一个天体要维持形态的最小半径,根据黑洞的半径可...

  • 11.10

    计算,是要安妮各方面计算仗需要怎么打赢,计算好一切

  • 📖 在你自学计算机的路上,哪些书籍对你的帮助最大?

    根据知乎的问题总结的优秀书籍 计算机原理 《计算机系统概论》《计算机是怎么跑起来的》《程序是怎么跑起来 的》《深入...

  • 计算机是怎么上网的?

    什么是www 首先,我们都知道我们生活在网络里,即万维网(www,World Wide Web); www是一张遍...

网友评论

      本文标题:MemAvailable 是怎么计算的

      本文链接:https://www.haomeiwen.com/subject/jqyonrtx.html