伺服器sendfile傳輸檔案

2021-07-05 13:29:49 字數 1168 閱讀 4986

在apache,nginx,lighttpd等web伺服器當中,都有一項sendfile相關的配置,在一些網上的資料都有談到sendfile會提公升檔案傳輸效能,那sendfile到底是什麼呢?它的原理又是如何呢? 

在傳統的檔案傳輸裡面(read/write方式),在實現上其實是比較複雜的,需要經過多次上下文的切換,我們看一下如下兩行**:

read(file, tmp_buf, len);       

write(socket, tmp_buf, len);  

以上兩行**是傳統的read/write方式進行檔案到socket的傳輸。

當需要對乙個檔案進行傳輸的時候,其具體流程細節如下:

1、呼叫read函式,檔案資料被copy到核心緩衝區

2、read函式返回,檔案資料從核心緩衝區copy到使用者緩衝區

3、write函式呼叫,將檔案資料從使用者緩衝區copy到核心與socket相關的緩衝區。

4、資料從socket緩衝區copy到相關協議引擎。

以上細節是傳統read/write方式進行網路檔案傳輸的方式,我們可以看到,在這個過程當中,檔案資料實際上是經過了四次copy操作:

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

而sendfile系統呼叫則提供了一種減少以上多次copy,提公升檔案傳輸效能的方法。sendfile系統呼叫是在2.1版本核心時引進的:

sendfile(socket, file, len);   

執行流程如下:

1、sendfile系統呼叫,檔案資料被copy至核心緩衝區

2、再從核心緩衝區copy至核心中socket相關的緩衝區

3、最後再socket相關的緩衝區copy到協議引擎

相較傳統read/write方式,2.1版本核心引進的sendfile已經減少了核心緩衝區到user緩衝區,再由user緩衝區到socket相關 緩衝區的檔案copy,而在核心版本2.4之後,檔案描述符結果被改變,sendfile實現了更簡單的方式,系統呼叫方式仍然一樣,細節與2.1版本的 不同之處在於,當檔案資料被複製到核心緩衝區時,不再將所有資料copy到socket相關的緩衝區,而是僅僅將記錄資料位置和長度相關的資料儲存到 socket相關的快取,而實際資料將由dma模組直接傳送到協議引擎,再次減少了一次copy操作。

伺服器檔案傳輸

scp r 在本地向伺服器傳輸檔案 從本地上傳檔案到伺服器,終端命令應執行在本機上 scp 本地檔案的路徑 伺服器使用者名稱 伺服器位址 伺服器上存放檔案的路徑 scp scp1.png root 119.23.75.150 home admin scp r 本地資料夾的路徑 伺服器使用者名稱 伺服...

伺服器間檔案傳輸

單傳檔案 scp home tmp 1.txt username 192.127.124.123 home test 傳資料夾 包括資料夾本身 scp r home tmp username 192.127.124.123 home test 傳資料夾下的所有檔案 不包含資料夾本身 scp home...

在伺服器之間傳輸檔案

因為imagenet放在230節點上,如果不把資料down到其他伺服器上的話,只能使用polyaxon排程跑 而在使用polyaxon過程中程式不知道為什麼總是崩掉,猜測和讀取imagenet的路徑有關,因此想了另乙個辦法,把資料down下來,一開始想的是先down到本地,再上傳到其他伺服器上,而光...