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

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