高效能IO-零拷貝(zero copy)

Lance發表於2020-09-15

⽤戶空間和核心空間

高效能IO-零拷貝(zero copy)

傳統的IO流

高效能IO-零拷貝(zero copy)

零拷⻉(zero-copy)

零拷⻉主要的任務是避免CPU將資料從⼀塊儲存拷⻉到另外⼀塊儲存,主要就是利⽤各種拷⻉的技術,避免讓CPU做⼤量的資料拷⻉任務,減少不必要的拷⻉,或者說讓別的元件來做這⼀類簡單的資料傳輸,讓CPU專注於別的任務。這樣就可以讓系統資源利⽤的更加有效。
如何減少資料拷⻉的次數呢?減少⽤戶空間到核心空間的拷⻉ mmap 優化。

高效能IO-零拷貝(zero copy)

直接傳遞⽂件描述(sendfile)

高效能IO-零拷貝(zero copy)

高效能IO-零拷貝(zero copy)

深入理解

1)零拷⻉是從作業系統⻆度來說的,因為核心緩衝區之前,沒有資料的重複(只有kernel buffer 有⼀
份資料)。
2)零拷⻉不僅僅帶來了更少的資料複製,還能帶來其他的效能優勢,例如:更少的上下⽂切換,更少
的CPU快取偽共享以及⽆CPU校驗和計算。

mmap 和sendFile 的區別

  1. mmap 適合⼩資料量讀寫,sendFile適合⼤⽂件傳輸
  2. mmap 需要4次上下⽂切換、3次資料拷⻉;sendFile 需要3次上下⽂切換、最少2次資料拷⻉。
  3. sendFile 可以利⽤DMA⽅式,減少CPU拷⻉,mmap 則不能(必須從核心拷⻉到socket 緩衝區)。

在這個選擇上:RocketMQ 在消費訊息時,使⽤了mmap。kafka使⽤了sendFIle。

使用

場景:

⽂件較⼤,讀寫較慢,追求速度
記憶體寬頻不夠,即存在其他程式或執行緒存在⼤量的IO操作

技術:

Java的NIO
nginx零拷貝(nginx開啟零拷貝之後,可以跳過(核心緩衝區->使用者態->socket緩衝區)這一個過程,減少使用者態到核心態的切換)
kafka

總結

演化過程
高效能IO-零拷貝(zero copy)

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章