大數(shù)據(jù)開發(fā)最火技術Kafka背后的“黑科技”
Kafka是由Apache軟件基金會開發(fā)的一個開源流處理平臺,被廣泛地應用在數(shù)據(jù)緩沖、異步通信、匯集日志、系統(tǒng)解耦等方面。相比較于其他常見消息系統(tǒng),Kafka在保障了大部分功能特性的同時,還在高吞吐、低延遲等方面有很突出的表現(xiàn)。這篇文章不同于其他介紹Kafka使用或?qū)崿F(xiàn)的文章,只是談談Kafka用了什么“黑科技”使他在性能方面有這么突出的表現(xiàn)。
消息順序?qū)懭氪疟P
磁盤大多數(shù)都還是機械結構(SSD不在討論的范圍內(nèi)),如果將消息以隨機寫的方式存入磁盤,就需要按柱面、磁頭、扇區(qū)的方式尋址,尋址是一個“機械動作”也最耗時。為了提高讀寫硬盤的速度,Kafka就是使用順序I/O。
圖 1 Kafka順序IO
上圖中,每個partition就是一個文件,每條消息都被append 到該 partition 中,屬于順序?qū)懘疟P,因此效率非常高。這種方法有一個缺陷—— 沒有辦法刪除數(shù)據(jù) ,所以Kafka是不會刪除數(shù)據(jù)的,它會把所有的數(shù)據(jù)都保留下來,每個消費者(Consumer)對每個Topic都有一個offset用來表示讀取到了第幾條數(shù)據(jù) 。
關于磁盤順序讀寫和隨機讀寫的性能,引用一組Kafka官方給出的測試數(shù)據(jù)(Raid-5,7200rpm):
Sequence I/O: 600MB/s
Random I/O: 100KB/s
所以通過只做Sequence I/O,給Kafka帶來了性能的極大提升。
Zero Copy
考慮一個web程序讀取文件內(nèi)容并傳輸?shù)骄W(wǎng)絡的場景,實現(xiàn)的核心代碼如下:
圖 2 普通read方法
雖然只是兩個調(diào)用,但卻經(jīng)過了4次copy,其中有2次cpu copy,還有多次用戶態(tài)與內(nèi)核態(tài)的上下文切換,這會加重cpu的負擔,而零拷貝就是為了解決這種低效。
# mmap:
減少拷貝次數(shù)的一種方法是調(diào)用mmap()來代替read()調(diào)用:
應用程序調(diào)用mmap(),磁盤上的數(shù)據(jù)會通過DMA被拷貝到內(nèi)核緩沖區(qū),接著操作系統(tǒng)會把這段內(nèi)核緩沖區(qū)與應用程序共享,這樣就不需要把內(nèi)核緩沖區(qū)的內(nèi)容往用戶空間拷貝。應用程序再調(diào)用write(),操作系統(tǒng)直接將內(nèi)核緩沖區(qū)的內(nèi)容拷貝到socket緩沖區(qū)中,最后再把數(shù)據(jù)發(fā)到網(wǎng)卡去。
圖 3 mmap方法
使用mmap可以減少一次cpu copy,但也會遇到一些陷阱,當你的程序map了一個文件,但是當這個文件被另一個進程截斷(truncate)時, write系統(tǒng)調(diào)用會因為訪問非法地址而被SIGBUS信號終止。通常可以通過,為SIGBUS信號建立信號處理程序或使用文件租憑(file leasing)的方式去解決,這里就不再贅述了。
# sendfile:
從2.1版內(nèi)核開始,Linux引入了sendfile來簡化操作
圖 4 sendfile方法
sendfile() 方法引發(fā) DMA 引擎將文件內(nèi)容拷貝到一個讀取緩沖區(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ù)復制,我們需要一個支持收集(gather)操作的網(wǎng)絡接口。同時,在內(nèi)核版本2.4中,也修改了套接字緩沖區(qū)描述符以適應零拷貝要求。 這種方法不僅減少了多個上下文切換,還完全取消了cpu copy。
圖 5 sendfile方法(DMA gather)
sendfile系統(tǒng)調(diào)用利用DMA引擎將文件內(nèi)容拷貝到內(nèi)核緩沖區(qū)去,然后將帶有文件位置和長度信息的緩沖區(qū)描述符添加socket緩沖區(qū)去,這一步不會將內(nèi)核中的數(shù)據(jù)拷貝到socket緩沖區(qū)中,DMA引擎會將內(nèi)核緩沖區(qū)的數(shù)據(jù)拷貝到協(xié)議引擎中去,避免了最后一次CPU拷貝。
零拷貝技術非常普遍,JAVA的transferTo、transferFrom方法就是Zero Copy。
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
11月20日火熱報名中>> 2024 智能家居出海論壇
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
-
精彩回顧立即查看>> 【在線會議】多物理場仿真助跑新能源汽車
推薦專題
- 1 腦機接口芯片,華為出了新專利!
- 2 今年諾獎對人工智能的重視,給我們的基礎教育提了個醒
- 3 銀行業(yè)AI大模型,從入局到求變
- 4 巨頭搶布局,VC狂撒錢,為了能讓「AI讀心」這些公司卷瘋了
- 5 阿斯麥ASML:“骨折級”洋相,又成AI第一殺手?
- 6 蘋果市值創(chuàng)新高,iPhone 16能否助力突破4萬億美元大關?
- 7 一場“載入史冊”的發(fā)布會,讓馬斯克失去了4700億
- 8 百度谷歌比較研究2024:中美“遠古AI龍頭”的現(xiàn)狀與趨勢
- 9 洞見AI風潮 第二屆vivo藍河操作系統(tǒng)創(chuàng)新賽開啟招募
- 10 地平線開啟配售,阿里百度各砸5000萬美金,市值最高超500億
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結構工程師 廣東省/深圳市