Java7 DatagramSocket.setReceiveBufferSize Windows和Linux之间的方式不同?

标签 java network-programming operating-system udp

在 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”权限,并且不应该由应用程序完成。

    This page有一些有关 Linux 网络调优的基本信息。

  • 在 Windows 情况下,操作系统要么不设置限制,要么(更有可能)如果用户请求的缓冲区大小大于操作系统施加的限制,它会默默地覆盖该大小。

<小时/>

话虽如此,您需要考虑一下您在这里做什么。缓冲的网络数据包(RX 和 TX)很可能必须保存在物理内存中。当您增加限制时,您将强制操作系统为其自身保留更多 RAM 页面,从而减少正常应用程序的可用内存。

第二个问题是,如果基本问题是您的应用程序难以跟上,那么增加网络缓冲量可能会有害。在最坏的情况下,您的应用程序将不断处理旧数据包,而新数据包将被丢弃。简而言之,额外的缓冲会使延迟变得更糟,而(不一定)不会消除数据丢失。

关于Java7 DatagramSocket.setReceiveBufferSize Windows和Linux之间的方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12983853/

相关文章:

c - VDSO(7) 和 SYSCALL(2) 之间有什么关系?

java - 如何在两种颜色之间进行插值?

java - 通过 java 套接字传输大文件

java - Spring JPA Repository 合并而不是保存

java - 使用java连接到本地网络设备

c++ - 在带有 https 的网站上使用 qt creator 获取一些值

C++套接字,客户端无法向java服务器发送消息

io - 从裸机操作系统导出数据的最简单方法

c# - Java Annotations 和 C# Attributes 有什么异同?

memory-management - 哪些操作系统将释放内存泄漏?