Java - Mule UDP数据包丢失

时间:2014-04-10 11:18:59

标签: java linux sockets udp mule

我搜索了很多关于这个话题的内容。

  • UDP不可靠
  • UDP无法发送高于64kbs的数据包或65507字节的无标头
  • MTU通常为1500
  • sysctl.conf的 net.core.rmem_max = 52508000 net.core.rmem_default = 26265600
    net.ipv4.udp_mem = 102400 26265600 52508000
    net.core.netdev_max_backlog = 65536 net.ipv4.route.flush = 1

    我在Windows中进行了测试,试图在300秒内发送100msg / sec @ 256 kbps的速率,并且没有通过Localhost丢失数据包。

尝试Linux throgh Localhost片段256kbs在4 msg的65507字节,125000~msg发布120000~收到4%的数据包丢失。

在2个子网之间尝试我得到了可怕的结果,发布125000~并接收40000~。

我的机器:1 GB以太网,32核,32 GB RAM内核2.6.32-358.el6.x86_64

我的应用程序设计有10个线程,从特定的IP发送到10个端口。

Mule中的我的UDP连接器:

    <udp:connector name="udpConnector" timeout="0" validateConnections="false" receiveBufferSize="26265600" sendBufferSize="26275600" broadcast="true" keepSendSocketOpen="true" doc:name="udpConnector"/>

也许我忘了设置或我的Mule UDP pararms是错误的,但我无法用一台好机器解释这个。

有人可以照亮我吗?很多thnx,TCP不是一个选项^^

                            //sendData = new byte[65507];
                            tim = 300;
                            delay = tim * 1000;

                            setmsgSec(40);

                            do{
                                    for(int i=0; i<=msgSec ;i++)
                                    {
                                            ds.send(dp[3]);
                                            cont++;
                                            setCont(cont);
                                            setRate(cont);
                                            setAvgBytes(sendata[3].length);

                                    }

                                    Thread.sleep(1000);
                                    tim = tim - 1;
                            delay = delay - 1000;
                    }while (delay != 0);
                            setCont(cont);

1 个答案:

答案 0 :(得分:0)

问题解决了。

解决方案:为每台机器上的缓冲区设置相同的值,1GB以太网,32核心和1。 32G RAM和突发200条消息256kbps这个值就足够了。

kernel.threads-max = 2048
net.core.optmem_max = 16777216
net.core.rmem_default = 2620280
net.core.rmem_max = 16777216
net.core.wmem_default = 2620280
net.core.wmem_max = 16777216**

我使用性能成本低的log4j.properties:

log4j.rootLogger=INFO, default.out
# System.out.println appender for all classes
log4j.appender.default.out=org.apache.log4j.ConsoleAppender
log4j.appender.default.out.threshold=INFO
log4j.appender.default.out.layout=org.apache.log4j.PatternLayout
log4j.appender.default.out.layout.ConversionPattern=%m%n