redis中的緩沖區(qū)
- aof持久化:第一步執(zhí)行寫入命令坛善;第二步將寫命令寫到用戶空間的
aof緩沖區(qū)
,后續(xù)將aof
緩沖區(qū)的寫命令發(fā)送內(nèi)核空間的page cache。 - aof重寫:為了aof重寫期間數(shù)據(jù)保持一致性眠屎,客戶端寫入命令時(shí)剔交,不僅需要寫入到
aof緩存區(qū)
,也需要寫入到一個(gè)aof重寫緩沖區(qū)
改衩。在aof重寫完成后岖常,子進(jìn)程通過信號(hào)通知父進(jìn)程,父進(jìn)程收到信號(hào)后會(huì)將aof重寫緩存區(qū)
中的數(shù)據(jù)追加
到aof文件中葫督。 - 在主從架構(gòu)的中竭鞍,主節(jié)點(diǎn)往從節(jié)點(diǎn)同步數(shù)據(jù)時(shí),都會(huì)先講寫命令同步到主節(jié)點(diǎn)的
replication buffer緩沖區(qū)
中橄镜,然后異步
返回,最后通過長(zhǎng)連接將緩存區(qū)中的數(shù)據(jù)發(fā)送到從節(jié)點(diǎn)偎快,主節(jié)點(diǎn)會(huì)給每個(gè)新連接的從節(jié)點(diǎn)分配一個(gè)replication buffer緩存區(qū)
。 - 在主從架構(gòu)中洽胶,主從節(jié)點(diǎn)是通過一個(gè)長(zhǎng)連接來發(fā)送寫數(shù)據(jù)來保持?jǐn)?shù)據(jù)一致性的晒夹,但是由于網(wǎng)絡(luò)的不可控性,該連接可能會(huì)中斷的姊氓,當(dāng)恢復(fù)之后從節(jié)點(diǎn)可能需要增量同步丐怯,也可能需要全量同步。
決定哪種同步方式的因素是replication backup buffer緩存區(qū)
翔横,該緩存區(qū)是一個(gè)環(huán)形結(jié)構(gòu)读跷,且有固定大小,整個(gè)集群中主節(jié)點(diǎn)只會(huì)維護(hù)一個(gè)replication backup buffer緩存區(qū)
棕孙,且該緩存區(qū)內(nèi)記錄著所有消息的offet舔亭,該緩存區(qū)主要用于記錄主節(jié)點(diǎn)增量同步從節(jié)點(diǎn)的數(shù)據(jù),因?yàn)樵摥h(huán)型緩沖區(qū)是有大小的蟀俊,如果滿了話后面的同步的數(shù)據(jù)會(huì)覆蓋環(huán)內(nèi)的緩存钦铺。
好了,知道了replication bakcup buffer緩沖區(qū)
的使用場(chǎng)景后肢预,在來說它是怎么覺得使用增量同步還是全量同步的呢矛洞?
當(dāng)從節(jié)點(diǎn)和主節(jié)點(diǎn)之間長(zhǎng)連接恢復(fù)后,從節(jié)點(diǎn)會(huì)向主節(jié)點(diǎn)發(fā)送當(dāng)前讀取最新的offset烫映,而主節(jié)點(diǎn)收到后會(huì)對(duì)比該offet和主節(jié)點(diǎn)最新寫入的offet的差值沼本,如果該差值范圍內(nèi)的所有offset在replication backup buffer緩沖區(qū)
上,則將replication backup buffer緩沖區(qū)
上對(duì)應(yīng)的offset發(fā)送到replication buffer緩存區(qū)
上锭沟,即增量同步
抽兆;否則進(jìn)行全量同步
。
如果主節(jié)點(diǎn)的寫入速度大于從節(jié)點(diǎn)的讀取速度族淮,那么主節(jié)點(diǎn)上的replication backup buffer緩沖區(qū)
就會(huì)被覆蓋辫红,如果此時(shí)主節(jié)點(diǎn)和從節(jié)點(diǎn)之間的長(zhǎng)連接斷開凭涂,恢復(fù)后將采用全量復(fù)制,所以replication backup buffer緩沖區(qū)
的大小是很重要的贴妻。
在上面的持久化(寫入磁盤)或者 主從同步(網(wǎng)絡(luò)IO)中都可以看到很多緩沖區(qū)
的字眼切油,那么有沒有想過一個(gè)問題為什么不直接寫入到磁盤或者是直接請(qǐng)求io呢?而需要先寫到緩沖區(qū)呢名惩?
-
降低請(qǐng)求磁盤的頻率或者降低請(qǐng)求網(wǎng)絡(luò)IO的頻率
:我們都知道磁盤和網(wǎng)絡(luò)IO都是非常慢的澎胡,那么如果使用緩存區(qū)的話,通趁漯模可以合并數(shù)據(jù)
或者合并網(wǎng)絡(luò)IO
攻谁,這樣明顯可以減少請(qǐng)求磁盤或者請(qǐng)求IO的次數(shù),可以提高性能底循。 -
異步刷盤
:寫入緩沖區(qū)中的數(shù)據(jù)不會(huì)立即同步
到磁盤或者請(qǐng)求IO巢株,而是在某個(gè)時(shí)刻合并成一個(gè)更到的數(shù)據(jù)或者IO后才發(fā)生請(qǐng)求槐瑞。
異步可以提高寫入性能熙涤,因?yàn)椴槐氐却總€(gè)寫命令或者都同步到磁盤或者響應(yīng)。這樣可以繼續(xù)處理新的IO或者新的請(qǐng)求困檩,而不受到磁盤或者網(wǎng)絡(luò)的阻塞祠挫。 -
減少磁盤頁(yè)內(nèi)碎片化
:將多個(gè)命令一次性寫入磁盤可以降低磁盤碎片的產(chǎn)生。頻繁地小規(guī)模寫入可能會(huì)導(dǎo)致文件碎片化悼沿,而一次性寫入可以減少這種情況等舔。如果磁盤頁(yè)大小為4K,寫入的數(shù)據(jù)小于4k時(shí)寫入占用一個(gè)磁盤頁(yè),這樣就會(huì)造成頁(yè)內(nèi)碎片化糟趾。
PAGE CACHE
上面談到了一個(gè)page cache
,其實(shí)它是也是一個(gè)緩存區(qū)慌植,屬于內(nèi)核空間的緩存,叫做磁盤高速緩存區(qū)
义郑,其作用和上面介紹的差不多
-
合并IO
:內(nèi)核的 I/O 調(diào)度算法會(huì)緩存盡可能多的 I/O 請(qǐng)求在 PageCache 中蝶柿,最后「合并」成一個(gè)更大的 I/O 請(qǐng)求再發(fā)給磁盤,這樣做是為了減少磁盤的尋址操作非驮;
磁盤的尋址操作是指在硬盤上找到并讀取或?qū)懭霐?shù)據(jù)的過程交汤。硬盤是由多個(gè)盤片(platters)組成的,每個(gè)盤片都被分成許多圓形的軌道(tracks)劫笙,而每個(gè)軌道又被劃分為許多扇區(qū)(sectors)芙扎。磁頭(read/write head)可以在盤片的表面上移動(dòng),而盤片則以高速旋轉(zhuǎn)填大。
磁盤尋址操作的主要步驟包括:
尋道(Seek): 磁頭從當(dāng)前位置移動(dòng)到目標(biāo)軌道上的正確位置戒洼,這個(gè)過程稱為尋道。尋道操作的時(shí)間開銷取決于磁頭的移動(dòng)速度允华。
旋轉(zhuǎn)(Rotational Delay): 等待目標(biāo)扇區(qū)旋轉(zhuǎn)到磁頭的正下方圈浇,這個(gè)過程稱為旋轉(zhuǎn)敷矫。旋轉(zhuǎn)操作的時(shí)間開銷取決于磁盤的旋轉(zhuǎn)速度。
傳送(Transfer): 一旦目標(biāo)扇區(qū)位于磁頭的正下方汉额,就可以進(jìn)行數(shù)據(jù)的讀取或?qū)懭搿?/p>
合并 I/O 操作有助于減少磁盤的尋址操作曹仗,主要原因如下:
減少尋道次數(shù): 將多個(gè)小的 I/O 請(qǐng)求合并成一個(gè)更大的請(qǐng)求,可以減少尋道次數(shù)蠕搜。由于尋道操作通常是相對(duì)較慢的怎茫,減少尋道次數(shù)可以顯著提高磁盤的讀寫效率。
最小化旋轉(zhuǎn)延遲: 合并 I/O 請(qǐng)求也有助于最小化旋轉(zhuǎn)延遲妓灌。如果多個(gè)請(qǐng)求都在同一軌道上轨蛤,它們可以更有效地等待目標(biāo)扇區(qū)旋轉(zhuǎn)到磁頭的正下方,減少了旋轉(zhuǎn)延遲虫埂。
提高吞吐量: 合并 I/O 請(qǐng)求可以提高磁盤的吞吐量祥山。通過將多個(gè)小的請(qǐng)求組合成一個(gè)大的請(qǐng)求,可以以更高的效率傳送數(shù)據(jù)掉伏,減少傳送的時(shí)間開銷缝呕。
總體而言,合并 I/O 操作通過減少尋道次數(shù)和最小化旋轉(zhuǎn)延遲斧散,提高了磁盤的讀寫效率供常,增加了吞吐量,從而減少了整體的磁盤尋址時(shí)間鸡捐。這對(duì)于提高系統(tǒng)性能和優(yōu)化磁盤 I/O 是非常有益的栈暇。
-
預(yù)讀
:內(nèi)核也會(huì)「預(yù)讀」后續(xù)的 I/O 請(qǐng)求放在 PageCache 中,一樣是為了減少對(duì)磁盤的操作箍镜;
看到這里可能會(huì)有疑問源祈,既然page cache
,已經(jīng)有了合并IO,預(yù)讀色迂,異步刷盤的特點(diǎn)了香缺,為什么還需要再用戶空間在設(shè)立一層緩沖區(qū)呢?
內(nèi)核的PAGE CACHE是操作系統(tǒng)用來管理磁盤和內(nèi)存之間的緩存的脚草,而用戶空間的緩沖區(qū)則是由應(yīng)用程序自身維護(hù)的一種數(shù)據(jù)緩存赫悄。
控制緩存策略: 應(yīng)用程序可以更加精確地控制在何時(shí)將數(shù)據(jù)寫入磁盤。用戶空間緩沖區(qū)允許應(yīng)用程序決定何時(shí)將數(shù)據(jù)刷寫到磁盤馏慨,而不完全依賴于操作系統(tǒng)的異步刷盤機(jī)制埂淮。
自定義緩存邏輯: 應(yīng)用程序可以實(shí)現(xiàn)自己的緩存邏輯,例如實(shí)現(xiàn)LRU(Least Recently Used)或其他緩存淘汰策略写隶,以更好地滿足應(yīng)用程序的需求倔撞。
減少IO壓力: 用戶空間緩沖區(qū)可以允許應(yīng)用程序?qū)⒍鄠€(gè)小的寫操作合并為一個(gè)更大的寫操作,減少了對(duì)磁盤的隨機(jī)寫入慕趴,提高了IO的效率痪蝇。
提高應(yīng)用程序性能: 通過使用用戶空間緩沖區(qū)鄙陡,應(yīng)用程序可以更加主動(dòng)地管理自己的數(shù)據(jù),以適應(yīng)特定的應(yīng)用場(chǎng)景和性能需求躏啰。
雖然用戶空間的緩沖區(qū)需要更多的維護(hù)和管理趁矾,但它提供了更多的靈活性和控制權(quán),使應(yīng)用程序能夠更好地適應(yīng)特定的性能和需求给僵。在某些情況下毫捣,使用用戶空間的緩沖區(qū)可以提供更好的性能和定制化的緩存管理策略。