min_free_kbytes

news/2024/11/28 13:49:49/

转自:技术分享 | MemAvailable 是怎么计算的-腾讯云开发者社区-腾讯云

背景

前两天安装 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,也称为水位),分别是 watermarkmin/low/high:

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

  • watermarklow = watermarkmin*5/4
  • watermarkhigh = watermarkmin*3/2

MemAvailable

显然 watermarkmin 以下的内存属于系统的自留内存,不会给普通进程申请使用。而 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 -mtotal        used        free      shared  buff/cache   available
Mem:         257897       60060        2068       18161      195768      178009
Swap:           616           6         610
  1. 如果 min_free_kbytes 设置的很小,则系统剩余可用内存容易触底,direct reclaim 会造成性能严重降低。相反如果设置的很大,则 watermarkmin/low/high 这3个水位都会很大,经常触发内存回收,使内存利用率降低。

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


http://www.ppmy.cn/news/979210.html

相关文章

[DDPM] Denoising Diffusion Probabilistic Models

直接看paper云里雾里,一些推荐的讲解: The Annotated Diffusion Model 生成扩散模型漫谈(一):DDPM 拆楼 建楼 生成扩散模型漫谈(二):DDPM 自回归式VAE 生成扩散模型漫谈&#xff…

管理类联考——数学——技巧篇——四大招——第一招 拿下应用题,稳江山

第一招 拿下应用题,稳江山 应用题占 6 个题,计 18 分,拿分策略 【2 易,2 中,2 难】,【4 必考,2 可选】,【4 固定,2 灵活】核心:等量关系 等量关系 类型 设未…

快速跑 nerf instant-ngp 快速调试与配置,跑自己的数据

1.下载Anaconda3 2.打开Anaconda Prompt (Anaconda) 创建虚拟环境 conda create -n nerf-ngp python3.8切换到虚拟环境 conda activate nerf-ngp安装相关依赖包 pip install commentjson imageio numpy opencv-python-headless pybind11 pyquaternion scipy tqdm安装完毕后…

学生宿舍用电管理系统的设计及应用 安科瑞 许敏

安科瑞许敏18706168252 摘要:各式各样的电器给我们的生活带来了极大的便利,但是,不安全的用电方式也给我们的生活带来了极大的安全隐患,尤其是学生公寓安全用电管理更是学校面临的重要任务。从安全用电角度提出了一套集用电管理、…

在oppo系统中Android Oaid SecurityException 解决方案

在Android 10以上,是无法获取到imei ,往往通过安全联盟的sdk 获取oaid。但在oppo设备上发生签名安全问题。 现象: 在oppo系统(包含oppo、真我、一加)中通过插件化沙盒环境下(233乐园/摸摸鱼等渠道下),打开游戏,其中o…

了解Unity编辑器之组件篇Video(二)

Video Player组件:用于在游戏中播放视频的组件。它提供了一系列属性来控制视频的播放、显示和交互。 1.Source(视频源):用于指定视频的来源。可以选择两种不同的视频源类型: (1)Vieo Clip&#…

Android TelephonyManager双卡获取数据开启状态异常的可能原因

背景 应用内不指定subId获取数据状态可能会错误,因为可能拿到voice的能力,而非data。 代码逻辑 1、通过TelephonyManager的isDataEnabled()没有指定subId时,调用内部方法isDataEnabledForReason,传入getId()参数以指定subid&am…

新突破!谷歌量子计算机6秒内完成47年计算

谷歌科学家在量子计算机方面取得重大突破,谷歌在 arxiv 上发表了一篇关于量子计算机的论文,并宣称他们的量子计算机在短短 6 秒内就完成了世界上最先进计算机 47 年的计算量。 论文称,谷歌最新Sycamore量子处理器目前拥有70个量子比特&#x…