簡體   English   中英

Java7 DatagramSocket.setReceiveBufferSize在Windows和Linux之間有什么不同?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM