7

netty nio libを使用してJavaで開発したダウンロードクライアントの場合、帯域幅制限機能も実装しました。技術的には、GlobalTrafficShapingHandlerオブジェクトを介してこれを行います。このクラスのJavaDocに基づいて、nioクライアントパイプラインを次のように初期化します。

...
trafficHandler = new GlobalTrafficShapingHandler(
        new HashedWheelTimer(), 0, 0, 1000);
execHandler = new ExecutionHandler(
        new OrderedMemoryAwareThreadPoolExecutor(20, 0, 0));
...

public ChannelPipeline getPipeline() throws Exception
{
    // create default pipeline
    ChannelPipeline pipeline = pipeline(); 

    // traffic shaping handler
    pipeline.addLast("global-traffic-shaping", trafficHandler);

    // SSL support
    if(useSSL)
    {
        SSLEngine sslEngine = createSSLEngine();
        pipeline.addLast("ssl", new SslHandler(sslEngine));
    }

    // memory executor
    pipeline.addLast("memory-executor", execHandler);

    // business logic
    pipeline.addLast("data-processing", 
        new NettyNioClientHandler(
            nettyNioClient, localer, logger, ncMgr, username, useSSL));

    return pipeline;
}

そして、実行時に最大値を設定します。経由でダウンロード速度

public void setDlSpeedLimit(long limit)
{
    if(limit < 0)
        return;

    trafficHandler.configure(0, limit * 1000L);
}

わかりました。基本的に、nettynioの機能は正常に高速に動作します。最大値を設定すると アプリケーションのダウンロード速度を見ると、帯域幅の使用量が実際に最大に制限されていることもわかります。レベル。を介してbandwithの使用状況を監視します

trafficHandler.getTrafficCounter().getLastReadThroughput();

ただし、残念ながら最大。私が監視する速度は、私が以前に設定した速度ではなく、近くでもありません。たとえば、私は元々(制限なしで)ダウンロード速度が約2000 kb / sで、上記のように制限を300 kb / sに設定しましたが、実際のダウンロード速度は700〜900kb/で変化します。 s。

したがって、この場合の私の問題は、トラフィックシェーパーが何かを実行していることを確認できますが、意図したとおりではありません。ここで何か、たとえばパイプラインの初期化のステップを見逃していませんか?

よろしくお願いします!

4

2 に答える 2

0

新しいパイプラインが要求されるたびにインスタンスgetPipeline()化されます。GlobalTrafficShapingHandler1つだけをインスタンス化し、代わりにすべてのパイプラインで再利用する必要があります。これは、などの他のクラスにも当てはまりますHashedWheelTimer

Nettyには、パイプライン間で共有する必要のあるクラスがかなりあります。通常、ドキュメントにはこれが明確に記載されています。各クラスのjavadocを調べて、それらをフォローしていることを確認する必要があります。

于 2013-01-20T23:08:49.870 に答える
0

さて、他のアイデアはないようです。
私を少し助けた唯一のことは、タイミングカウンターを5-10秒に増やすことでした。

乾杯!

于 2013-01-24T20:34:06.030 に答える