国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL OOM 系列一 Linux內存分配

2024-07-24 13:10:05
字體:
來源:轉載
供稿:網友

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 <stdio.h>#include <stdlib.h>#define MEGABYTE 1024*1024int 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*1024int 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去填充。我們來看看兩個程序運行的結果。

MySQL,OOM

MySQL,OOM

這是在1G的RAM,400M Swap的虛擬機上運行的結果,前者申請了遠遠超過實際內存的空間,后者并沒有超過實際內存可用空間。這就驗證了前面敘述的Linux的內存分配策略。
本身這是一個系統的優化,無可厚非。但是我們知道,但凡“超售”都是基于不會有大量程序同時使用資源的假設,這顯然也是有風險的。所以Linux又使用了一種OOM Killer(Out Of Memory killer)的機制,在系統可用內存(包括Swap)即將使用完之前,選擇性的Kill掉一些進程以求釋放一些內存。下一章我們重點討論一下Linux OOM Killer的機制。


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 仁寿县| 抚远县| 东乡族自治县| 沂南县| 霍城县| 德江县| 湘阴县| 公主岭市| 石渠县| 黄骅市| 沭阳县| 洪泽县| 鹰潭市| 巨野县| 调兵山市| 洛阳市| 安图县| 南华县| 济源市| 大同县| 太保市| 亳州市| 阳曲县| 剑阁县| 沧源| 太康县| 大埔县| 平罗县| 沙田区| 房山区| 辽宁省| 青阳县| 万全县| 天祝| 南丰县| 抚宁县| 塔河县| 新化县| 繁昌县| 沈丘县| 宁德市|