MySQL OOM 系列一 Linux内存分配 |
|
本文标签:MySQL,OOM RDS(网易云关系数据库服务)上线已经有一段时间,陆续不断有产品迁入到了RDS中,在线上运维的过程中,也遇到了一些曾经没有考虑到,或者考虑的不全的东西 。后续有时间可以分享给大家 。 今天想提到的是线上一个4G的RDS实例,发生了OOM(out of memory)的问题,MySQL进程被直接Kill掉了 。在解释这个问题的时候,我们首先需要从Linux系统内存分配策略讲起 。 为了验证Linux的内存分配,我们用个小程序来测试一下:
#include <stdio.h>
#include <stdlib.h>
#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 <stdio.h>
#include <stdlib.h>
#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的内存分配策略 。 |