基于Linux的Socket網(wǎng)絡(luò)編程的性能優(yōu)化
4 SOCket的性能優(yōu)化
4.1 解決多路復(fù)用
上面的運行過程僅實現(xiàn)了一個客戶端接人,在實際情況中,人們往往遇到多個客戶端連接服務(wù)器端的情況。由于connect(),recv(),send() 都是阻塞性函數(shù),若資源沒有準(zhǔn)備好,則調(diào)用該甬?dāng)?shù)的進(jìn)程將進(jìn)入睡眠狀態(tài),無法處理I/O多路復(fù)用。在服務(wù)器端的serv.c中加入select()函數(shù),它可同時監(jiān)聽多個套接字,實現(xiàn)I/O的多路復(fù)用。
其函數(shù)原型如下:

該函數(shù)監(jiān)視一系列文件描述符,特別是readfds、writefds和exceptfds。如果想知道是否能從標(biāo)準(zhǔn)輸入和套接字描述符sockfd讀入數(shù)據(jù),只要將文件描述符“0”和“sockfd”加入集合readfds中。參數(shù)numfds應(yīng)等于最高文件描述符的值加1,設(shè)置該值為sockfd+ 1。因為它一定大于標(biāo)準(zhǔn)輸入的文件描述符“0”。當(dāng)函數(shù)select()返回時,readfds的值修改為反映選擇的哪個文件描述符可讀。重新編譯和運行客戶端的程序后,服務(wù)器端允許多個客戶端接入,服務(wù)器端運行結(jié)果如圖6所示。
4.2 最小化報文傳輸?shù)难訒r
通過TCP socket進(jìn)行通信時,數(shù)據(jù)都被拆分成數(shù)據(jù)塊,這樣它們就可以封裝到給定連接的TCP payload(指TCP數(shù)據(jù)包中的有效負(fù)荷)中。TCP payload的大小取決于幾個因素(如最大報文長度和路徑),為了達(dá)到較好的性能,應(yīng)使用盡可能多的可用數(shù)據(jù)來填充每個報文。當(dāng)沒有足夠的數(shù)據(jù)來填充 payload時(也稱為最大報文段長度maximum segment size或MSS),TCP將采用Nagle算法自動將一些小緩沖區(qū)連接到一個報文段中。這樣可以通過最小化所發(fā)送的報文的數(shù)量來提高應(yīng)用程序的效率,并減輕整體的網(wǎng)絡(luò)擁塞。
由于這種算法對數(shù)據(jù)進(jìn)行合并,試圖構(gòu)成一個完整的TCP報文段,因此會引入一些延時。Socket網(wǎng)絡(luò)傳輸很長時間只發(fā)送一些較小的報文,比如 telnet程序,它讓用戶可以與遠(yuǎn)程系統(tǒng)進(jìn)行交互,通常通過一個shell來進(jìn)行,如果用戶被要求用發(fā)送報文之前輸入的字符來填充某個報文段,該方法絕對不能滿足需要。再比如HTTP協(xié)議,通??蛻魴C(jī)瀏覽器會產(chǎn)生一個小請求(一條HTTP請求消息),然后Web服務(wù)器就會返回一個更大的響應(yīng)(Web頁面)。最小化傳輸延時是首要的。在這種情況中,Socket可以提供一種解決方案,即禁用Nagle算法,可設(shè)置TCP_NODELAY socket選項TCP socket禁用Nagle算法。
使用Samba的實驗表明,在服務(wù)器上的Samba驅(qū)動器上讀取數(shù)據(jù)時,禁用Nagle算法幾乎可以加倍提高讀性能。
p2p機(jī)相關(guān)文章:p2p原理
評論