Java-Mule-UDP数据包丢失

Java-Mule-UDP数据包丢失,java,linux,sockets,udp,mule,Java,Linux,Sockets,Udp,Mule,关于这个话题我搜索了很多 UDP不可靠 UDP无法发送超过64kbs或65507字节且没有标头的数据包 MTU通常为1500 sysctl.conf net.core.rmem_max=52508000 net.core.rmem_默认值=26265600 net.ipv4.udp_mem=102400 26265600 52508000 net.core.netdev_max_backlog=65536 net.ipv4.route.flush=1 我在Windows中测试了一个escena

关于这个话题我搜索了很多

  • UDP不可靠
  • UDP无法发送超过64kbs或65507字节且没有标头的数据包
  • MTU通常为1500
  • sysctl.conf net.core.rmem_max=52508000 net.core.rmem_默认值=26265600
    net.ipv4.udp_mem=102400 26265600 52508000
    net.core.netdev_max_backlog=65536 net.ipv4.route.flush=1

    我在Windows中测试了一个escenary,我尝试在300秒内以256kbps的速率发送100msg/sec,而不会通过本地主机丢失数据包

在65507字节的4个msg中,通过256kbs本地主机片段尝试Linux,125000~msg发布120000~收到4%的数据包丢失

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

我的机器:1 GB以太网,32核,32 GB ram Linux内核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参数是错误的,但是我不能用一台好的机器来解释这一点

有人能照我吗?很多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);
//sendData=新字节[65507];
tim=300;
延迟=tim*1000;
setmsgSec(40);
做{
对于(int i=0;i问题已解决

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

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

我会对1-5层(或2-5层,取决于设备“接收缓冲区空间不足”的位置)的每个OSI层提出质疑。在任何人祈祷回答之前,你必须进一步缩小范围并进行自己的调试。除了你之外,没有人可以看到你的网络、设备和代码。好的,这是一个例子,假设有10个线程也这样做,以完成256kbps的100 msg/sec的平均值UDP笑话的问题:我没有得到一半