2016-10-05 8 views
6

Nettyを使用してサーバーのグローバル帯域幅またはチャネル帯域幅を制限できますか?Nettyを使用したスロット単位のサーバー帯域幅

明示的な読み取りまたは書き込みレート制限をGlobalChannelTrafficShapingHandlerで設定できますが、サーバーのグローバル帯域幅を使用可能な帯域幅の約半分に制限しようとしています。サーバーが8MB/sでアップロードできる場合は、アップロードを約4MB/sに制限したいと考えています。そして、私はサーバーが利用可能な帯域幅の変更として調整することを望みます。サーバーのアップロード速度が5MB/sに低下した場合(おそらく、他のアプリケーションによるネットワーク利用のため)、速度をapprx 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を試してください。 Win/Mac/Linux上で動作します。 – dejuknow

+0

「利用可能な帯域幅」が何であるか知ることは非常に難しいです。ほとんどのシステムでは、ボトルネックがラインのさらに下のどこかにある可能性が高いため、「リンク速度」のようなものはまったく役に立たない可能性があります。それに加えて、アプリケーションで使用される総帯域幅を調べることは、ホスト上の他のアプリケーションに同時に依存するため、またTCP/IP接続の最後にあるクライアントに固有のボトルネックがあるため、 。 – BeeOnRope

答えて

3

GlobalTrafficShapingHandlerを使用し、定期的にフルスロットルでサーバーの最大帯域幅を把握し、その半分に制限してみましたか?

私は定期的に

  • はあなたがGlobalTrafficShapingHandlerTrafficCounter(経由を使用して
  • 許す最大にsetReadLimitsetWriteLimitを増やす(毎分のうち、スケジュール上、多分1秒)以下の操作を行いますpublic trafficCounter())を呼び出して呼び出しをリセットするresetCumulativeTime
  • TrafficCounterの間隔が、サンプリングする時間より短いか等しいことを確認します。私は上記があまりにもせずに何をしたいあなたを与えるべきだと思うあなただけ

を算出した帯域幅の半分を使用するGlobalTrafficShapingHandlerを変更し、サーバの最大帯域幅

  • を取得するためにTrafficCounter.configure(long)
  • サンプルTrafficCounterを使用して、これを変更します壊れやすい

  • +0

    私は賞金を授与します。これは、AbstractTrafficShapingHandler.submitWrite()に遅延を追加するときに、私がやろうとしていたことです(他のすべてのリクエストをサンプリングしていた場合を除く)。私は定期的なサンプリングルートが最善の方法だと思います。どうも! – dejuknow

    関連する問題