overcommit_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_memory的简单学习的更多相关文章
- Log4j简单学习笔记
log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...
- shiro简单学习的简单总结
权限和我有很大渊源. 培训时候的最后一个项目是OA,权限那块却不知如何入手,最后以不是我写的那个模块应付面试. 最开始的是使用session装载用户登录信息,使用简单权限拦截器做到权限控制,利用资源文 ...
- CentOS 简单学习 firewalld的使用
1. centos7 开始 使用firewalld 代替了 iptables 命令工具为 firewall-cmd 帮助信息非常长,简单放到文末 2. 简单使用 首先开启 httpd 一般都自带安装了 ...
- Windows 下 Docker 的简单学习使用过程之一 dockertoolbox
1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...
- 在MVC中实现和网站不同服务器的批量文件下载以及NPOI下载数据到Excel的简单学习
嘿嘿,我来啦,最近忙啦几天,使用MVC把应该实现的一些功能实现了,说起来做项目,实属感觉蛮好的,即可以学习新的东西,又可以增加自己之前知道的知识的巩固,不得不说是双丰收啊,其实这周来就开始面对下载在挣 ...
- Linux——帮助命令简单学习笔记
Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...
- OI数学 简单学习笔记
基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...
- mongodb,redis简单学习
2.mongodb安装配置简单学习 配置好数据库路径就可以mongo命令执行交互操作了:先将服务器开起来:在开个cmd执行交互操作 ...
- html css的简单学习(三)
html css的简单学习(三) 前端开发工具:Dreamweaver.Hbuilder.WebStorm.Sublime.PhpStorm...=========================== ...
- html css的简单学习(二)
html css的简单学习(二) <!Doctype html>告诉浏览器,这是一个html文档.lang="en" 默认是en,表示英语:zh-Hans 中文简体:z ...
随机推荐
- Linux神器strace的使用方法及实践
在Linux系统中,strace命令是一个集诊断.调试.统计与一体的工具,可用来追踪调试程序,能够与其他命令搭配使用,接下来就Linux系统调用工具strace的使用方法和实践给大家做个详细介绍,一起 ...
- 提升软件质量?为什么不试试华为云CodeArts Check
摘要:华为云CodeArts Check代码检查服务为用户提供包括代码风格.通用质量与代码安全风险等在内的检查能力,同时提供问题闭环处理.检查报告等功能,从而一站式完成代码检查作业. 本文分享自华为云 ...
- ByteHouse:基于ClickHouse的实时数仓能力升级解读
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 ByteHouse是火山引擎上的一款云原生数据仓库,为用户带来极速分析体验,能够支撑实时数据分析和海量数据离 ...
- PPT 难吗
多看 http://www.zcool.com.cn/ http://www.huaban.com
- Java线程池使用浅谈
1. 线程池相关基本概念 任务(Task):任务是线程池中要执行的工作单元.任务可以是实现了 Runnable 接口或 Callable 接口的对象.Runnable 任务没有返回值,而 Callab ...
- 成为一个合格程序员所必备的三种常见LeetCode排序算法
排序算法是一种通过特定的算法因式将一组或多组数据按照既定模式进行重新排序的方法.通过排序,我们可以得到一个新的序列,该序列遵循一定的规则并展现出一定的规律.经过排序处理后的数据可以更方便地进行筛选和计 ...
- KB21N、KB24N作业分配与冲销
一.KB21N 调用BAPI:BAPI_ACC_ACTIVITY_ALLOC_POST 经测试,分配订单时行项目一次性最多传332条数据 "------------------------- ...
- IDEA | 使用Maven创建Web项目并配置Tomcat
学习这种方式的原因是以后Tomcat中运行的绝大多数都是Web项目,而使用Maven工具能更加简单快捷的把Web项目给创建出来,所以Maven的Web项目具体如何来构建呢? 在真正创建Maven We ...
- 应届生必读:Java真实项目的开发流程和常用工具
本文出自本人写的书,谢绝转载,更勿抄袭. 本人有多年的Java面试官经验,经常要和一些包装项目经验的求职者打交道.当然平时也兼职做些Java面试辅导工作,最近也陆续帮一些在校生朋友成功找到Java工作 ...
- 图解 HTTP 缓存
HTTP 的缓存机制,可以说这是前端工程师需要掌握的重要知识点之一.本文将针对 HTTP 缓存整体的流程做一个详细的讲解,争取做到大家读完整篇文章后,对缓存有一个整体的了解. HTTP 缓存分为 2 ...