NFS的緩存IO機制
<一> async 參數模式下分析
NFS 默認的mount參數為async,async 參數表示內核不會透傳程序的IO請求給sever,對於寫IO會延遲執行,積累一定的時間以便合並上層的IO請求以提高效率。
讀分析
1: 順序讀請求的合並預讀
dd if=/mnt/nfs/3 of=/dev/null bs=1500 count=100
測試發現僅僅發送了6個read請求 16384 + 32768 * 4 + 2544 =150000,並且其中后5個請求是連續發送的。
2:隨機讀讀懲罰
隨機讀情況下,由於都有預讀,所有每次預讀都會多讀一部分數據,導致可能實際使用的數據量不到接受到數據的10分之一,稱為讀懲罰。
寫分析
1:追加寫
dd if=/dev/zero of=/mnt/nfs/ddtest bs=1 count=100
dd將已經存在的文件的size(SETATTR)設置為0,然后從頭開始追加寫入這個文件,每次寫1B,寫100次。但是內核並沒有像NFS服務器發送100次寫,實際上指發送了一次寫。
2:覆蓋寫
連續覆蓋寫:內核行為和追加寫一樣,內核對寫操作進行了合並。
隨機覆蓋小:隨機模式下,內核無法對寫進行合並,直接完全透傳用戶程序發起的I/O。
<二> sync參數模式下的分析
讀分析
1:如果mount的時候選用sync參數,或者如果上層使用 sync 調用,那么其產生的讀I/O一定在內核處也是同步的,因為只有在前一個讀請求數據成功返回給客戶端程序,客戶端程序才會發起下一個讀請求,(對於異步讀調用,內核可以在短時間內接受到多個讀請求,此時內核可以將這些讀請求合並,這就是異步過程)。但是同步讀並不影響nfs的預讀,比如
dd if=/mnt/nfs/ddtest bs=1 count=150,並不是向server發送150個一次1B的請求,而是根據rsize進行預讀,把150B的數據一次性讀回來,其他159次就直接命中緩存了。
寫分析
1:對於sync同步的寫調用,程序只有在第一個寫調用結束之后才會發起下一個寫。
dd if=/dev/zero of=/mnt/nfs/ddtest bs=1 count=1500 (1B為單位的寫操作),那么就是發送150個write請求,效率非常低下。
注意:DIO模式由於每次都繞過了內核的pagecache ,所以每一個請求都會向服務端發起請求,不會進行預讀,異步寫,寫合並,讀合並等策略。
https://blog.csdn.net/ta_nk/article/details/7172845