生产者和消费者代码———操作系统_kafka如何保证高并发(从生产者、消费者角度)...
內容梗概:
系統緩存+順序寫+批處理+mmap(生產者角度-高并發寫入)
零拷貝技術(消費者角度-高并發讀取)
Kafka在生產者寫入消息的時候會將數據最終寫入磁盤,既然它是基于磁盤讀寫,那么頻繁的IO操作肯定會影響讀寫的性能,為何會有高性能呢?
1.系統緩存+順序寫+批處理+mmap(生產者角度-高并發寫入)
在這里,Kafka生產者將消息寫入各個broker中的時候,并不會直接寫入磁盤,會將數據先寫入緩存OS Cache(基于操作系統,所以命名OS),然后操作系統會決定什么時候將消息成批地將數據寫入磁盤(批處理),因為寫入數據時是直接和內存交互,所以其寫入性能很高,而且在從緩存寫入磁盤的時候,它會將隨機寫優化為順序寫,我們都知道,磁盤的寫入是基于磁道尋址的,隨機寫會引發大量的磁盤尋址(即要先找到數據在磁盤上的位置,再進行數據讀寫),浪費大量的時間,而順序寫避免了頻繁的尋址操作(直接追加數據至末尾),寫入性能提高了數倍。(畫外音:很多優秀的開源框架都采用了順序來優化寫入,比如HBase memestore)
[mmap]:即便是順序寫入硬盤,硬盤的訪問速度還是不可能追上內存。所以Kafka的數據并不是實時的寫入硬盤 ,它充分利用了現代操作系統分頁存儲來利用內存提高I/O效率。
Memory Mapped Files(mmap 內存映射文件) ,它的工作原理是直接利用操作系統的Page來實現硬盤和物理內存之間的映射。完成映射之后你對物理內存的操作會被同步到硬盤上(操作系統在適當的時候)。通過mmap,進程像讀寫硬盤一樣讀寫內存(當然是虛擬機內存),也不必關心內存的大小有虛擬內存為我們兜底。(Oda.你以為你在操作硬盤,實際你在操作內存,內存會定時同步到硬盤)
但也有一個很明顯的缺陷——不可靠,寫到mmap中的數據并沒有被真正的寫到硬盤,操作系統會在程序主動調用flush的時候才把數據真正的寫到硬盤。
Kafka提供了一個參數——producer.type來控制是不是主動flush,如果Kafka寫入到mmap之后就立即flush然后再返回Producer叫 同步 (sync);寫入mmap之后立即返回Producer不調用flush叫異步(async)。
2.零拷貝技術(消費者角度-高并發讀取)
非零拷貝的流程:
(1)操作系統將數據從磁盤文件中讀取到內核空間的頁面緩存;
(2)應用程序將數據從內核空間讀入用戶空間緩沖區;(優化)
(3)應用程序將讀到數據寫回內核空間并放入 socket 緩沖區;
(4)操作系統將數據從 socket 緩沖區復制到網卡接口,此時數據才能通過網絡發送。
在磁盤上的數據格式、producer發送到broker的數據格式、和consumer收到的數據格式一模一樣。由于磁盤格式與consumer以及producer的數據格式一模一樣,這樣就使得Kafka可以通過Linux的sendFile技術(NIO),省去了進程切換和一次數據拷貝,讓性能變得更好。
SendFile優化后,直接把數據從內核區copy到socket,然后發送到網卡,避免了在內核Buffer與用戶Buffer來回拷貝的弊端。
本筆記本內容綜合整理自多方資料加上個人心得,只用于非盈利內容分享,如有侵權,請聯系刪除。
總結
以上是生活随笔為你收集整理的生产者和消费者代码———操作系统_kafka如何保证高并发(从生产者、消费者角度)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么计算一组数据的波动_[理论+spss
- 下一篇: latex 下划线_备战美赛!论文写作必