Posted on 2009-02-03 13:48
Prayer 閱讀(398)
評論(0) 編輯 收藏 引用 所屬分類:
SOCKET
在AIX 中,網絡性能的優化可從以下幾方面進行:
網絡內存(network memory)的調整
socket 緩沖區 (socket buffer) 的調整
網絡接口(network interface)參數的調整
網絡適配器 (network adapter) 上發送/接收隊列的調整
名字解析(name resolution) 的查找順序。
1.網絡內存的調整
AIX中參數 thewall 的值限定了系統中最多有多少物理內存可被網絡緩沖區使用。但在AIX5L中 thewall 的值是無法修改的,是在系統啟動時就確定的:
32-位核心 – thewall 取值為 1/2 物理內存 與 1GB 中的最小值,即最大為1GB。
64-位核心 – thewall 取值為 1/2 物理內存 與 65GB 中的最小值,即最大為65GB。
如果 netstat –m 命令結果顯示缺少mbuf --- “rewuests for mbufs denied” 的值非0 。
[b]# netstat -m[/b]
[b]2434 mbufs in use:[/b]
[b]2432 mbuf cluster pages in use[/b]
[b]10336 Kbytes allocated to mbufs[/b]
[b]0 requests for mbufs denied[/b]
[b]0 calls to protocol drain routines[/b]
[b]0 sockets not created because sockthresh was reached[/b]
[b]Kernel malloc statistics:[/b]
[b]******* CPU 0 *******[/b]
[b]By size inuse calls failed delayed free hiwat freed[/b]
[b]32 172 426280 0 0 84 1440 0[/b]
[b]64 84 2418 0 0 44 720 0[/b]
[b]128 103 881463 0 0 313 360 17[/b]
。。。
使用下述方法之一調整網絡內存:
a. 如果是32位核心,并且內存小于2GB,增大系統內存。
b. 如果是64位核心,并且內存小于65GB,增大系統內存。
c. 如果可能,將32位核心改成64位核心,增大系統內存。
d. 檢查socket 的發送/接收緩存區的大小,以確定是否可將其減小。
e. 是否有mbuf的泄漏現象。
2. socket 緩沖區 (socket buffer) 的調整
TCP Socket 的發送緩沖區(send buffer)是用于暫時存放應用的數據的區域。緩沖區的大小是由 no 參數 tcp_sendspace 來定義的,在用戶應用中使用系統調用 setsockopt() 可以覆蓋此參數的定義。為了保證使網絡的吞吐量的平穩,常規將tcp_sendspace 值設成MTU的 10倍以上 。
使用 netstat –i 可以查出每一網絡接口的MTU 值:
$ netstat -i
Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll
en0 1500 link#2 0.2.55.4f.4.bf 378329 0 411094 0 0
en0 1500 9.181.48.64 atstrs 378329 0 411094 0 0
lo0 16896 link#1 375205 0 375243 0 0
lo0 16896 127 loopback 375205 0 375243 0 0
lo0 16896 : :1 375205 0 375243 0 0
Tcp scoket的接收緩沖區(receive buffer)是用于接收來自于網絡上的數據的區域,收到數據包后要給發送方回送確認信息(ACK),同時告訴發送方本地的接收緩沖區中還有多少空間,若沒有足夠的空間存放新數據,則發送方就暫停發送新數據,直到接收方能再接收為止。接收緩沖區的大小由 tcp_recvspace 設定,常規將tcp_recvspace 值設成MTU的 10倍以上 。可根據應用的需要來調整此參數。
對于socket buffer 還有 udp_sendspace, udp_recvspace 這兩個參數,用于UDP協議。由于沒有流量控制功能,udp_recvspace 太小會引起數據包的丟失。
系統中 tcp_sendspace, tcp_recvspace 的缺省值是 16384, udp_sendspace 是 9216, udp_recvspace 是41600。
注意: 系統中全部scoket 所用的內存不能大于 sb_max 所設定的值。
查看當前tcp_sendspace 和 tcp_revcspace 的值:
$ no –o tcp_sendspace
$ no –o tcp_revcspace
設置 socket buffer 的值, 直到下次重啟:
$no –o tcp_sendspace=32768
$no –o tcp_recvspace=32768
設置 socket buffer 的值, 下次重啟仍有效:
$no –r –o tcp_sendspace=32768
$no –r –o tcp_recvspace=32768
3.網絡接口(network interface)參數的調整
在AIX5以前,網絡參數的定義在整個系統范圍內有效,所有網絡接口使用統一的定義,無法為特定的網絡接口單獨設定值。
在AIX5 中 TCP socket 的 發送/接收緩沖區的尺寸、rfc1323(調整窗口值)、tcp_mssdflt(調整 maximum transmission size)和tcp_nodelay (是否立刻轉發數據包) 網絡參數可在網絡接口上進行定義。 在接口上定義的值覆蓋系統上統一定義的值,應用中setsockopt() 系統調用設定的值也能覆蓋系統的統一定義。
在為特定的網絡接口調整參數時,要將 isno (Interface Specific Network Options) 設為1:
#no –r –o isno=1
a. 若只是臨時修改,可用 ifconfig 命令:
#ifconfig en0 ip_lable tcp_recvspace 65536 tcp_sendspace 65536.
b. 使用chdev 命令來修改參數,如:
#chdev –l en0 –a tcp_recvspace=65536 –a tcp_space=65536
會修改ODM中的內容,所以在重新開機后參數也會生效。
4.網絡適配器 (network adapter) 發送/接收隊列的調整
如果適配器的傳輸隊列不夠大的話,在netstat –v 的結果中 “S/W Transmit Queue Overflow” 的值為非0。
如果接收資源不足,則“Packets Dropped” 或 “Out of Rcv Buffers” 或 “ No Resource Errors” 就會出現非0的值。
使用 chdev 或 smit 來調整相應隊列的值,如:# chdev -l entx -a tx_que_sz=16384[b] [/b]
5. 名字解析(name resolution) 的查找順序
在AIX中缺省名字解析的順序是DNS àNIS à/etc/hosts。
可以使用 /etc/netsvc.conf文件或 NSORDER環境變量來改變缺省的名字解析順序,以提高名字解析的速度,若/etc/netsvc.conf文件和 NSORDER環境變量同時存在,則NSORDER起作用。
使用變量 NSORDER 改變解析順序,用如下方法定義:
export NSORDER= local,nis,bind
使用/etc/netsvc.conf 文件,在文件中加入:
hosts=local,bind,nis