初探lowmem_reserve_ratio
原文链接:https://www.aikaiyuan.com/9441.html
1.摘要
最近小伙伴们在排查一个线上关于linux内存oom的问题,前些天来问我某篇文章里的一句话是什么含义,问题比较难用几句话说明,在这里梳理一下。
2.背景
最近小伙伴们在排查一个线上关于内存oom的问题,前些天来问我某篇文章里的一句话是什么含义:
每次申请的block大小比较有讲究,Linux内核分为LowMemroy和HighMemroy,LowMemory为内存紧张资源,LowMemroy有个阀值,通过free -lm和/proc/sys/vm/lowmem_reserve_ratio来查看当前low大小和阀值low大小。低于阀值时候才会触发oom killer,所以这里block的分配小雨默认的256M,否则如果每次申请512M(大于128M),malloc可能会被底层的brk这个syscall阻塞住,内核触发page cache回写或slab回收。
出自:http://blog.csdn.net/gugemichael/article/details/24017515
感觉这句话里混淆了好几个概念,并且一些概念跟自己的理解有冲突,在此说一下自己的理解。对内核研究不深,一些概念可能理解有误,因此文章里给出了比较可靠的参考文档,有兴趣可以进一步了解详情。
3.lowmem与highmem
关于lowmem和highmem的定义在这里就不详细展开了,推荐两篇文章:
- Documentation/vm/highmem.txt
- Linux内核高端内存
链接内讲的比较清楚,这里只说结论:
- 当系统的物理内存 > 内核的地址空间范围时,才需要引入highmem概念。
- x86架构下,linux默认会把进程的虚拟地址空间(4G)按3:1拆分,0~3G user space通过页表映射,3G-4G kernel space线性映射到进程高地址。就是说,x86机器的物理内存超过1G时,需要引入highmem概念。
- 内核不能直接访问1G以上的物理内存(因为这部分内存没法映射到内核的地址空间),当内核需要访问1G以上的物理内存时,需要通过临时映射的方式,把高地址的物理内存映射到内核可以访问的地址空间里。
- 当lowmem被占满之后,就算剩余的物理内存很大,还是会出现oom的情况。对于linux2.6来说,oom之后会根据score杀掉一个进程(oom的话题这里不展开了)。
- x86_64架构下,内核可用的地址空间远大于实际物理内存空间,所以目前没有上面讨论的highmem的问题。
4.linux的物理内存管理
接下来的问题是,linux是如何实现highmem的概念的?
Linux把物理内存划分为三个层次来管理:存储节点(Node)、管理区(Zone)和页面(Page)。
在NUMA架构下,系统根据CPU的物理颗数,将物理内存分成对应的Node,这里也不展开了,可以参考NUMA (Non-Uniform Memory Access): An Overview。
每一个Node,系统又将其分为多个Zone,x86架构下,node被分为ZONE_DMA、ZONE_NORMAL、ZONE_HIGHMEM,而64位x86架构下有ZONE_DMA(ZONE_DMA32)和ZONE_NORMAL。它们之间的是树状的包含关系:
可以通过以下命令查看numa node信息:
$ numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 2 4 6 8 10 12 14 16 18 20 22
node 0 size: 8114 MB
node 0 free: 2724 MB
node 1 cpus: 1 3 5 7 9 11 13 15 17 19 21 23
node 1 size: 8192 MB
node 1 free: 818 MB
node distances:
node 0 10: 10 201: 20 10
可以通过以下命令查看zone信息,注意单位是page(4k):
$ cat /proc/zoneinfo
Node 0, zone DMApages free 3933min 20low 25high 30scanned 0spanned 4095present 3834
……………………
结合之前关于highmem的说明,对于x86架构的系统来说,物理内存被划分为:
类型 | 地址范围 |
---|---|
ZONE_DMA | 前16MB内存 |
ZONE_NORMAL | 16MB – 896MB |
ZONE_HIGHMEM | 896 MB以上 |
ZONE_DMA位于低端的内存空间,用于某些旧的ISA设备。ZONE_NORMAL的内存直接映射到Linux内核线性地址空间的高端部分。
对于x86_64架构的系统来说:
类型 | 地址范围 |
---|---|
ZONE_DMA | 前16MB内存 |
ZONE_DMA32 | 16MB – 4G |
ZONE_NORMAL | 4G以上 |
和x86相比,多了ZONE_DMA32,少了ZONE_HIGHMEM.
5.linux如何分配内存
这里也不详细展开了,推荐两篇文章:
- Glibc内存管理–ptmalloc2源代码分析
- PageAllocation
结论:
- malloc属于glic的库函数,分配的是虚拟地址。
- linux的malloc分配时,如果申请内存小于MMAP_THRESHOLD(默认128K),使用brk分配,否则使用mmap分配。
- 通过brk分配的地址空间,当堆尾的空闲内存超过M_TRIM_THRESHOLD(默认128K)时,执行内存缩紧操作,这里指的也是虚拟地址。
- 读写内存时,触发缺页中断,此时才会分配物理内存。
- 分配物理内存时,kernel由high zone到low zone依次查找是否有足够的内存可以分配,找到可用的内存后映射到虚拟地址上。
关于系统分配内存的详细介绍,可以参考:Memory Mapping and DMA。
6.lowmem_reserve_ratio
6.1.为什么要调整lowmem_reserve_ratio
在有高端内存的机器上,从低端内存域给应用层进程分配内存是很危险的,因为这些内存可以通过mlock()系统锁定,或者变成不可用的swap空间。
在有大量高端内存的机器上,缺少可以回收的低端内存是致命的。因此如果可以使用高端内存,Linux页面分配器不会使用低端内存。这意味着,内核会保护一定数量的低端内存,避免被用户空间锁定。“lowmem_reserve_ratio”参数可以调整内核对于lower zone的保护力度。
6.2.lowmem_reserve_ratio参数的含义
lowmem_reserve_ratio是一个数组,可以通过以下命令查看:
% cat /proc/sys/vm/lowmem_reserve_ratio
256 256 32
数组的长度=内存zone数量-1,其中每个数并不是绝对值,而是一个比例,代表1/256或1/32。
再次搬出zoneinfo,这里以zone_dma和zone_dma32举例:
$ cat /proc/zoneinfo
Node 0, zone DMApages free 3933min 20low 25high 30scanned 0spanned 4095present 3834protection: (0, 3179, 7976, 7976)
Node 0, zone DMA32pages free 639908min 4456low 5570high 6684scanned 0spanned 1044480present 813848protection: (0, 0, 4797, 4797)
……………………
linux尝试在zone中分配page时,会判断当前zone的page_free与高位zone的page_present的关系。
例如在dma中尝试申请dma32的page时,会计算一个protection值:
protection[dma,dma32] = zone_dma32.present/lowmem_reserve_ratio[dma(1)] = 813848/256 = 3179,这个结果对应上面DMA段中,protection数组的第二个元素。
然后需要比较zone_dma.free的值(3933) 与 protectiondma,dma32 + zone_dma.watermarkhigh的大小:如果free>protection+watermark[high],则可以分配page;否则不能分配,内核继续查找下一个lower zone。也就是说只有在higher zone内存不足时才会尝试从lower zone继续申请。
更详细的文档可以参考:Documentation/sysctl/vm.txt
根据公式可以看出:
- lowmem_reserve_ratio越大,低级的zone中被保护的内存就越小;
- lowmem_reserve_ratio越小,低级的zone中被保护的内存就越大;
- 当lowmem_reserve_ratio=1(100%)时代表对low zone的最大保护强度。
相关文章
- Python 中的进程、线程、协程、同步、异步、回调
- Ceph 性能优化
- 关于 Out of Socket memory
- Out of Socket memory
- 如何部署一个真正好用的前端
- Linux 的 Out-of-Memory (OOM) Killer
初探lowmem_reserve_ratio相关推荐
- 2021年大数据Flink(九):Flink原理初探
Flink原理初探 Flink角色分工 在实际生产中,Flink 都是以集群在运行,在运行的过程中包含了两类进程. JobManager: 它扮演的是集群管理者的角色,负责调度任务.协调 checkp ...
- 从壹开始微服务 [ DDD ] 之一 ║ D3模式设计初探 与 我的计划书
缘起 哈喽大家周四好!又是开心的一天,时间过的真快,我们的 <从壹开始 .net core 2.1 + vue 2.5 >前后端分离系列共 34 篇已经完结了,当然以后肯定还会有更新和修改 ...
- 经典算法研究系列:二、Dijkstra 算法初探
经典算法研究系列:二.Dijkstra 算法初探 July 二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...
- las格式测井曲线_邹榕,等:顺北和托甫台区块奥陶系断裂结构单元测井响应特征初探...
引用格式:邹榕,徐中祥,张晓明,等.顺北和托甫台区块奥陶系断裂结构单测井响应特征初探[J].油气藏评价与开发,2020,10(2):18-23.ZOUR, XU Z X, ZHANG X M, et ...
- 2018-4-15摘录笔记,《网络表征学习前沿与实践》 崔鹏以及《网络表征学习中的基本问题初探》 王啸 崔鹏 朱文武
1.来源:<网络表征学习前沿与实践> 崔鹏 (1)随着数据的增加以及计算机计算速度的增加,想当然的以为速度快了,数据再多也是可以自己算的,但是若是数据之间存在着复杂的关系,那么处理一个样 ...
- python argparse_Python 命令行之旅:初探 argparse
本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 你是否好奇过在命令行中敲入一段命令后,它是如何被解析执行的?是否考虑过由自己实现一个命令行工具,帮你执行和处理任 ...
- HTML5+MUI+HBuilder 之初探情人
07,08年那会儿正当Java火爆,C/C++仍是广泛运用的一门语言的时候,所以我的大学都献给了C/C++和Java.当诺基亚的倒闭成为按键机时代衰落的标志时,移动APP的开发也如破堤之洪.爆炸式的崛 ...
- 使用Mahout搭建推荐系统之入门篇3-Mahout源码初探
2019独角兽企业重金招聘Python工程师标准>>> 用意: 希望了解Mahout中数据的存储方式, 它如何避免java object带来的冗余开销.学完知识,要进行些实战 去分析 ...
- SAP RETAIL 补货类型RF之初探 II
SAP RETAIL 补货类型RF之初探 II 1, 补货参数 – TargetCoverage字段不能为空. 如果不维护这个参数值,系统会提示:Target stock calculated dyn ...
最新文章
- 清华北大,已经没人本科就找工作了
- 我的本地化关于NSDefaults
- SpringData核心数据访问接口--PagingAndSortingRepository
- Java DataOutputStream writeUTF()方法及示例
- 的mvc_简述PHP网站开发的MVC模式
- 在linux用ueditor遇到的问题
- PL/SQL Developer自动补全SQL技巧
- bae3.0第三步 添加默认管理后台模块和mysql库
- mybatis mysql触发器_MyBatis创建Oracle触发器
- c语言gcno文件位置,c – 找不到CMake和lcov:gcno文件
- 数据库高级——多表查询
- 动环监控系统服务器维护,机房动环设备维护与检测的13个具体内容
- html 表格横向排列,excel表格数据如何实现横向排列-Excel表格怎样把多列横向数据按照顺序改为纵向排列......
- java注解验证实体_java @Vaild 可以用在对象上面作注解校验吗
- 实现windows与ubuntu的之间的复制与粘贴
- CoreData的使用
- sqlserver设置身份验证登录
- gitlab中文网的使用_GitLab使用流程及手册
- php模板机制,ECMall模板解析语法与机制
- matlab状态空间法建模,以及系统稳定性分析
热门文章
- putextra 传递对象_intent.putextra用法 使用Intent传递对象的两种方式 - 电脑常识 - 服务器之家...
- 神武跑环遇到服务器维护,神武6月6日维护内容解读 跑环限制取消
- Java使用网易云信短信验证 demo(完整教程)
- MATLAB获取当前目录下.CSV格式文件名并调用
- 中国电子游戏产业需要.ART的理由
- cf#273-D. Red-Green Towers-dp
- cf机器作弊严重限制机器登录一分钟_如何解除LOL CF DNF23 0“机器作弊行为严重,限制机器登录”(教程)...
- 关于面试自我介绍的介绍和模板推荐
- ORA-65096 公用用户名或角色无效
- 用node撸一个监测复联4开售提醒