⽤戶空間和核心空間
傳統的IO流
零拷⻉(zero-copy)
零拷⻉主要的任務是避免CPU將資料從⼀塊儲存拷⻉到另外⼀塊儲存,主要就是利⽤各種拷⻉的技術,避免讓CPU做⼤量的資料拷⻉任務,減少不必要的拷⻉,或者說讓別的元件來做這⼀類簡單的資料傳輸,讓CPU專注於別的任務。這樣就可以讓系統資源利⽤的更加有效。
如何減少資料拷⻉的次數呢?減少⽤戶空間到核心空間的拷⻉ mmap 優化。
直接傳遞⽂件描述(sendfile)
深入理解
1)零拷⻉是從作業系統⻆度來說的,因為核心緩衝區之前,沒有資料的重複(只有kernel buffer 有⼀
份資料)。
2)零拷⻉不僅僅帶來了更少的資料複製,還能帶來其他的效能優勢,例如:更少的上下⽂切換,更少
的CPU快取偽共享以及⽆CPU校驗和計算。
mmap 和sendFile 的區別
- mmap 適合⼩資料量讀寫,sendFile適合⼤⽂件傳輸
- mmap 需要4次上下⽂切換、3次資料拷⻉;sendFile 需要3次上下⽂切換、最少2次資料拷⻉。
- sendFile 可以利⽤DMA⽅式,減少CPU拷⻉,mmap 則不能(必須從核心拷⻉到socket 緩衝區)。
在這個選擇上:RocketMQ 在消費訊息時,使⽤了mmap。kafka使⽤了sendFIle。
使用
場景:
⽂件較⼤,讀寫較慢,追求速度
記憶體寬頻不夠,即存在其他程式或執行緒存在⼤量的IO操作
技術:
Java的NIO
nginx零拷貝(nginx開啟零拷貝之後,可以跳過(核心緩衝區->使用者態->socket緩衝區)這一個過程,減少使用者態到核心態的切換)
kafka
總結
演化過程
本作品採用《CC 協議》,轉載必須註明作者和本文連結