深入剖析零拷貝與順序寫

2021-10-01 14:41:45 字數 1375 閱讀 7972

這篇文章我們來學習下經常出現在各種資料庫與中介軟體設計中的零拷貝和順序寫.

零拷貝技術就是在檔案傳輸時, 減少cpu執行的資料拷貝次數. 那如何減少資料的拷貝次數呢? 我們來學習下在不同linux核心版本中檔案傳輸的過程.

kernel1.0版本

檔案傳輸**:

read(file, tmp_buf, len);

write(socket, tmp_buf, len);

從應用角度來看只有兩步:

但實際上從作業系統的角度來看有四步:

在kernel1.0版本下, 檔案資料實際上進行了四次拷貝.

核心緩衝區是為了在作業系統級別上提高磁碟io效率, 優化磁碟寫操作. 使用者程序緩衝區為了減少系統呼叫次數, 從而降低作業系統在使用者態與核心態切換所耗費的時間.

kernel2.0版本

kernel2.0版本引入sendfile系統減少了一次資料拷貝.

檔案傳輸**:

sendfile(socket, file, len);
流程:

在kernel2.0版本下, 檔案資料進行了三次拷貝.

kernel2.4版本

在kernel2.4版本之後, 檔案描述符結果被改變, sendfile實現了更簡單的方式, 再次減少了一次copy操作.

檔案傳輸**:

sendfile(socket, file, len);
流程:

在kernel2.4版本下, 檔案資料只進行了兩次拷貝.

我們經常在日誌寫入技術裡看到"順序寫"這個概念, 順序寫號稱與記憶體寫效能持平, 這怎麼可能呢? 乙個是寫入磁碟, 乙個是寫入記憶體, 效能怎麼可能做到持平, 下面我們就來學習下.

隨機讀寫與順序讀寫

因為磁碟是機械結構, 每次讀寫之前都會先定址, 這個定址的過程是非常耗費時間的. 隨機讀寫每次都要進行定址, 而順序讀寫只用定址一次, 從減少定址次數這一步就極大提公升了io效能.

順序讀寫有個缺點是無法刪除資料, 使用乙個偏移量(offset)來標記讀寫位置, 所以順序讀寫的檔案一般都是定時/定量刪除重建, 如kafka, elasticsearch, mysql等中介軟體的日誌檔案.

記憶體對映檔案技術使乙個磁碟檔案與物理記憶體的乙個緩衝區之間建立對映關係, 然後從緩衝區中讀寫資料就相當於讀寫磁碟檔案, 極大的提公升了io效能.

原理:

從這裡就可以知道記憶體對映檔案技術效能高的原因了, 因為它省去了flush步驟, 即

rocketmq中零拷貝深入

比較好的文章 所謂零拷貝,指的是應用記憶體與核心記憶體不存在拷貝。對應零拷貝技術有mmap及sendfile。一.mmap優點 小檔案傳輸快,需要四次使用者態與核心態的切換。檔案到核心快取,核心快取到socket buffer,socket buffer到網絡卡記憶體。cpu介入多,使用者態與核心態...

記憶體拷貝函式memcpy函式深入剖析

memcpy 拷貝記憶體內容 定義函式 void memcpy void dest,const void src,size t n memcpy 用來拷貝src所指的記憶體內容前n個位元組到dest所指的記憶體位址上。與strcpy 不同的是,memcpy 會完整的複製n個位元組,不會因為遇到字串結...

Mysql事務與鎖深入剖析

1.事務知識準備 1.檢視資料庫版本 select version 2.檢視資料庫引擎 select variables like engine 3.檢視資料事務隔離級別 select global variables like tx isolation 2.如何開啟事務及事務四大特性 1.手動開啟...