如何正确限制Java netty的带宽使用?

时间:2013-01-20 22:20:49

标签: java netty trafficshaping

对于我使用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 /第

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

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

干杯!