這篇文章給大家分享的是有關(guān)redis中AOF有哪些潛在的阻塞點(diǎn)的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
成都創(chuàng)新互聯(lián)IDC提供業(yè)務(wù):成都服務(wù)器托管,成都服務(wù)器租用,成都服務(wù)器托管,重慶服務(wù)器租用等四川省內(nèi)主機(jī)托管與主機(jī)租用業(yè)務(wù);數(shù)據(jù)中心含:雙線機(jī)房,BGP機(jī)房,電信機(jī)房,移動(dòng)機(jī)房,聯(lián)通機(jī)房。
1. Redis采用fork子進(jìn)程重寫(xiě)AOF文件時(shí),有潛在的阻塞風(fēng)險(xiǎn)
fork子進(jìn)程,fork這個(gè)瞬間一定是會(huì)阻塞主線程的(注意,fork時(shí)并不會(huì)一次性拷貝所有內(nèi)存數(shù)據(jù)給子進(jìn)程),fork采用操作系統(tǒng)提供的寫(xiě)實(shí)復(fù)制(Copy On Write)機(jī)制,就是為了避免一次性拷貝大量?jī)?nèi)存數(shù)據(jù)給子進(jìn)程造成的長(zhǎng)時(shí)間阻塞問(wèn)題?!鞠嚓P(guān)推薦:Redis視頻教程】
但fork子進(jìn)程需要拷貝進(jìn)程必要的數(shù)據(jù)結(jié)構(gòu),其中有一項(xiàng)就是拷貝內(nèi)存頁(yè)表(虛擬內(nèi)存和物理內(nèi)存的映射索引表),這個(gè)拷貝過(guò)程會(huì)消耗大量CPU資源,拷貝完成之前整個(gè)進(jìn)程是會(huì)阻塞的,阻塞時(shí)間取決于整個(gè)實(shí)例的內(nèi)存大小,實(shí)例越大,內(nèi)存頁(yè)表越大,fork阻塞時(shí)間越久。
拷貝內(nèi)存頁(yè)表完成后,子進(jìn)程與父進(jìn)程指向相同的內(nèi)存地址空間,也就是說(shuō)此時(shí)雖然產(chǎn)生了子進(jìn)程,但是并沒(méi)有申請(qǐng)與父進(jìn)程相同的內(nèi)存大小。
那什么時(shí)候父子進(jìn)程才會(huì)真正內(nèi)存分離呢?
“寫(xiě)實(shí)復(fù)制”顧名思義,就是在寫(xiě)發(fā)生時(shí),才真正拷貝內(nèi)存真正的數(shù)據(jù),這個(gè)過(guò)程中,父進(jìn)程也可能會(huì)產(chǎn)生阻塞的風(fēng)險(xiǎn),就是下面介紹的場(chǎng)景。
fork出的子進(jìn)程指向與父進(jìn)程相同的內(nèi)存地址空間,此時(shí)子進(jìn)程就可以執(zhí)行AOF重寫(xiě),把內(nèi)存中的所有數(shù)據(jù)寫(xiě)入到AOF文件中。
但是此時(shí)父進(jìn)程依舊是會(huì)有流量寫(xiě)入的,如果父進(jìn)程操作的是一個(gè)已經(jīng)存在的key,那么這個(gè)時(shí)候父進(jìn)程就會(huì)真正拷貝這個(gè)key對(duì)應(yīng)的內(nèi)存數(shù)據(jù),申請(qǐng)新的內(nèi)存空間,這樣逐漸地,父子進(jìn)程內(nèi)存數(shù)據(jù)開(kāi)始分離,父子進(jìn)程逐漸擁有各自獨(dú)立的內(nèi)存空間。因?yàn)閮?nèi)存分配是以頁(yè)為單位進(jìn)行分配的,默認(rèn)4k,如果父進(jìn)程此時(shí)操作的是一個(gè)bigkey,重新申請(qǐng)大塊內(nèi)存耗時(shí)會(huì)變長(zhǎng),可能會(huì)產(chǎn)生阻塞風(fēng)險(xiǎn)。
另外,如果操作系統(tǒng)開(kāi)啟了內(nèi)存大頁(yè)機(jī)制(Huge Page,頁(yè)面大小2M),那么父進(jìn)程申請(qǐng)內(nèi)存時(shí)阻塞的概率將會(huì)大大提高,所以在Redis機(jī)器上需要關(guān)閉Huge Page機(jī)制。Redis每次fork生成RDB或AOF重寫(xiě)完成后,都可以在Redis log中看到父進(jìn)程重新申請(qǐng)了多大的內(nèi)存空間。
AOF重寫(xiě)不復(fù)用AOF本身的日志:
一個(gè)原因是父子進(jìn)程寫(xiě)同一個(gè)文件必然會(huì)產(chǎn)生競(jìng)爭(zhēng)問(wèn)題,控制競(jìng)爭(zhēng)就意味著會(huì)影響父進(jìn)程的性能。
二是如果AOF重寫(xiě)過(guò)程中失敗了,那么原本的AOF文件相當(dāng)于被污染了,無(wú)法做恢復(fù)使用。所以Redis AOF重寫(xiě)一個(gè)新文件,重寫(xiě)失敗的話,直接刪除這個(gè)文件就好了,不會(huì)對(duì)原先的AOF文件產(chǎn)生影響。等重寫(xiě)完成之后,直接替換舊文件即可。
感謝各位的閱讀!關(guān)于“Redis中AOF有哪些潛在的阻塞點(diǎn)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!