压力测试下,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文件中,添加:

                     net.ipv4.ip_forward = 1

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值