我正在使用Netty 4.1 Beta3构建一个消息传递应用程序来设计我的服务器,并且服务器理解MQTT协议.

这是我的MqttServer.java类,它设置Netty服务器并将其绑定到特定端口.

EventLoopGroup bosspool=new NioEventLoopGroup();
        EventLoopGroup workerPool=new NioEventLoopGroup();

        try {

            ServerBootstrap boot=new ServerBootstrap();

            boot.group(bosspool,workerPool);
            boot.channel(NioServerSocketChannel.class);
            boot.childHandler(new MqttProxyChannel());

            boot.bind(port).sync().channel().closeFuture().sync();

        } catch (Exception e) {
            e.printstacktrace();
        }finally {          
            workerPool.shutdownGracefully();
            bosspool.shutdownGracefully();
        }
    }

现在,我在Mac上对我的应用程序进行了负载测试,具有以下配置

网络性能非常出色.在执行我的代码时我查看了jstack,发现netty NIO产生了大约19个线程,并且它们似乎都没有等待等待通道或其他东西.

然后我在linux机器上执行了我的代码

这是一款2核15GB机器.问题是我的MQTT客户端发送的数据包似乎需要很长时间才能通过netty管道,并且在获取jstack时我发现有5个netty线程,所有这些都被困在这个

."nioEventLoopGroup-3-4" #112 prio=10 os_prio=0 tid=0x00007fb774008800 nid=0x2a0e runnable [0x00007fb768fec000]
        java.lang.Thread.State: RUNNABLE
             at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
             at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
             at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79)
             at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
             - locked <0x00000006d0fdc898> (a 
io.netty.channel.nio.SelectedSelectionKeySet)
             - locked <0x00000006d100ae90> (a java.util.Collections$UnmodifiableSet)
             - locked <0x00000006d0fdc7f0> (a sun.nio.ch.EPollSelectorImpl)
             at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
             at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:621)
             at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:309)
             at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:834)
             at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
             at java.lang.Thread.run(Thread.java:745)

这是一些与linux机器上的epoll相关的性能问题.如果是,则应对netty配置进行哪些更改以处理此问题或提高性能.

编辑

本地系统上的Java版本是: –

java版“1.8.0_40”
Java(TM)SE运行时环境(版本1.8.0_40-b27)
Java HotSpot(TM)64位服务器VM(内置25.40-b25,混合模式)

AWS上的Java版本是: –

openjdk版“1.8.0_40-internal”
OpenJDK运行时环境(build 1.8.0_40-internal-b09)
OpenJDK 64位服务器VM(内置25.40-b13,混合模式)

解决方法

使用工作线程来查看是否可以提高性能. NioEventLoopGroup()的标准构造函数创建默认的事件循环线程数量:
DEFAULT_EVENT_LOOP_THREADS = Math.max(1,SystemPropertyUtil.getInt(
            "io.netty.eventLoopThreads",Runtime.getRuntime().availableProcessors() * 2));

如您所见,您可以将io.netty.eventLoopThreads作为启动参数传递,但我通常不这样做.

您还可以在NioEventLoopGroup()的构造函数中传递线程数.

在我们的环境中,我们拥有接受来自数百个客户端的通信的netty服务器.通常一个boss线程来处理连接就足够了.工作线程数量需要缩放.我们用这个:

private final static int BOSS_THREADS = 1;
private final static int MAX_WORKER_THREADS = 12;
EventLoopGroup bossGroup = new NioEventLoopGroup(BOSS_THREADS);
EventLoopGroup workerGroup = new NioEventLoopGroup(calculateThreadCount());
private int calculateThreadCount() {
    int threadCount;
    if ((threadCount = SystemPropertyUtil.getInt("io.netty.eventLoopThreads",0)) > 0) {
        return threadCount;
    } else {
        threadCount = Runtime.getRuntime().availableProcessors() * 2;
        return threadCount > MAX_WORKER_THREADS ? MAX_WORKER_THREADS : threadCount;
    }
}

所以在我们的例子中我们只使用一个boss线程.工作线程取决于是否已发出启动参数.如果没有,那么使用核心* 2但不超过12.

您必须测试自己,尽管哪些数字最适合您的环境.

java – Linux机器上Netty 4.1的性能调优的更多相关文章

  1. HTML5实现直播间评论滚动效果的代码

    这篇文章主要介绍了HTML5实现直播间评论滚动效果的代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. 前端监听websocket消息并实时弹出(实例代码)

    这篇文章主要介绍了前端监听websocket消息并实时弹出,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. HTML5之消息通知的使用(Web Notification)

    通知可以说是web中比较常见且重要的功能,私信、在线提问、或者一些在线即时通讯工具我们总是希望第一时间知道对方有了新的反馈。本篇文章主要介绍了HTML5之消息通知的使用(Web Notification),感兴趣的小伙伴们可以参考一下

  4. HTML5中的Web Notification桌面通知功能的实现方法

    这篇文章主要介绍了HTML5中的Web Notification桌面通知功能的实现方法,需要的朋友可以参考下

  5. HTML5仿微信聊天界面、微信朋友圈实例代码

    小编最近开发一个基于html5开发的一个微信聊天前端界面,功能很全面,下面小编给大家分享实例代码,需要的朋友参考下

  6. HTML5的postMessage的使用手册

    HTML5提出了一个新的用来跨域传值的方法,即postMessage,这篇文章主要介绍了HTML5的postMessage的使用手册的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. ios – Testflight无法安装应用程序

    我有几个测试人员注册了testflight并连接了他们的设备……他们有不同的ios型号……但是所有这些都有同样的问题.当他们从“safari”或“testflight”应用程序本身单击应用程序的安装按钮时……达到约90%并出现错误消息…

  8. xcode找不到匹配的配置文件

    我有一个AdhociOS应用程序,它给了我“在xcode6中找不到匹配的配置文件”,我创建了一个Adhoc配置文件,下载它,双击它并在General–Identity下选择了一个团队.但我接着得到了那条消息,并尝试使用“修复问题”按钮没有帮助.在构建设置–供应配置文件–发布我有“自动”.任何人都可以帮助我,我完全迷失了……

  9. ios – Reactive Cocoa – 以编程方式设置文本时不会调用UITextView的rac_textSignal

    我正在实现一个聊天UI,并使用ReactiveCocoa根据用户的类型调整聊天气泡的大小.目前,我正在基于textview的rac_textSignal更新UI的布局.一切都很好–除了一点:当用户发送消息时,我以编程方式清除文本字段:…我是否需要拥有一个持有currentTypedString的Nsstring,并在该字符串更新时驱动UI更改?

  10. ios – 当我关闭应用程序时,我从调试器获得消息:由于信号15而终止

    我怎么能解决这个问题,我不知道这个链接MypreviousproblemaboutCoredata对我的问题有影响吗?当我cmd应用程序的Q时,将出现此消息.Messagefromdebugger:Terminatedduetosignal15如果谁知道我以前的问题的解决方案,请告诉我.解决方法>来自调试器的消息:每当用户通过CMD-Q(退出)或STOP手动终止应用程序(无论是在iOS模拟器中还是

随机推荐

  1. java – Netty增加ChannelBuffer大小

    您好我有一个NettyServer,其处理程序应该接受字符串.它似乎只接收最多1024个字节的内容.如何增加缓冲区大小.我已经尝试过了没有成功.处理程序如下}解决方法你在使用UDP吗?

  2. java – 使用SPDY和Netty

    此外,当服务器不支持SPDY并且通道回退到标准SSL连接时,该功能如何?

  3. java – Linux机器上Netty 4.1的性能调优

    我正在使用Netty4.1Beta3构建一个消息传递应用程序来设计我的服务器,并且服务器理解MQTT协议.这是我的MqttServer.java类,它设置Netty服务器并将其绑定到特定端口.现在,我在Mac上对我的应用程序进行了负载测试,具有以下配置网络性能非常出色.在执行我的代码时我查看了jstack,发现nettyNIO产生了大约19个线程,并且它们似乎都没有等待等待通道或其他东西.然后我在

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

    在此先感谢您的帮助!

  5. java – Netty 4多客户端

    我需要使客户端能够进行很多连接.我使用Netty4.0.不幸的是,所有现有的示例都不显示如何创建大量的连接.这是正确的决定吗?

  6. 如果JVM GC仍然存在,为什么需要手动处理Netty ByteBuf的引用计数?

    根据NettyinActionv10的说法,引用计数用于处理ByteBuf的汇总.但是JVM不知道netty引用计数,所以JVM仍然可以使用ByteBuf.如果是这样,为什么还需要关心引用计数和手动调用release()方法?

返回
顶部