gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:30:29 30 4
gpt4 key购买 nike

在 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com