[英]Java7 DatagramSocket.setReceiveBufferSize way different between Windows and Linux?
在Linux(Ubuntu 12.04)和Windows 7上调用此代码会得到非常不同的结果:
DatagramSocket socket = new DatagramSocket(4445);
socket.setReceiveBufferSize(Integer.MAX_VALUE);
System.out.println("SO_RX_BUFFER SET TO:"+socket.getReceiveBufferSize());
您得到的Linux:SO_RX_BUFFER设置为:131071
在Windows上,您得到:SO_RX_BUFFER设置为:2147483647
为什么操作系统之间存在巨大差异? 为什么linux这么小的价值? 反正有没有让linux缓冲区大小增加?
这里发生的是主机操作系统的行为不同。
在Linux案例中,操作系统对应用程序的要求设置了上限。 要解决此问题,您需要更改操作系统配置设置。 这将需要“root”特权,不应由应用程序完成。
此页面包含有关Linux网络调整的一些基本信息。
在Windows情况下,操作系统要么没有限制,要么(更有可能)静默覆盖用户请求的缓冲区大小(如果它大于操作系统强加的限制)。
说完这个,你需要考虑一下你在这里做了什么。 缓冲网络数据包(RX和TX)很可能必须保存在物理内存中。 当您增加限制时,您强制操作系统为自己保留更多RAM页面,从而减少了正常应用程序可用的内存。
第二个问题是,如果基本问题是您的应用程序难以跟上,那么增加网络缓冲量可能会有害。 在最坏的情况下,您的应用程序将持续处理旧数据包,丢弃新数据包。 简而言之,额外的缓冲会使延迟变得更糟,而不必(必然)消除数据丢失。
这似乎是重复的: 为什么更改SO_RCVBUF的值不起作用?
看起来linux有配置文件限制。
添加以下内容:
net.core.rmem_max = 16777216(或任何你想要的限制)
到/etc/sysctl.conf
解决了这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.