2. 客戶端每次讀的數(shù)據(jù)大小,也會影響到性能。在上面的例子中客戶端每次讀64KB,是一個比較好的數(shù)值。如果讀的值特別小(比如4KB),會增加讀操作和往返次數(shù),從而影響性能。這個值的大小是由客戶端和服務器協(xié)商決定的??蛻舳松贤耆Q于應用程序,服務器上一般有設置選項。比如Windows服務器提供了SizReqBuf這個注冊表鍵值供用戶設置。
3. 另外一個性能影響因素是服務器的響應時間。對于讀操作,最常用的優(yōu)化方式是啟用“prefetch”。即服務器在回復了前一個讀請求后,立即把接下來的數(shù)據(jù)從硬盤中讀出,等著回復下一個請求。
CIFS的寫操作和讀操作方式相似,對于相同點就不再贅述。不同點主要體現(xiàn)在響應時間的優(yōu)化方式上。服務器為了優(yōu)化寫操作的響應時間,一般采用 write cache的方式。也就是服務器先把客戶端寫過來的數(shù)據(jù)存在cache里,然后向客戶端確認。接下來再慢慢把cache里的數(shù)據(jù)刷進磁盤。當然這種方式存在一定的風險,如果服務器突然斷電,cache里的數(shù)據(jù)就會丟失。客戶端的應用程序可以啟用write throuth來避免write cache。
下面,我們再看看NFS的工作方式。
和CIFS不同,NFS共享在使用前需要掛載(mount)。掛載時使用的參數(shù)很大程度上影響了讀寫的性能。列舉如下:
1. UDP或TCP:在網(wǎng)絡非常穩(wěn)定的情況下,UDP理論上比TCP性能好一點,因為UDP包在協(xié)議上的消費比例低。但是如果有網(wǎng)絡包丟失,TCP就顯示出優(yōu)勢。因為UDP包丟失時,整個讀/寫操作的所有包都要重傳;而TCP包丟失時,只需重傳丟失的那個包即可。
2. rsize和wsize,每次讀寫的最大值。該值對性能的影響和CIFS的第二點是一樣的,所以不再贅述。
3. sync和async,sync意味著服務器需要把數(shù)據(jù)寫到磁盤再確認;async則意味著服務器可以把數(shù)據(jù)存到cache里就確認,然后再慢慢把 cache里的數(shù)據(jù)刷進磁盤。有一個經(jīng)常被忽視的嚴重問題:sync參數(shù)會強制wsize變成4KB,這會大大降低寫性能。