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);
}

好的,所以基本上 netty nio 功能运行良好且快速。当我设置最大值时。在应用程序中下载速度,我还可以看到带宽使用确实被限制在最大值。等级。我通过以下方式监控带宽使用情况

trafficHandler.getTrafficCounter().getLastReadThroughput();

然而,不幸的是最大。我监控的速度不是我之前设置的,甚至没有接近。例如,我最初(无限制)的下载速度约为 2000 kb/s,然后如上所述将限制设置为 300 kb/s,但实际下载速度在 700-900 kb/之间变化s。

所以我在这种情况下的问题是:我可以看到流量整形器正在做某事,但不是我想要的。我在这里错过了什么吗,例如管道初始化中的任何步骤?

在此先感谢您的帮助!

4

2 回答 2

0

好的,所以似乎没有其他想法。
唯一对我有所帮助的是将计时计数器增加到 5-10 秒。

干杯!

于 2013-01-24T20:34:06.030 回答
0

每次请求新管道时,您getPipeline()都会实例化。GlobalTrafficShapingHandler您应该只实例化一个并在所有管道中重用它。这也适用于其他类,例如HashedWheelTimer.

Netty 有很多类必须在管道之间共享。通常文档清楚地提到了这一点。您应该检查每个类的 javadoc 并确保您遵循它们。

于 2013-01-20T23:08:49.870 回答