1. 程式人生 > >壓力測試下,UDP丟包解決方案

壓力測試下,UDP丟包解決方案

      udp丟包是指在截獲資料包後,linux核心的tcp/ip協議棧在udp資料包處理過程中的丟包,主要原因有兩個:udp資料包格式或校驗和錯誤和應用程式來不及處理udp資料包。

首先介紹通用的udp丟包檢測方法,使用netstat命令,加-su引數。

# netstat -su

Udp:

    * packets received

    * packets to unknown port received.

    * packet receive errors

    * packets sent

    RcvbufErrors: *

    SndbufErrors: *

從上面的輸出中,可以看到有一行輸出包含了"packet receive errors",如果每隔一段時間執行netstat -su,發現行首的數字不斷變大,表明發生了udp丟包。

其次,由於應用程式來不及處理而導致udp丟包的常見原因:

1、linux核心socket緩衝區設的太小
# cat /proc/sys/net/core/rmem_default

# cat /proc/sys/net/core/rmem_max

可以檢視socket緩衝區的預設值和最大值。

在大壓力下,rmem_default、rmem_max、wmem_default和wmem_max的值,如果伺服器的效能壓力不大,對處理時延也沒有很嚴格的要求,設定為1M左右即可。如果伺服器的效能壓力較大,對處理時延有很嚴格的要求,則須謹慎設定rmem_default 和rmem_max,如果設得過小,會導致丟包,如果設得過大,會出現滾雪球。

         修改rmem_default、rmem_max、wmem_default和wmem_max的值,需要在/etc/sysctl.conf檔案中進行,執行sysctl -p即可生效。

       即當系統重新啟動後,原來設定的引數值就會丟失,而系統每次啟動時都會自動去/etc/sysctl.conf檔案中讀取核心引數,因此將核心的引數配置寫入這個檔案中,是一個比較好的選擇。

  首先開啟/etc/sysctl.conf檔案,檢視如下兩行的設定值,這裡是:
  kernel.shmall = 2097152
  kernel.shmmax = 4294967295 如果系統預設的配置比這裡給出的值大,就不要修改原有配置。同時在/etc/sysctl.conf檔案最後,新增以下內容:

  fs.file-max = 6553600 
  kernel.shmmni = 4096 
  kernel.sem = 250 32000 100 128 
  net.ipv4.ip_local_port_range = 1024 65000 
  net.core.rmem_default = 4194304 
  net.core.rmem_max = 4194304 
  net.core.wmem_default = 262144 
  net.core.wmem_max = 262144 
  這裡的“fs.file-max = 6553600”其實是由“fs.file-max = 512 * PROCESSES”得到的,我們指定PROCESSES的值為12800,即為“fs.file-max =512 *12800”。

  sysctl.conf檔案修改完畢後,接著執行“sysctl -p”使設定生效。
  [root@localhost ~]# sysctl -p 常用的核心引數的含義如下。
  kernel.shmmax:表示單個共享記憶體段的最大值,以位元組為單位,此值一般為實體記憶體的一半,不過大一點也沒關係,這裡設定的為4GB,即“4294967295/1024/1024/1024=4G”。
  kernel.shmmni:表示單個共享記憶體段的最小值,一般為4kB,即4096bit.
  kernel.shmall:表示可用共享記憶體的總量,單位是頁,在32位系統上一頁等於4kB,也就是4096位元組。
  fs.file-max:表示檔案控制代碼的最大數量。檔案控制代碼表示在Linux系統中可以開啟的檔案數量。
  ip_local_port_range:表示埠的範圍,為指定的內容。
  kernel.sem:表示設定的訊號量,這4個引數內容大小固定。
  net.core.rmem_default:表示接收套接字緩衝區大小的預設值(以位元組為單位)。
  net.core.rmem_max :表示接收套接字緩衝區大小的最大值(以位元組為單位)
  net.core.wmem_default:表示傳送套接字緩衝區大小的預設值(以位元組為單位)。

  net.core.wmem_max:表示傳送套接字緩衝區大小的最大值(以位元組為單位)。

     注:當加入iptable規則,在輸入/輸出/轉發過程中不起作用時,則需要在/etc/sysctl.conf檔案中,新增: