2016-10-05 64 views
6

是否可以使用Netty限制服務器的全局或通道帶寬?使用Netty通過百分比節流服務器帶寬

我可以通過GlobalChannelTrafficShapingHandler設置明確的讀取或寫入速率限制,但我試圖將服務器的全局帶寬限制爲大約一半的可用帶寬。所以如果服務器可以以8MB/s的速度上傳,我想限制上傳大約4MB/s。我希望服務器根據可用的帶寬變化進行調整;所以如果服務器的上傳速率降低到5MB/s(可能是由於其他應用程序的網絡利用率),那麼我想將速率限制爲約2.5MB/s。

我一直在玩覆蓋AbstractTrafficShapingHandler.submitWrite()並添加一個基於自上次調用的持續時間的延遲,但邏輯看起來很脆弱和不可靠。

有關如何智能解決此問題的任何想法?

+0

在這種情況下,QoS可能會更容易。如果你使用Linux,請嘗試http://superuser.com/questions/309063/how-can-i-prioritise-network-bandwidth-on-a-per-application-basis – kichik

+0

@kichik這是一個Java應用程序在Win/Mac/Linux上運行。 – dejuknow

+0

知道什麼是「可用帶寬」是非常困難的。像「鏈路速度」這樣的事情可能完全沒有用處,因爲在大多數系統中,瓶頸可能在更遠的地方。除此之外,查看應用程序使用的總帶寬不太準確,因爲它同時取決於主機上的其他應用程序,以及可能特定於TCP/IP連接結束時的任何客戶端的任何瓶頸。 – BeeOnRope

回答

3

您是否考慮過使用GlobalTrafficShapingHandler並定期讓它全力以赴找出服務器的最大帶寬,然後將其限制爲一半?

我會定期做如下(按計劃,也許1秒每分鐘)

  • 增加setReadLimitsetWriteLimit到最大,你將永遠讓
  • 使用GlobalTrafficShapingHandler小號TrafficCounter(通過public trafficCounter())通過致電resetCumulativeTime
  • 重置計數請確保TrafficCounter的時間間隔短於或等於您要採樣的時間。改變這種使用TrafficCounter.configure(long)
  • 樣品的TrafficCounter獲取服務器的最大帶寬
  • 修改GlobalTrafficShapingHandler使用您剛剛計算

我覺得上面應該給你你想要的東西不會太一半的帶寬脆弱。

+0

我會獎勵賞金。這或多或少是我在向AbstractTrafficShapingHandler.submitWrite()添加延遲時所做的嘗試(除了我正在對每個其他請求進行採樣)。我想定期抽樣路線是最好的選擇。謝謝! – dejuknow