Posted on 2009-02-03 13:48
Prayer 閱讀(405)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
SOCKET
在AIX 中,網(wǎng)絡(luò)性能的優(yōu)化可從以下幾方面進(jìn)行:
網(wǎng)絡(luò)內(nèi)存(network memory)的調(diào)整
socket 緩沖區(qū) (socket buffer) 的調(diào)整
網(wǎng)絡(luò)接口(network interface)參數(shù)的調(diào)整
網(wǎng)絡(luò)適配器 (network adapter) 上發(fā)送/接收隊(duì)列的調(diào)整
名字解析(name resolution) 的查找順序。
1.網(wǎng)絡(luò)內(nèi)存的調(diào)整
AIX中參數(shù) thewall 的值限定了系統(tǒng)中最多有多少物理內(nèi)存可被網(wǎng)絡(luò)緩沖區(qū)使用。但在AIX5L中 thewall 的值是無(wú)法修改的,是在系統(tǒng)啟動(dòng)時(shí)就確定的:
32-位核心 – thewall 取值為 1/2 物理內(nèi)存 與 1GB 中的最小值,即最大為1GB。
64-位核心 – thewall 取值為 1/2 物理內(nèi)存 與 65GB 中的最小值,即最大為65GB。
如果 netstat –m 命令結(jié)果顯示缺少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]
。。。
使用下述方法之一調(diào)整網(wǎng)絡(luò)內(nèi)存:
a. 如果是32位核心,并且內(nèi)存小于2GB,增大系統(tǒng)內(nèi)存。
b. 如果是64位核心,并且內(nèi)存小于65GB,增大系統(tǒng)內(nèi)存。
c. 如果可能,將32位核心改成64位核心,增大系統(tǒng)內(nèi)存。
d. 檢查socket 的發(fā)送/接收緩存區(qū)的大小,以確定是否可將其減小。
e. 是否有mbuf的泄漏現(xiàn)象。
2. socket 緩沖區(qū) (socket buffer) 的調(diào)整
TCP Socket 的發(fā)送緩沖區(qū)(send buffer)是用于暫時(shí)存放應(yīng)用的數(shù)據(jù)的區(qū)域。緩沖區(qū)的大小是由 no 參數(shù) tcp_sendspace 來(lái)定義的,在用戶應(yīng)用中使用系統(tǒng)調(diào)用 setsockopt() 可以覆蓋此參數(shù)的定義。為了保證使網(wǎng)絡(luò)的吞吐量的平穩(wěn),常規(guī)將tcp_sendspace 值設(shè)成MTU的 10倍以上 。
使用 netstat –i 可以查出每一網(wǎng)絡(luò)接口的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的接收緩沖區(qū)(receive buffer)是用于接收來(lái)自于網(wǎng)絡(luò)上的數(shù)據(jù)的區(qū)域,收到數(shù)據(jù)包后要給發(fā)送方回送確認(rèn)信息(ACK),同時(shí)告訴發(fā)送方本地的接收緩沖區(qū)中還有多少空間,若沒(méi)有足夠的空間存放新數(shù)據(jù),則發(fā)送方就暫停發(fā)送新數(shù)據(jù),直到接收方能再接收為止。接收緩沖區(qū)的大小由 tcp_recvspace 設(shè)定,常規(guī)將tcp_recvspace 值設(shè)成MTU的 10倍以上 。可根據(jù)應(yīng)用的需要來(lái)調(diào)整此參數(shù)。
對(duì)于socket buffer 還有 udp_sendspace, udp_recvspace 這兩個(gè)參數(shù),用于UDP協(xié)議。由于沒(méi)有流量控制功能,udp_recvspace 太小會(huì)引起數(shù)據(jù)包的丟失。
系統(tǒng)中 tcp_sendspace, tcp_recvspace 的缺省值是 16384, udp_sendspace 是 9216, udp_recvspace 是41600。
注意: 系統(tǒng)中全部scoket 所用的內(nèi)存不能大于 sb_max 所設(shè)定的值。
查看當(dāng)前tcp_sendspace 和 tcp_revcspace 的值:
$ no –o tcp_sendspace
$ no –o tcp_revcspace
設(shè)置 socket buffer 的值, 直到下次重啟:
$no –o tcp_sendspace=32768
$no –o tcp_recvspace=32768
設(shè)置 socket buffer 的值, 下次重啟仍有效:
$no –r –o tcp_sendspace=32768
$no –r –o tcp_recvspace=32768
3.網(wǎng)絡(luò)接口(network interface)參數(shù)的調(diào)整
在AIX5以前,網(wǎng)絡(luò)參數(shù)的定義在整個(gè)系統(tǒng)范圍內(nèi)有效,所有網(wǎng)絡(luò)接口使用統(tǒng)一的定義,無(wú)法為特定的網(wǎng)絡(luò)接口單獨(dú)設(shè)定值。
在AIX5 中 TCP socket 的 發(fā)送/接收緩沖區(qū)的尺寸、rfc1323(調(diào)整窗口值)、tcp_mssdflt(調(diào)整 maximum transmission size)和tcp_nodelay (是否立刻轉(zhuǎn)發(fā)數(shù)據(jù)包) 網(wǎng)絡(luò)參數(shù)可在網(wǎng)絡(luò)接口上進(jìn)行定義。 在接口上定義的值覆蓋系統(tǒng)上統(tǒng)一定義的值,應(yīng)用中setsockopt() 系統(tǒng)調(diào)用設(shè)定的值也能覆蓋系統(tǒng)的統(tǒng)一定義。
在為特定的網(wǎng)絡(luò)接口調(diào)整參數(shù)時(shí),要將 isno (Interface Specific Network Options) 設(shè)為1:
#no –r –o isno=1
a. 若只是臨時(shí)修改,可用 ifconfig 命令:
#ifconfig en0 ip_lable tcp_recvspace 65536 tcp_sendspace 65536.
b. 使用chdev 命令來(lái)修改參數(shù),如:
#chdev –l en0 –a tcp_recvspace=65536 –a tcp_space=65536
會(huì)修改ODM中的內(nèi)容,所以在重新開機(jī)后參數(shù)也會(huì)生效。
4.網(wǎng)絡(luò)適配器 (network adapter) 發(fā)送/接收隊(duì)列的調(diào)整
如果適配器的傳輸隊(duì)列不夠大的話,在netstat –v 的結(jié)果中 “S/W Transmit Queue Overflow” 的值為非0。
如果接收資源不足,則“Packets Dropped” 或 “Out of Rcv Buffers” 或 “ No Resource Errors” 就會(huì)出現(xiàn)非0的值。
使用 chdev 或 smit 來(lái)調(diào)整相應(yīng)隊(duì)列的值,如:# chdev -l entx -a tx_que_sz=16384[b] [/b]
5. 名字解析(name resolution) 的查找順序
在AIX中缺省名字解析的順序是DNS àNIS à/etc/hosts。
可以使用 /etc/netsvc.conf文件或 NSORDER環(huán)境變量來(lái)改變?nèi)笔〉拿纸馕鲰樞颍蕴岣呙纸馕龅乃俣龋?etc/netsvc.conf文件和 NSORDER環(huán)境變量同時(shí)存在,則NSORDER起作用。
使用變量 NSORDER 改變解析順序,用如下方法定義:
export NSORDER= local,nis,bind
使用/etc/netsvc.conf 文件,在文件中加入:
hosts=local,bind,nis