kafka高性能io的秘密

之前在項(xiàng)目中用到了kafka做消息傳遞,一直聽說過kafka的性能非常高,這里總結(jié)下kafka為了實(shí)現(xiàn)高性能io的做了哪些設(shè)計(jì)用了什么方式。以對自己今后進(jìn)行高性能服務(wù)設(shè)計(jì)作參考。

1.批量消息處理

kafka服務(wù)端在處理消息的時(shí)候,并不是生產(chǎn)者發(fā)送一條消息它處理一條,而是先攢一批消息然后一并進(jìn)行處理,而且在之后的消息刷盤和發(fā)送給消費(fèi)者,消息都是以一批的形式進(jìn)行處理。這樣的好處就是可以明顯降低請求數(shù),緩解broker的壓力,提高處理效率,但是也存在消息發(fā)送不及時(shí)的缺點(diǎn),即這種方式適用于對實(shí)時(shí)性要求不是特別高的系統(tǒng)

2.順序磁盤io

眾所周知磁盤io涉及到磁盤機(jī)械臂的機(jī)械運(yùn)動(dòng),性能本身就不算特別高,如果還是隨機(jī)磁盤io操作的話,性能就會大大降低,但是為了持久化消息以保證消息不丟失,又必須將消息寫入磁盤,所以這里kafka在往磁盤上寫消息時(shí)都是順序?qū)?,一個(gè)文件寫滿了再開啟一個(gè)新的文件繼續(xù)寫,這樣順序io就避免了隨機(jī)io需要先尋址再進(jìn)行讀寫導(dǎo)致的性能低下,消費(fèi)的時(shí)候讀消息也是從某個(gè)位置開始順序讀出來。

3.利用PageCache緩存

上面提到了磁盤io的性能很低,而才內(nèi)存中進(jìn)行讀寫則非???,而kafka就利用了操作系統(tǒng)中的PageCache技術(shù)來利用內(nèi)存加速消息的讀寫。PageCache是大部分操作系統(tǒng)都有的特性,即我們在平時(shí)程序中對磁盤里的文件進(jìn)行讀寫時(shí),并不是直接對磁盤進(jìn)行操作,操作系統(tǒng)會將文件的一部分拷貝到內(nèi)存中,我們則是對內(nèi)存中的緩存進(jìn)行讀寫,然后PageCache再一批一批將內(nèi)存中的修改寫入磁盤。

而在PageCache中進(jìn)行讀寫有兩種情況,一種是PageCache中有數(shù)據(jù),則可以直接進(jìn)行讀寫,第二種是沒有數(shù)據(jù),則此時(shí)會發(fā)生一次缺頁中斷,操作系統(tǒng)會進(jìn)行一次磁盤io將文件內(nèi)容讀到PageCache中,一般來說應(yīng)用程序用過的PageCache不會立刻被操作系統(tǒng)清理,而是會使用LRU算法后續(xù)慢慢清理。而kafka由于一般剛寫入的消息基本上會立刻被消費(fèi),所以PageCache的命中率非常高,非常好的利用到了PageCache的特性。

4.零拷貝技術(shù)

一般來說一條消息從文件讀出來發(fā)送到消費(fèi)者是這樣一個(gè)流程:

a.讀取文件中的消息到內(nèi)存

b.將內(nèi)存中的消息發(fā)送到網(wǎng)絡(luò)端

而在這個(gè)過程中2-3次數(shù)據(jù)拷貝,比如從文件讀到PageCache中(如果命中PageCache則不用這步操作),從PageCache拷貝到應(yīng)用程序內(nèi)存空間,從內(nèi)存空間拷貝到socket緩沖區(qū),而kakfa利用系統(tǒng)中的一個(gè)系統(tǒng)調(diào)用,直接將消息從PageCache拷貝到socket中,減少一次數(shù)據(jù)拷貝,而且這種方式不用拷貝到應(yīng)用程序的內(nèi)存空間,dma控制器可以直接完成數(shù)據(jù)復(fù)制,速度更快

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容