首页 > 其他分享 >overcommit_memory的简单学习

overcommit_memory的简单学习

时间:2023-04-01 16:34:39浏览次数:41  
标签:overcommit 学习 swap memory 物理 分配 内存

overcommit_memory的简单学习


背景

前几天一个测试环境启动失败. 
总是有如下的提示:
Native memory allocation (mmap) failed to map 
12288 bytes for committing reserved memory.
当时看free 其实内存剩余总量还是有的. 
但是JVM启动总是失败. 
当时没有考虑太多.改了下参数就启动起来了
但是今天发现有项目现场有一些被动调用的jvm也出现了crash

所以感觉有必要整理一下这一块的内容. 

内存管理的基本知识

现代操作系统一般采用段页式管理
段用来区分内存的类型和用途(数据段,代码段,堆区,栈区等等)
页便于进行内存位置定位等. 

操作系统又是一个多用户多任务的系统.
多任务的情况下, 内存里面会存储较多进程的内存信息.
此时进行内存隔离就是很关键的

基于页内存的分配, 可以讲虚拟内存和物理内存进行映射
可以将不连续的物理内存实现分配连续的虚拟内存空间. 

内存虽然比磁盘要快, 但是比CPU还是慢了1-2个数量级. 
所以很多时候, 用户/程序 想要申请的内存, 操作系统并不会直接给物理内存
而仅是会进行一些虚拟内存的地址分配, 当真正需要这块物理内存时在进行初始化和写入. 

这一块也是 cow 写时复制 实现快速京城fork的一种思路.
另外也会出现程序认为申请的内存和实际申请的物理内存不一致的情况.

cow虽然会加快内存的分配过程
但是无法解决初始化和写入的过程
也就是基于此, 当真正需要物理内存时, 系统会触发一个page fault的操作.用来初始化物理内存
如果缺页过多, 就会导致性能的衰退(中断影响了业务的进行)

swap内存也是一样的问题, 
只不过进程fork时, COW是通过已有的内存复制一份,再执行写入
swap的写入写出会从磁盘读取必须的信息, 性能损耗更大.
fork产生的中断是 minfault swap内存产生的中断是 majorfault

overcommit_memory导致的问题

echo 0|1|2 > /proc/sys/vm/overcommit_memory

overcommit_memory 其实有三个数值. 0 1 2 
0 一般是尽量进行内存的分配.启发式的内存分配. 能分配则分配, 不能分配则报错.
1 可以超过物理内存+swap内存的数据量进行分配.
2 不允许超过物理内存+swap内存的数据量进行分配.

回到最开始的问题上来: 
环境因为有数据库, 为了保证性能选择的参数为 2 
这就导致: 
虽然可以最佳化性能的. 避免因为内存超售导致出现OOM的情况
但是 JVM 的预申请堆区的机制就会导致内存分配失败, 直接JVM启动不起来导致宕机. 

echo 1 之后就可以成功启动. 

但是这样的话的风险是 存在OOM killer的风险, 需要关注操作系统的资源使用情况.

设置方式

第一种: 
编辑/etc/sysctl.conf 
修改后者是修改 vm.overcommit_memory=1 
然后sysctl -p 使配置文件生效
第二种: 
sysctl -w  vm.overcommit_memory=1
第三种
echo 1 > /proc/sys/vm/overcommit_memory

关于overcommit与swap

swap 其实仅是为了过度. 
保证内存不够用时可以有部分磁盘空间用于存储不常用的物理内存内的信息

但是swap会严重降低应用程序, 数据库的性能, 导致磁盘IO飙升
会产生错误的判断

现在内存比较便宜了, 建议设置合适的内存, 关闭swap. 提高性能. 

关于 overcommit. 没有任何资源是足够
适当的超售不一定全是坏事, 但是要保证核心资源必须足够. 
比如redis的 dump 的save 进程. 如果redis的核心进程使用超过一半的内存
并且不允许超售时就会导致redis dump线程的crash 严重时导致数据丢失. 

但是如果允许超售, dump保存时需要一方面写入一盘, 一方面内存又swap到磁盘中去了一部分
此时会出现IO争抢, 导致dump进程变慢, 影响吞吐. 

所以关于性能, 没有资源时只能够妥协,有了资源时才可以全都要. 

标签:overcommit,学习,swap,memory,物理,分配,内存
From: https://www.cnblogs.com/jinanxiaolaohu/p/17278812.html

相关文章

  • Qt学习笔记9——P30-33. 自定义控件封装,鼠标事件,定时器
    P30.自定义控件封装P31.Qt中的鼠标事件P32.定时器1P33.定时器2P30.自定义控件封装(创建了新项目) 添加新的界面和类:右键项目的文件夹(顶层的文件)->Qt——Qt设计师界面类->“选择界面模板”选"Widget"->在"Classname"中取个类名(此案例中改成了SmallWidget)->别的没......
  • Mock学习
    mock原理图 mock环境配置1:vuecreatemock-demo(本地用vue3)2:npminstallaxios--save3:npminstallmockjs--save-dev4:npminstalljson5--save-dev5:进VSCode中下载json5syntax插件 代码配置部署1:进入mock-demo目录2:文件结构与测试代码如下  3:各文件如下/......
  • Python学习笔记
    importthisprint("helloworld!")s1="bai"s2="lin!"s=f"{s1}{s2}"#f是format的意思,后面的s1,s2会把值复制到中括号内生成一个新的字符串print(s.title())#每个字母的开头大写a=2b=3print(a**b)#a**b表示a的b次方x,y,z,=1,2,3print(x,y,z......
  • Git提交本地项目到云端仓库(学习理解持续更新)
    进入项目文件夹初始化本地仓库gitinit把所有文件添加到版本库中gitadd.查看添加的文件gitstatus......
  • click house学习
    创建表createtableblog(idUInt64,titleString,contentString,created_atDateTime)Engine=MergeTreeorderbyid;日期数据一般指定默认值createtableblog(idUInt64,titleString,contentString,created_atDateTimedefaultnow())Engine=MergeTreeorderbyid;......
  • 深度学习概念辨析——Epoch、Batch、Iteration
    本文转载自简书https://www.jianshu.com/p/22c50ded4cf7写在前面在训练神经网络的时候,我们难免会看到Batch、Epoch和Iteration这几个概念。曾对这几个概念感到模糊,看了网上的一些文章后,在这里做几个小小的总结。名词解释:【图片来源:https://zhuanlan.zhihu.com/p/29409502......
  • 《Mysql基础》【Mysql触发器 新建触发器、修改触发器、删除触发器、举例】 编程入门
     --mysql数据库程序设计笔记:--=========第八章:触发器========================触发器:触发执行特定事件。(关联表对象,当特定事件出现时,触发激活)目的:保护表数据,(保证表数据完整性和一致性。)1、新建触发器:格式:createtrigger数据库名.触发器名称触发时刻inserton表名f......
  • 《Mysql基础》【Mysql表查询、去重、表连接、左连接 右连接、子表查询、排序、分组等
     --mysql数据库程序设计笔记:第三章:查询1、单表查询:1)、简单查询查所有列:格式:select*from表名;举例:mysql>select*fromtb_student;+----+-----------+-------------+------+------------+----------+--------+---------+-------------------+|id|studentNo|s......
  • 深度学习之量化概念初步理解
    也许标题并不是很对,但一再听到有人提起量化这个词,搜索了下,稍作整理如下:量化任务的简要总结:1、量化映射方法,也就是将float-32映射到Int数据类型,每个间隔是相等的还是不相等的,这里就是均匀量化(uniformquantization)和非均匀量化(non-uniformquantization),也可以叫作线性量化和......
  • python学习-实现对比文件输出html
    在网络配置过程中,经常要对比两个配置文的差异,常用的一些文档编辑器带有文本对比的功能,如notepadd++,等。但是这些大部分都要收费或者安装其他插件,不是很友好,linux上自带diff可以对比,但是一般网工都linux不太熟悉。而且操蛋的是在客户都这里,给你的终端装了沙盒,禁止安装其他的文本的......