最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL OOM 系列一 Linux內(nèi)存分配

 更新時(shí)間:2016年07月16日 23:01:17   投稿:mdxy-dxy  
今天想提到的是線上一個(gè)4G的RDS實(shí)例,發(fā)生了OOM(out of memory)的問(wèn)題,MySQL進(jìn)程被直接Kill掉了。在解釋這個(gè)問(wèn)題的時(shí)候,我們首先需要從Linux系統(tǒng)內(nèi)存分配策略講起

RDS(網(wǎng)易云關(guān)系數(shù)據(jù)庫(kù)服務(wù))上線已經(jīng)有一段時(shí)間,陸續(xù)不斷有產(chǎn)品遷入到了RDS中,在線上運(yùn)維的過(guò)程中,也遇到了一些曾經(jīng)沒(méi)有考慮到,或者考慮的不全的東西。后續(xù)有時(shí)間可以分享給大家。

今天想提到的是線上一個(gè)4G的RDS實(shí)例,發(fā)生了OOM(out of memory)的問(wèn)題,MySQL進(jìn)程被直接Kill掉了。在解釋這個(gè)問(wèn)題的時(shí)候,我們首先需要從Linux系統(tǒng)內(nèi)存分配策略講起。
    一般寫C語(yǔ)言程序,我們習(xí)慣使用malloc動(dòng)態(tài)的申請(qǐng)內(nèi)存空間(Java由JVM負(fù)責(zé)內(nèi)存管理),malloc函數(shù)會(huì)向操作系統(tǒng)申請(qǐng)一段連續(xù)的內(nèi)存單元,然后返回這段空間的起始地址。如果malloc函數(shù)返回為null則表示系統(tǒng)沒(méi)有可分配的內(nèi)存空間。這是我們的一般思維,當(dāng)然這在某些操作系統(tǒng)中確實(shí)也是正確的(Solaris)。
     但是Linux不是這樣的,Linux的內(nèi)存分配采取的是一種更加積極的分配策略,它假設(shè)應(yīng)用申請(qǐng)了內(nèi)存空間后并不會(huì)立即去使用它,所以允許一定量的超售,當(dāng)應(yīng)用真的需要使用它的時(shí)候,操作系統(tǒng)可能已經(jīng)通過(guò)回收了其他應(yīng)用的內(nèi)存空間而變得有能力去滿足這個(gè)應(yīng)用的需求,簡(jiǎn)單的說(shuō),就是允許應(yīng)用申請(qǐng)比實(shí)際可分配空間(包括物理內(nèi)存和Swap)更多的內(nèi)存,這個(gè)特性稱為OverCommit。
      這個(gè)特性在Linux操作系統(tǒng)里面也是可配的,可以通過(guò)設(shè)置/proc/sys/overcommit_memory為不同的值來(lái)調(diào)整OverCommit策略。
     overcommit_memory可以取3個(gè)值:
0:默認(rèn)值,由Linux內(nèi)核通過(guò)一些啟發(fā)式算法來(lái)決定是否超售和超售的大小,一般允許輕微的超售,拒絕一些明顯不可能提供的請(qǐng)求,同時(shí)做一些規(guī)則限制,比如不同用戶overcommit的大小也不一樣。
1:允許,不做限制的超售,當(dāng)然這個(gè)也不是無(wú)限大,還受到尋址空間的限制,32位系統(tǒng)最大可能只有4G,64位系統(tǒng)大概16T左右。
2:禁止,禁止超售,系統(tǒng)能夠分配的內(nèi)存不會(huì)超過(guò)swap+實(shí)際物理內(nèi)存*overcommit_ratio,該值可以通過(guò)/proc/sys/vm/overcommit_ratio設(shè)置,默認(rèn)50%。

    為了驗(yàn)證Linux的內(nèi)存分配,我們用個(gè)小程序來(lái)測(cè)試一下:

#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);
    
}

前者再通過(guò)malloc()申請(qǐng)了內(nèi)存空間以后,并沒(méi)有立即去使用它,而后者相反,每次申請(qǐng)完都立即用1去填充。我們來(lái)看看兩個(gè)程序運(yùn)行的結(jié)果。

這是在1G的RAM,400M Swap的虛擬機(jī)上運(yùn)行的結(jié)果,前者申請(qǐng)了遠(yuǎn)遠(yuǎn)超過(guò)實(shí)際內(nèi)存的空間,后者并沒(méi)有超過(guò)實(shí)際內(nèi)存可用空間。這就驗(yàn)證了前面敘述的Linux的內(nèi)存分配策略。
本身這是一個(gè)系統(tǒng)的優(yōu)化,無(wú)可厚非。但是我們知道,但凡“超售”都是基于不會(huì)有大量程序同時(shí)使用資源的假設(shè),這顯然也是有風(fēng)險(xiǎn)的。所以Linux又使用了一種OOM Killer(Out Of Memory killer)的機(jī)制,在系統(tǒng)可用內(nèi)存(包括Swap)即將使用完之前,選擇性的Kill掉一些進(jìn)程以求釋放一些內(nèi)存。下一章我們重點(diǎn)討論一下Linux OOM Killer的機(jī)制。

相關(guān)文章

  • Navicat for MySQL導(dǎo)出表結(jié)構(gòu)腳本的簡(jiǎn)單方法

    Navicat for MySQL導(dǎo)出表結(jié)構(gòu)腳本的簡(jiǎn)單方法

    下面小編就為大家?guī)?lái)一篇Navicat for MySQL導(dǎo)出表結(jié)構(gòu)腳本的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • 解決Node.js mysql客戶端不支持認(rèn)證協(xié)議引發(fā)的問(wèn)題

    解決Node.js mysql客戶端不支持認(rèn)證協(xié)議引發(fā)的問(wèn)題

    這篇文章主要介紹了解決Node.js mysql客戶端不支持認(rèn)證協(xié)議引發(fā)的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • jdbc操作數(shù)據(jù)庫(kù)的基本流程詳解

    jdbc操作數(shù)據(jù)庫(kù)的基本流程詳解

    本篇文章是對(duì)jdbc操作數(shù)據(jù)庫(kù)的基本流程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL查詢性能優(yōu)化方法匯總講解

    MySQL查詢性能優(yōu)化方法匯總講解

    這篇文章主要介紹了MySQL查詢性能優(yōu)化方法,Mysql查詢性能優(yōu)化要從三個(gè)方面考慮,庫(kù)表結(jié)構(gòu)優(yōu)化、索引優(yōu)化和查詢優(yōu)化,通常在實(shí)際應(yīng)用中,我們要面對(duì)這三種攪和一起的情況,需要了解MySQL查詢性能優(yōu)化方法的朋友可以參考下
    2024-05-05
  • MYSQL administrator 使用

    MYSQL administrator 使用

    Administrator 也許你認(rèn)為可以不需要這個(gè)東西,但我還是要建議你下載并使用MySQL Administrator,它提供圖形界面以幫助你管理MySQL數(shù)據(jù)庫(kù),Windows用戶可以通過(guò)命令提示行運(yùn)行
    2008-06-06
  • Can’t open file:''[Table]mytable.MYI''

    Can’t open file:''[Table]mytable.MYI''

    也許很多人遇到過(guò)類似Can’t open file: ‘[Table]mytable.MYI’ 這樣的錯(cuò)誤信息,卻不知道怎么解決他,下面我們做個(gè)介紹,
    2011-01-01
  • SQL中表鎖定(LOCK、UNLOCK)的具體使用

    SQL中表鎖定(LOCK、UNLOCK)的具體使用

    本文主要介紹了SQL中表鎖定(LOCK、UNLOCK)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 數(shù)據(jù)庫(kù)性能測(cè)試之sysbench工具的安裝與用法詳解

    數(shù)據(jù)庫(kù)性能測(cè)試之sysbench工具的安裝與用法詳解

    sysbench是一個(gè)很不錯(cuò)的數(shù)據(jù)庫(kù)性能測(cè)試工具,這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)庫(kù)性能測(cè)試之sysbench工具的安裝與用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • MySQL分表實(shí)現(xiàn)上百萬(wàn)上千萬(wàn)記錄分布存儲(chǔ)的批量查詢?cè)O(shè)計(jì)模式詳解

    MySQL分表實(shí)現(xiàn)上百萬(wàn)上千萬(wàn)記錄分布存儲(chǔ)的批量查詢?cè)O(shè)計(jì)模式詳解

    本篇文章是對(duì)使用MySQL分表實(shí)現(xiàn)上百萬(wàn)上千萬(wàn)記錄分布存儲(chǔ)的批量查詢?cè)O(shè)計(jì)模式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Mysql中json類型查詢方法示例

    Mysql中json類型查詢方法示例

    這篇文章主要給大家介紹了關(guān)于Mysql中json類型查詢的相關(guān)資料,在MySQL中可以使用一些函數(shù)和操作符來(lái)查詢JSON字段,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09

最新評(píng)論

化德县| 雷州市| 商丘市| 鸡泽县| 益阳市| 勃利县| 义乌市| 西华县| 聂拉木县| 吉水县| 郁南县| 通渭县| 广灵县| 华亭县| 岱山县| 潜山县| 尚志市| 肇源县| 囊谦县| 秦皇岛市| 东港市| 天柱县| 松潘县| 安陆市| 澎湖县| 钟祥市| 香格里拉县| 山阳县| 安吉县| 京山县| 城市| 伊宁市| 教育| 石家庄市| 平南县| 囊谦县| 新和县| 凉山| 黔东| 宾川县| 和平县|