Nginx sendfile原理詳解

2021-09-26 09:25:18 字數 1458 閱讀 2141

配置語法

語法: sendfile on | off;

預設值: sendfile off;

上下文: http,server,location,if in location

說明

sendfile值為on,指定使用sendfile系統呼叫來傳輸檔案。

sendfile系統呼叫在兩個檔案描述符之間直接傳遞資料(完全在核心中操作),從而避免了資料在核心緩衝區和使用者緩衝區之間的拷貝,操作效率很高,被稱之為零拷貝。

示例

http {

# ...

sendfile on;

# ...

原理

read/write

在傳統的檔案傳輸方式(read、write/send方式),具體流程細節如下:

呼叫read函式,檔案資料拷貝到核心緩衝區

read函式返回,資料從核心緩衝區拷貝到使用者緩衝區

呼叫write/send函式,將資料從使用者緩衝區拷貝到核心socket緩衝區

資料從核心socket緩衝區拷貝到協議引擎中

在這個過程當中,檔案資料實際上是經過了四次拷貝操作:

硬碟—>核心緩衝區—>使用者緩衝區—>核心socket緩衝區—>協議引擎

sendfile系統呼叫則提供了一種減少拷貝次數,提公升檔案傳輸效能的方法。

sendfile系統呼叫利用dma(直接儲存器訪問:外部裝置不通過cpu而直接與系統記憶體交換資料的接**術)將資料拷貝到核心緩衝區,之後資料被拷貝到與socket相關的核心緩衝區。這裡沒有 使用者態和核心態 之間的切換,在核心中直接完成了從乙個 buffer 到另乙個 buffer 的拷貝

dma擎將資料從核心socket緩衝區拷貝到協議引擎中

這裡沒有使用者態和核心態之間的切換,也沒有核心緩衝區和使用者緩衝區之間的拷貝,大大提公升了傳輸效能。

這個過程資料經歷的拷貝操作如下:

硬碟—>核心緩衝區—>核心socket緩衝區—>協議引擎

帶有dma收集拷貝功能的sendfile

對於帶有dma收集拷貝功能的sendfile系統呼叫,還可以再減少一次核心緩衝區之間的拷貝。具體流程如下:

dfile系統呼叫利用dma引擎將檔案資料拷貝到核心緩衝區,之後,將帶有檔案位置和長度資訊的緩衝區描述符新增到核心socket緩衝區中

引擎會將資料直接從核心緩衝區拷貝到協議引擎中

這個過程資料經歷的拷貝操作如下:

硬碟—>核心緩衝區—>協議引擎

nginx sendfile 引數解釋

sendfile 現在流行的web 伺服器裡面都提供 sendfile 選項用來提高伺服器效能,那到底 sendfile是什麼,怎麼影響效能的呢?sendfile實際上是 linux2.0 以後的推出的乙個系統呼叫,web伺服器可以通過調整自身的配置來決定是否利用 sendfile這個系統呼叫。先來...

DNS原理 HTTP原理 TCP原理

開啟網頁 輸入 檢視本地的dns庫是否存在該 的網域名稱與對應ip位址 接下有兩種情況 本地存在該 網域名稱對應的ip hosts檔案 然後我們直接根據本地快取的dns進行解析,並訪問該網域名稱對應的ip位址,在進行tcp的三次握手,進行與 的連線,當然我們訪問 完畢之後,又進行了四次揮手斷開 本地...

mvcc原理 MySQL MVCC原理

1 mvcc基本原理 mvcc 多版本併發控制 mvcc,multiversion currency control 一般情況下,事務性儲存引擎不是只使用表鎖,行加鎖的處理資料,而是結合了mvcc機制,以處理更多的併發問題。mvcc處理高併發能力最強,但系統開銷 比最大 較表鎖 行級鎖 這是最求高併...