在Linux机器上对Netty 4.1进行性能调优【JAVA教程】

!
也想出现在这里? 联系我们
信息

在Linux机器上对Netty 4.1进行性能调优,第1张

概述在Linux机器上对Netty 4.1进行性能调优

我正在使用Netty 4.1 Beta3构build一个消息传递应用程序来devise我的服务器,并且服务器理解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(); } }

现在我做了我的应用程序的负载testing,在我的Mac上有以下configuration

networkingperformance是例外。 我在执行我的代码的时候看了一下Jstack,发现netty NIO产生了大约19个线程,而且没有一个似乎等待通道或其他东西。

当epoll_wait返回EPolLERR时如何获得errno?

用于非阻塞,面向行的套接字I / O的C ++库?

当recv块?

普通文件上的Epoll

inotify和epoll之间的区别

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

这是一个2核心15GB的机器。 问题是,我的MQTT客户端发送的数据包似乎需要很长时间才能通过nettypipe道,并且在使用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。 如果是,那么应该对nettyconfiguration做出什么样的改变来处理这个问题或提高性能。

编辑

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

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

AWS上的Java版本是: –

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

谁在epoll_wait()中分配事件/接口ID进行处理

epoll在断开客户端时循环

创buildepoll()能够的对象

一次性*级别* – 触发epoll():EPolLOnesHOT是否意味着EPolLET?

为什么我要在一个全新的套接字上获得EPolLHUP事件?

玩弄工作线程,看看这是否提高了性能。 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。

你将不得不测试自己,哪些数字最适合你的环境。

总结

以上是内存溢出为你收集整理的在Linux机器上对Netty 4.1进行性能调优全部内容,希望文章能够帮你解决在Linux机器上对Netty 4.1进行性能调优所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

© 版权声明
THE END
喜欢就支持一下吧
点赞147 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容