[轉]Linux UDP嚴重丟包問題的解決

測試系統在Linux上的性能發現丟包率極爲嚴重,發210000條數據,丟包達110000之巨,丟包率超過50%。同等情形下Windows上測試,僅丟幾條數據。形勢嚴峻,必須解決。考慮多是由於協議棧Buffer過低所致,因而先看看默認狀況:linux

 

sysctl -a |grep net.coreoracle

 

發現tcp

 

net.core.rmem_max = 131071 (單位:字節)性能

net.core.rmem_default = 112640 (單位:字節)測試

 

修改吧,變大一點,變成10M,而後reboot(應該重啓某個服務便可)ip

 

而後查網卡收包狀況:內存

 

netstat -suget

 

結果以下:io

 

Udp:table

 

    97690 packets received

 

    112310 packets to unknown port received.

 

    0 packet receive errors

 

    20 packets sent

 

發現數據在網卡就丟了,判斷多是防火牆引發的,因而執行命令:

 

iptables -L

 

結果以下:

 

Chain INPUT (policy ACCEPT)

 

target     prot opt source               destination

 

Chain FORWARD (policy ACCEPT)

 

target     prot opt source               destination

 

Chain OUTPUT (policy ACCEPT)

 

target     prot opt source               destination

 

證實iptables啓動,因而中止防火牆:

 

service iptables stop

 

這個命令即時生效,開啓防火牆的命令:

 

service iptables start

 

若是要完全關閉防火牆,則須要重啓後生效

 

開啓: chkconfig iptables on

 

關閉: chkconfig iptables off

 

在開啓了防火牆時,作以下設置,開啓相關端口,

 

修改/etc/sysconfig/iptables 文件,添加如下內容:

 

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

 

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

 

從新測試,沒丟一條數據。

 

 

 

linux 內核參數調整說明

 

全部的TCP/IP調優參數都位於/proc/sys/net/目錄。例如, 下面是最重要的一些調優參數, 後面是它們的含義:

 

1. /proc/sys/net/core/rmem_max — 最大的TCP數據接收緩衝。

 

2. /proc/sys/net/core/wmem_max — 最大的TCP數據發送緩衝。

 

3. /proc/sys/net/ipv4/tcp_timestamps — 時間戳在(請參考RFC 1323)TCP的包頭增長12個字節。

 

4. /proc/sys/net/ipv4/tcp_sack — 有選擇的應答。

 

5. /proc/sys/net/ipv4/tcp_window_scaling — 支持更大的TCP窗口. 若是TCP窗口最大超過65535(64KB), 必須設置該數值爲1。

 

6. rmem_default — 默認的接收窗口大小。

 

7. rmem_max — 接收窗口的最大大小。

 

8. wmem_default — 默認的發送窗口大小。

 

9. wmem_max — 發送窗口的最大大小。

 

/proc目錄下的全部內容都是臨時性的, 因此重啓動系統後任何修改都會丟失。

 

建議在系統啓動時自動修改TCP/IP參數:

 

把下面代碼增長到/etc/rc.local文件, 而後保存文件, 系統從新引導的時候會自動修改下面的TCP/IP參數:

 

echo 256960 > /proc/sys/net/core/rmem_default

echo 256960 > /proc/sys/net/core/rmem_max

echo 256960 > /proc/sys/net/core/wmem_default

echo 256960 > /proc/sys/net/core/wmem_max

 

echo 0 > /proc/sys/net/ipv4/tcp_timestamps

echo 1 > /proc/sys/net/ipv4/tcp_sack

echo 1 > /proc/sys/net/ipv4/tcp_window_scaling

TCP/IP參數都是自解釋的, TCP窗口大小設置爲256960, 禁止TCP的時間戳(取消在每一個數據包的頭中增長12字節), 支持更大的TCP窗口和TCP有選擇的應答。

 

上面數值的設定是根據互連網鏈接和最大帶寬/延遲率來決定。

 

注: 上面實例中的數值能夠實際應用, 但它只包含了一部分參數。

 

另一個方法: 使用 /etc/sysctl.conf 在系統啓動時把參數配置成您所設置的值:

 

net.core.rmem_default = 256960

net.core.rmem_max = 256960

net.core.wmem_default = 256960

net.core.wmem_max = 256960

 

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_sack =1

net.ipv4.tcp_window_scaling = 1

 

設置Linux內核參數

 

配置 Linux 內核參數(2種方法),修改後不用重啓動更新: /sbin/sysctl -p

第一種:打開/etc/sysctl.conf 複製以下內容

kernel.shmall = 2097152

kernel.shmmax = 2147483648

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

fs.file-max = 65536

net.ipv4.ip_local_port_range = 1024     65000

net.core.rmem_default=262144

net.core.wmem_default=262144

net.core.rmem_max=262144

net.core.wmem_max=262144

 

第二種:打開終端

cat >> /etc/sysctl.conf<

 

kernel.shmall = 2097152

kernel.shmmax = 2147483648

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

fs.file-max = 65536

net.ipv4.ip_local_port_range = 1024     65000

net.core.rmem_default=262144

net.core.wmem_default=262144

net.core.rmem_max=262144

net.core.wmem_max=262144

EOF

 

這裏,對每一個參數值作個簡要的解釋和說明。

    (1)shmmax:該參數定義了共享內存段的最大尺寸(以字節爲單位)。缺省爲32M,對於oracle來講,該缺省值過低了,一般將其設置爲2G。

    (2)shmmni:這個內核參數用於設置系統範圍內共享內存段的最大數量。該參數的默認值是 4096 。一般不須要更改。

    (3)shmall:該參數表示系統一次可使用的共享內存總量(以頁爲單位)。缺省值就是2097152,一般不須要修改。

    (4)sem:該參數表示設置的信號量。

    (5)file-max:該參數表示文件句柄的最大數量。文件句柄設置表示在linux系統中能夠打開的文件數量。

    修改好內核之後,執行下面的命令使新的配置生效。

[root @linux1 /root]# /sbin/sysctl -p

 

以 root 用戶身份運行如下命令來驗證您的設置:

 

/sbin/sysctl -a | grep shm

/sbin/sysctl -a | grep sem

/sbin/sysctl -a | grep file-max

/sbin/sysctl -a | grep ip_local_port_range

 

例如:

# /sbin/sysctl -a | grep shm

kernel.shmmni = 4096

kernel.shmall = 2097152

kernel.shmmax = 2147483648

kernel.shm-use-bigpages = 0

# /sbin/sysctl -a | grep sem

kernel.sem = 250        32000   100     128

# /sbin/sysctl -a | grep file-max

fs.file-max = 65536

# /sbin/sysctl -a | grep ip_local_port_range

net.ipv4.ip_local_port_range = 1024     65000

 

若是系統的參數設置的比上述參數值小,則編輯 /etc/sysctl.conf 文件,添加或更改這些參數。完成後,運行如下命令激活更改:

 

/sbin/sysctl -p

相關文章
相關標籤/搜索