明白了這兩個(gè)機(jī)制后,我們?cè)僦饤l分析TCP對(duì)性能的影響因素:
1、TCP滑動(dòng)窗口:如果要把10塊磚從A地搬到B地,你是一次搬一塊,總共搬10次,還是一口氣搬10塊呢?在力氣允許的條件下,自然是一口氣搬 完速度快,因?yàn)楣?jié)省了往返時(shí)間。網(wǎng)絡(luò)傳輸也是如此,如果有10個(gè)TCP包要傳,在帶寬允許的情況下應(yīng)該一起發(fā)送,而不是發(fā)一個(gè)就等確認(rèn),然后再發(fā)下一個(gè)。 舉個(gè)例子,假如往返時(shí)間 RTT是2毫秒,那10個(gè)包逐個(gè)傳至少要花20毫秒;一起傳就只需要2毫秒多一點(diǎn),對(duì)性能的提高是顯而易見的。除此之外,在發(fā)生丟包的時(shí)候,大窗口可以提 高快速重傳的概率,減少了超時(shí)重傳。比如10個(gè)包一起傳時(shí),前6個(gè)包中任何一個(gè)丟失都可以由接下來的4個(gè)包觸發(fā)快速重傳。而每次傳4個(gè)包是永遠(yuǎn)等不到快速 重傳的機(jī)會(huì)的。
2、多線程:在一個(gè)TCP session里,如果存在多個(gè)線程,也可以在丟包時(shí)提高快速重傳的概率。還記得《NAS性能優(yōu)化之一》里關(guān)于smb2的“叫外賣”圖片嗎?在第一個(gè)請(qǐng)求 沒有完成的情況下,就可以發(fā)送第二個(gè)請(qǐng)求。如果第一個(gè)請(qǐng)求有丟包,那第二個(gè)請(qǐng)求的包可以幫忙湊滿四個(gè),從而觸發(fā)快速重傳。本文開頭提到的讀者在測試 smb2時(shí)得到大幅度的性能提升,很可能就得益于此。除了SMB2和NFS協(xié)議,EMC免費(fèi)提供的EMCOPY工具也能在SMB中實(shí)現(xiàn)多線程拷貝。
3、超時(shí)重傳時(shí)間(RTO):這是一個(gè)動(dòng)態(tài)值。RFC規(guī)定了計(jì)算該值的方法,但是結(jié)果比較大,已經(jīng)不適用當(dāng)今的網(wǎng)絡(luò)環(huán)境了。有些NAS(比如Celerra)提供一個(gè)設(shè)置,允許強(qiáng)制把該值改小。
4、Jumbo Frame:中文好像翻譯為巨幀。就是把MTU增大到9000,從而減少TCP頭和IP頭在一個(gè)網(wǎng)絡(luò)包中所占的比例。理論上這是能提高性能的,但是實(shí)際效果卻不一定。因?yàn)榇蟀膩G失概率更大一點(diǎn),而且包數(shù)少了,就更有可能發(fā)生超時(shí)重傳。
5、網(wǎng)絡(luò)擁塞:除了網(wǎng)絡(luò)配置出錯(cuò)(比如兩端的speed/duplex不符合),另外一個(gè)導(dǎo)致丟包的因素就是網(wǎng)絡(luò)發(fā)生擁塞。如何避免呢?最有效最簡 單的方法當(dāng)然是購買更高端的switch,但這也是最難被接受的建議。有一個(gè)將就的辦法,就是人為的把TCP滑動(dòng)窗口強(qiáng)制在擁塞點(diǎn)以下。寧愿每次少傳一 點(diǎn),也不要丟包。有些 NAS(比如Celerra)提供了強(qiáng)制最大滑動(dòng)窗口的設(shè)置,但是要確定一個(gè)合適的擁塞點(diǎn)比較麻煩,需要抓大量的包分析。
寫到這里,突然想到可以寫幾篇如何利用Wireshark分析網(wǎng)絡(luò)包的。不過,這個(gè)讀者群應(yīng)該比NAS還小很多吧?