效能調優之磁碟檔案讀寫與網路傳輸

2021-10-10 10:22:28 字數 1795 閱讀 9398

引子:我們在讀取磁碟檔案,並經過網路傳輸時,我們能不假思索的用到如下**。

private void sendfile(string filepath) 

dos.flush();

//4.關閉輸入輸出流

dis.close();

dos.close();

} catch (filenotfoundexception e) catch (ioexception e)

}

如下圖所示:應用開始從磁碟讀取一次檔案,到傳送到網路中,一共需要4次檔案拷貝、4次使用者態和核心態之間的切換。

通過上一步的分析,我們得知一次讀寫和傳送,我們要經過4次的檔案拷貝,及核心態使用者態之間的切換。假如我們有32m的檔案需要讀取傳送,由於我們設定的使用者緩衝區大小為1024位元組即1k:byte buf = new byte[1024];那麼32m的檔案,需要經過32*1024/1 = 32768次讀寫,共計需要32768*4=131072次切換,每次切換雖然耗時只有幾納秒或者幾十微秒,但是當高併發情況下傳送檔案時耗時就會增加,檔案被拷貝4次32m*4=128m需消耗128m的記憶體空間。

因此我們可以從減少使用者態和使用者態切換次數、降低檔案拷貝次數來提公升併發讀取傳送檔案的效能。

零拷貝技術正式解決此類問題。在讀取磁碟檔案併發送到網路的過程中,從磁碟檔案讀取和傳送到網路這兩步驟是必不可少的,而使用者態的兩次拷貝是完全可以去掉的。零拷貝技術,並不是沒有拷貝,而是去掉了和使用者態的緩衝區相關的兩次拷貝,如圖所示,可以看出零拷貝技術可以成倍的提公升併發傳輸檔案的效率。

上文中兩張圖中在核心態其實都出現了pagecache告訴緩衝區,那麼pagecache有什麼作用呢。首先我們的記憶體的處理速度遠遠高於磁碟的處理速度,但是磁碟的儲存容量要比記憶體大,我們不能無限制的把檔案都讀入到記憶體中進行處理,因此就需要敲定哪些檔案內容可以放入到記憶體中,這就是pagecache存在的意義,在記憶體和磁碟之間加一層,當記憶體讀取磁碟檔案時,根據時間區域性原理,剛剛被訪問的資料,再次被讀取的概率就很高,根據這個原理,pagecache會預讀一部分內容快取到高速緩衝區,當下次讀取時現在pagecache中查詢,如果資料存在就直接返回,大大提高磁碟的讀取資料的效能。另外pagacache使用lru的淘汰演算法,當高速緩衝區滿了以後,會先把最久未被訪問的快取淘汰掉。

理論上快取記憶體pagacache可以帶來90%的效能提公升,但是這是對於小檔案來說的。對於非常大的檔案的讀取會帶來負面影響,具體就是由於檔案太大,比如幾gb,在併發場景下,很快就會把pagecache快取記憶體區沾滿,由於檔案非常大,不同併發執行緒快取的資料,可能直接就被剔除掉了,導致快取失效,但是pagecache的存在,是需要磁碟到pagecache進行拷貝的,也就是說對於大檔案的傳輸零拷貝技術不但不能利用到pagecache帶來的快取提公升,反而還增加了一次拷貝。這時非同步io和直接io就派上用場了。

先來看下同步io的處理時序圖

非同步io的處理時序圖

在大檔案的讀取傳輸過程中我們可以使用非同步io和直接io,來避免零拷貝這種快取io帶來的效能損耗。

1.小檔案傳輸推薦使用零拷貝技術,零拷貝並不是沒有拷貝,而是沒有使用者態的拷貝。

2.大檔案的傳輸使用非同步io和直接io,可以避免大檔案無法利用傳統io pagecache帶來的效能損耗。

效能調優之linux與架構

調優常用命令 學習linux命令技巧 1.抓大放小,記住命令本身,引數記住幾個最常用的即可。2.多敲,熟能生巧 3.命令 help 幫助文件 4.man 命令 詳細說明 使用命令存在的問題 1.學習成本高 2.只能操作一台機器 3.傳送了命令才能知道運 況 4.開發人員不一定能直接觸碰生產環境 監控...

Spark效能調優之Shuffle調優總結

spark底層shuffle的傳輸方式是使用netty傳輸,netty在進行網路傳輸的過程會申請堆外記憶體 netty是零拷貝 所以使用了堆外記憶體。shuffle過程中常出現的問題 常見問題一 reduce oom?問題原因 reduce task 去map端獲取資料,reduce一邊拉取資料一邊...

Spark效能調優 之 運算元調優(二)

map 表示每乙個元素 rrd.foreache 表示每乙個元素 rrd.forpartitions 表示每個分割槽的資料組成的迭代器 在生產環境中,通常使用foreachpartition運算元來完成資料庫的寫入,通過foreachpartition運算元的特性,可以優化寫資料庫的效能。如果使用f...