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_memory的简单学习的更多相关文章

  1. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

  2. shiro简单学习的简单总结

    权限和我有很大渊源. 培训时候的最后一个项目是OA,权限那块却不知如何入手,最后以不是我写的那个模块应付面试. 最开始的是使用session装载用户登录信息,使用简单权限拦截器做到权限控制,利用资源文 ...

  3. CentOS 简单学习 firewalld的使用

    1. centos7 开始 使用firewalld 代替了 iptables 命令工具为 firewall-cmd 帮助信息非常长,简单放到文末 2. 简单使用 首先开启 httpd 一般都自带安装了 ...

  4. Windows 下 Docker 的简单学习使用过程之一 dockertoolbox

    1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...

  5. 在MVC中实现和网站不同服务器的批量文件下载以及NPOI下载数据到Excel的简单学习

    嘿嘿,我来啦,最近忙啦几天,使用MVC把应该实现的一些功能实现了,说起来做项目,实属感觉蛮好的,即可以学习新的东西,又可以增加自己之前知道的知识的巩固,不得不说是双丰收啊,其实这周来就开始面对下载在挣 ...

  6. Linux——帮助命令简单学习笔记

    Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...

  7. OI数学 简单学习笔记

    基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...

  8. mongodb,redis简单学习

     2.mongodb安装配置简单学习                   配置好数据库路径就可以mongo命令执行交互操作了:先将服务器开起来:在开个cmd执行交互操作                 ...

  9. html css的简单学习(三)

    html css的简单学习(三) 前端开发工具:Dreamweaver.Hbuilder.WebStorm.Sublime.PhpStorm...=========================== ...

  10. html css的简单学习(二)

    html css的简单学习(二) <!Doctype html>告诉浏览器,这是一个html文档.lang="en" 默认是en,表示英语:zh-Hans 中文简体:z ...

随机推荐

  1. 教你几个部署多个nginx-ingress的注意事项

    本文分享自华为云社区<nginx-ingress工作原理以及多nginx-ingress部署注意事项>,作者: 可以交个朋友. 一.nginx-ingress工作原理 nginx-ingr ...

  2. 从缓存的本质说起,说服技术大佬用Redis

    摘要:在技术领域中,没有银弹.我们需要不断探索和研究新的技术,结合具体问题和需求,选择最适合的解决方案. 本文分享自华为云社区<知乎问题:如何说服技术老大用 Redis ?>,作者:勇哥j ...

  3. 事件Event:带你体验鸿蒙轻内核中一对多、多对多任务同步

    摘要:本文通过分析鸿蒙轻内核事件模块的源码,深入掌握事件的使用. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十二 事件Event>,原文作者:zhushy . 事件(Event)是一 ...

  4. 鲲鹏基础软件开发赛道openLooKeng赛题火热报名中,数十万大奖等您来收割

    随着云计算.物联网.移动计算.智慧城市.人工智能等领域的发展,各类应用对大数据处理的需求也发生着变化.以实时分析.离线分析.交互式分析等为代表的计算引擎逐渐为各大企业行业发展所看重.作为鲲鹏产业生态的 ...

  5. MultipartFile与File的一些事

    摘要:某段时间碰到了中转文件的需求,需要使用HttpClient中转一下文件,在实现这个需求的过程中就用得到了MultipartFile与File. 本文分享自华为云社区<MultipartFi ...

  6. Unable to create tempDir. java.io.tmpdir is set to /tmp

    磁盘挂载后,启动报错 Unable to create tempDir. java.io.tmpdir is set to /tmp [2022-03-30 17:12:06.596] WARN [m ...

  7. 第一章 Linux系统编程

    Linux基础命令 ctrl + l //快速清屏 rm 文件名 //删除文件,rm *.o表示删除所有.o后缀的文件 mkdir 目录名 //创建一个目录 touch 文件名 //创建一个文件 tr ...

  8. RPC 框架性能测试,注意这 8 点就够了

    某天,二狗子写了一个 RPC 框架后,简单测了一下性能,发现超出 grpc 一大截.二狗子一高兴,忍不住找同事吹了一波.结果,同事亲测后对二狗子说框架性能也就这样.二狗子表示不服,跟同事一番唇枪舌剑后 ...

  9. 阿里云Imagine Computing创新技术大赛正式开启!

    阿里云 Imagine Computing 创新技术大赛,是由阿里云与英特尔主办,阿里云天池平台.边缘云.视频云共同承办的顶级赛事,面向个人开发者和企业的边缘云领域算法及实时音视频应用类挑战. 本次创 ...

  10. 【k8s】基本原理学习

    k8s基本原理 https://www.cnblogs.com/BlueBlueSea/p/16908601.html 深入理解Kubernetes网络 深入理解Kubernetes的pod网络 参考 ...