RDS(网易云关系数据库服务)上线已经有一段时间,陆续不断有产品迁入到了RDS中,在线上运维的过程中,也遇到了一些曾经没有考虑到,或者考虑的不全的东西。后续有时间可以分享给大家。

今天想提到的是线上一个4G的RDS实例,发生了OOM(out of memory)的问题,MySQL进程被直接Kill掉了。在解释这个问题的时候,我们首先需要从Linux系统内存分配策略讲起。

一般写C语言程序,我们习惯使用malloc动态的申请内存空间(Java由JVM负责内存管理),malloc函数会向操作系统申请一段连续的内存单元,然后返回这段空间的起始地址。如果malloc函数返回为null则表示系统没有可分配的内存空间。这是我们的一般思维,当然这在某些操作系统中确实也是正确的(Solaris)。

但是Linux不是这样的,Linux的内存分配采取的是一种更加积极的分配策略,它假设应用申请了内存空间后并不会立即去使用它,所以允许一定量的超售,当应用真的需要使用它的时候,操作系统可能已经通过回收了其他应用的内存空间而变得有能力去满足这个应用的需求,简单的说,就是允许应用申请比实际可分配空间(包括物理内存和Swap)更多的内存,这个特性称为OverCommit。

这个特性在Linux操作系统里面也是可配的,可以通过设置/proc/sys/overcommit_memory为不同的值来调整OverCommit策略。

overcommit_memory可以取3个值:

0:默认值,由Linux内核通过一些启发式算法来决定是否超售和超售的大小,一般允许轻微的超售,拒绝一些明显不可能提供的请求,同时做一些规则限制,比如不同用户overcommit的大小也不一样。

1:允许,不做限制的超售,当然这个也不是无限大,还受到寻址空间的限制,32位系统最大可能只有4G,64位系统大概16T左右。

2:禁止,禁止超售,系统能够分配的内存不会超过swap+实际物理内存*overcommit_ratio,该值可以通过/proc/sys/vm/overcommit_ratio设置,默认50%。

为了验证Linux的内存分配,我们用个小程序来测试一下:

#include

#include

#define MEGABYTE 1024*1024

int main(int argc, char *argv[])

{

void *myblock = NULL;

int count = 0;

while (1)

{

myblock = (void *) malloc(MEGABYTE);

if (!myblock) break;

printf("Currently allocating %d MB\n", ++count);

}

exit(0);

}

#include

#include

#define MEGABYTE 1024*1024

int main(int argc, char *argv[])

{

void *myblock = NULL;

int count = 0;

while(1)

{

myblock = (void *) malloc(MEGABYTE);

if (!myblock) break;

memset(myblock,1, MEGABYTE);

printf("Currently allocating %d MB\n",++count);

}

exit(0);

}

前者再通过malloc()申请了内存空间以后,并没有立即去使用它,而后者相反,每次申请完都立即用1去填充。我们来看看两个程序运行的结果。

这是在1G的RAM,400M Swap的虚拟机上运行的结果,前者申请了远远超过实际内存的空间,后者并没有超过实际内存可用空间。这就验证了前面叙述的Linux的内存分配策略。

本身这是一个系统的优化,无可厚非。但是我们知道,但凡“超售”都是基于不会有大量程序同时使用资源的假设,这显然也是有风险的。所以Linux又使用了一种OOM Killer(Out Of Memory killer)的机制,在系统可用内存(包括Swap)即将使用完之前,选择性的Kill掉一些进程以求释放一些内存。下一章我们重点讨论一下Linux OOM Killer的机制。

本文标题: MySQL OOM 系列一 Linux内存分配

本文地址: http://www.cppcns.com/shujuku/mysql/156996.html

mysql数据库内存分配_MySQL OOM 系列一 Linux内存分配相关推荐

  1. mysql数据库前端缓存_MySQL数据库性能优化--缓存参数优化

    在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...

  2. mysql超售_MySQL OOM 系列三 摆脱MySQL被Kill的厄运

    前面两章,我们分析了Linux内存分配的策略以及Linux通过使用 OOM_Killer的机制解决了"超售"引起的风险,MySQL同其他的应用程序一样,在操作系统允许的范围内也是可 ...

  3. MySQL内存预估_mysql时该如何估算内存的消耗,公式如何计算?

    经常有人问配置mysql时该如何估算内存的消耗.那么该使用什么公式来计算呢? 关心内存怎么使用的原因是可以理解的.如果配置mysql服务器使用太少的内存会导致性能不是最优的;如果配置了太多的内存则会导 ...

  4. mysql数据库优化大全_MySQL数据库优化技巧大全

    简介: MySQL数据库优化技巧大全 MySQL优化三大方向 ① 优化MySQL所在服务器内核(此优化一般由运维人员完成). ② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进 ...

  5. mysql数据库试题下载_MYSQL数据库2013-2014学年考试试卷

    石河子大学MYSQL数据库2013-2014学年考试试卷 8.创建表时,不允许某列为空可以使用: ( A ) A.NOT NULL B.NO NULL C.NOT BLANK D.NO BLANK 9 ...

  6. mysql数据库复制基本原理_MySQL的复制原理以及流程

    原创文章出自公众号:「码农富哥」,如需转载请注明出处! 文章如果对你有收获,可以收藏转发,这会给我一个大大鼓励哟!另外可以关注我公众号「码农富哥」 (搜索id:coder2025),我会持续输出Pyt ...

  7. mysql 数据库生命周期_MySQL生命周期

    很多时候所谓的的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已. MySQL的逻辑架构图如下所示 MySQL逻辑架构整体分为三层.其中最上层为客户端层,并非MyS ...

  8. 简述mysql 数据库的特点_MySQL数据库之MySQL的特点

    本文主要向大家介绍了MySQL数据库之MySQL的特点 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 1. 它使用的核心线程是完全多线程,支持多处理器. 2. 有多种列类型:1 ...

  9. mysql数据库数据迁移_MySQL数据库迁移详细步骤

    ========================================================================================== 一.背景简介 == ...

最新文章

  1. Spring 的优秀工具类盘点---转
  2. KMeans聚类算法Hadoop实现
  3. Android Binder ProcessState IPCThreadState相关介绍
  4. VS中生成时“sgen.exe”已退出,代码为 1解决办法
  5. 3分钟搞懂前后端开发的区别
  6. PID控制器开发笔记之三:抗积分饱和PID控制器的实现
  7. 风电功率预测_人工智能在预测单机风电功率上的应用进展
  8. iOS系统预览文件但不分享的实用技巧 (iOS10, QLPreviewController)
  9. [洛谷P5367]【模板】康托展开
  10. C#winform省市县联动,以及有的县是空值时显示异常的处理
  11. 咸鱼Maya笔记—Maya 绘制多边形
  12. 2011年河南省国民经济和社会发展统计公报
  13. Window10系统下通过SMB协议连接和断开资源服务器
  14. Spring Guide:Securing a Web Application(中文大概意思)
  15. winpe进入linux系统,制作U盘Linux 与WinPE启动
  16. pythonic希腊典故_希腊神话习语(整理).doc
  17. maven 为html赋版本号,maven-replacer-plugin 静态资源版本号解决方案(css/js等)
  18. DNA-蛋白翻译过程的Python实现
  19. 信创实践之达梦数据库介绍
  20. ISC2 成功的网络安全领导者必备的9大特质

热门文章

  1. 可行性研究和软件项目计划主要完成什么工作?_软件生命周期
  2. stm32l4 外部中断按键会卡死_stm32f103c8怎么实现外部中断按键点灯,按一下就亮,再按一下就灭,求大神帮忙...
  3. Python Day03
  4. LeetCode7.反转整数
  5. APIO2010巡逻(树上带权直径)
  6. 《神经网络和深度学习》系列文章五:用简单的网络结构解决手写数字识别
  7. C | 看看 C 能做什么
  8. C# 获得当前目录和执行目录的一些方法
  9. (88)Verilog HDL系统函数和任务:$fdisplay
  10. FPGA状态机一段式