大數(shù)據(jù)開發(fā)最火技術(shù)Kafka背后的“黑科技”
Kafka是由Apache軟件基金會(huì)開發(fā)的一個(gè)開源流處理平臺(tái),被廣泛地應(yīng)用在數(shù)據(jù)緩沖、異步通信、匯集日志、系統(tǒng)解耦等方面。相比較于其他常見消息系統(tǒng),Kafka在保障了大部分功能特性的同時(shí),還在高吞吐、低延遲等方面有很突出的表現(xiàn)。這篇文章不同于其他介紹Kafka使用或?qū)崿F(xiàn)的文章,只是談?wù)凨afka用了什么“黑科技”使他在性能方面有這么突出的表現(xiàn)。
消息順序?qū)懭氪疟P
磁盤大多數(shù)都還是機(jī)械結(jié)構(gòu)(SSD不在討論的范圍內(nèi)),如果將消息以隨機(jī)寫的方式存入磁盤,就需要按柱面、磁頭、扇區(qū)的方式尋址,尋址是一個(gè)“機(jī)械動(dòng)作”也最耗時(shí)。為了提高讀寫硬盤的速度,Kafka就是使用順序I/O。
圖 1 Kafka順序IO
上圖中,每個(gè)partition就是一個(gè)文件,每條消息都被append 到該 partition 中,屬于順序?qū)懘疟P,因此效率非常高。這種方法有一個(gè)缺陷—— 沒有辦法刪除數(shù)據(jù) ,所以Kafka是不會(huì)刪除數(shù)據(jù)的,它會(huì)把所有的數(shù)據(jù)都保留下來,每個(gè)消費(fèi)者(Consumer)對(duì)每個(gè)Topic都有一個(gè)offset用來表示讀取到了第幾條數(shù)據(jù) 。
關(guān)于磁盤順序讀寫和隨機(jī)讀寫的性能,引用一組Kafka官方給出的測(cè)試數(shù)據(jù)(Raid-5,7200rpm):
Sequence I/O: 600MB/s
Random I/O: 100KB/s
所以通過只做Sequence I/O,給Kafka帶來了性能的極大提升。
Zero Copy
考慮一個(gè)web程序讀取文件內(nèi)容并傳輸?shù)骄W(wǎng)絡(luò)的場(chǎng)景,實(shí)現(xiàn)的核心代碼如下:
圖 2 普通read方法
雖然只是兩個(gè)調(diào)用,但卻經(jīng)過了4次copy,其中有2次cpu copy,還有多次用戶態(tài)與內(nèi)核態(tài)的上下文切換,這會(huì)加重cpu的負(fù)擔(dān),而零拷貝就是為了解決這種低效。
# mmap:
減少拷貝次數(shù)的一種方法是調(diào)用mmap()來代替read()調(diào)用:
應(yīng)用程序調(diào)用mmap(),磁盤上的數(shù)據(jù)會(huì)通過DMA被拷貝到內(nèi)核緩沖區(qū),接著操作系統(tǒng)會(huì)把這段內(nèi)核緩沖區(qū)與應(yīng)用程序共享,這樣就不需要把內(nèi)核緩沖區(qū)的內(nèi)容往用戶空間拷貝。應(yīng)用程序再調(diào)用write(),操作系統(tǒng)直接將內(nèi)核緩沖區(qū)的內(nèi)容拷貝到socket緩沖區(qū)中,最后再把數(shù)據(jù)發(fā)到網(wǎng)卡去。
圖 3 mmap方法
使用mmap可以減少一次cpu copy,但也會(huì)遇到一些陷阱,當(dāng)你的程序map了一個(gè)文件,但是當(dāng)這個(gè)文件被另一個(gè)進(jìn)程截?cái)啵╰runcate)時(shí), write系統(tǒng)調(diào)用會(huì)因?yàn)樵L問非法地址而被SIGBUS信號(hào)終止。通常可以通過,為SIGBUS信號(hào)建立信號(hào)處理程序或使用文件租憑(file leasing)的方式去解決,這里就不再贅述了。
# sendfile:
從2.1版內(nèi)核開始,Linux引入了sendfile來簡(jiǎn)化操作
圖 4 sendfile方法
sendfile() 方法引發(fā) DMA 引擎將文件內(nèi)容拷貝到一個(gè)讀取緩沖區(qū)(DMA copy)然后由內(nèi)核將數(shù)據(jù)拷貝到socket buffer(cpu copy)最后再拷貝到網(wǎng)卡(DMA copy)使用sendfile不僅減少了數(shù)據(jù)拷貝的次數(shù),還減少了上下文切換,數(shù)據(jù)傳送始終只發(fā)生在kernel space
聊到這里,sendfile至少還需要一次cpu copy,那么這一步能不能省去呢?為了消除內(nèi)核完成的所有數(shù)據(jù)復(fù)制,我們需要一個(gè)支持收集(gather)操作的網(wǎng)絡(luò)接口。同時(shí),在內(nèi)核版本2.4中,也修改了套接字緩沖區(qū)描述符以適應(yīng)零拷貝要求。 這種方法不僅減少了多個(gè)上下文切換,還完全取消了cpu copy。
圖 5 sendfile方法(DMA gather)
sendfile系統(tǒng)調(diào)用利用DMA引擎將文件內(nèi)容拷貝到內(nèi)核緩沖區(qū)去,然后將帶有文件位置和長(zhǎng)度信息的緩沖區(qū)描述符添加socket緩沖區(qū)去,這一步不會(huì)將內(nèi)核中的數(shù)據(jù)拷貝到socket緩沖區(qū)中,DMA引擎會(huì)將內(nèi)核緩沖區(qū)的數(shù)據(jù)拷貝到協(xié)議引擎中去,避免了最后一次CPU拷貝。
零拷貝技術(shù)非常普遍,JAVA的transferTo、transferFrom方法就是Zero Copy。

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
4月30日立即下載>> 【村田汽車】汽車E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評(píng) >> 【評(píng)選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評(píng)選
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺(tái)
- 5 國(guó)產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長(zhǎng)空間
- 8 地平線自動(dòng)駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營(yíng)收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?