剖析Netty性能

剖析Netty性能,第1张

概述剖析Netty性能

我正在写一个Netty应用程序。 该应用程序运行在64位八核心linux机器上

Netty应用程序是一个简单的路由器,它接受请求(传入pipe道)从请求中读取一些元数据,并将数据转发到远程服务(传出pipe道)。

这个远程服务将返回一个或多个响应到输出pipe道。 Netty应用程序会将响应路由回原始客户端(传入的pipe道)

将有成千上万的客户。 将有成千上万的远程服务。

在linux上守护Java应用程序的最佳方式

任何人都可以帮助我在java中执行命令

JNLP文件自动更新问题

使用getClassLoader()。getResource时,linux机器上的fileNotFoundException

在windows上为Java准确hibernate

我正在做一些小规模的testing(十个客户端,十个远程服务),我没有看到我预计在99.9百分点的低于10毫秒的性能。 我正在测量客户端和服务器端的延迟。

我正在使用与SPDY类似的完全asynchronous协议。 我在处理FrameDecoder中的第一个字节时捕获了时间(我只是使用System.nanoTime())。 在我们调用channel.write()之前,我停止计时器。 我正在测量从inputpipe道到输出pipe道的亚毫秒时间(99.9百分位数),反之亦然。

我还测量了从FrameDecoder中的第一个字节到上面的message.write()调用ChannelFutureListenercallback的时间。 时间高达几十毫秒(99.9百分点),但我很难说服自己,这是有用的数据。

我最初的想法是,我们有一些慢客户。 我看了channel.isWritable()并logging时,这返回false。 这种方法在正常情况下不返回错误

一些事实:

我们正在使用NIO工厂。 我们还没有定制工人的大小

我们已经禁用了Nagel(tcpNoDelay = true)

我们启用了保持活动状态(keepAlive = true)

cpu空闲90 +%的时间

networking空闲

GC(CMS)每隔100秒左右调用一次,时间很短

是否有一个deBUGging技术,我可以按照确定为什么我的Netty应用程序运行速度不如我相信它应该?

感觉就像channel.write()将消息添加到队列中一样,我们(使用Netty的应用程序开发人员)没有透明度。 我不知道队列是Netty队列,OS队列,网卡队列还是什么。 无论如何,我正在审查现有的应用程序的例子,我没有看到任何我反映的反模式

感谢任何帮助/见解

CORBA通信问题

如何在linux上升级Tomcat

如何阅读Java中的蓝牙低功耗RSSI不androID

是否可以安装Robot Framework而不在windows上安装Python?

在windows 7上运行Bash(.sh)

Netty默认创建Runtime.getRuntime()。availableProcessors()* 2工作。 16你的情况。 这意味着您可以同时处理多达16个通道,其他通道将等待您释放ChannelUpstreamHandler.handleUpstream / SimpleChannelHandler.messageReceived处理程序,因此不要在这些(IO)线程中执行繁重的 *** 作,否则可能卡住其他通道。

你没有指定你的Netty版本,但听起来像Netty 3. Netty 4现在是稳定的,我建议你尽快更新。 您已经指定了您想要的超低延迟时间,以及数以万计的客户端和服务。 这不是很好的混合。 与OIO相反,NIO本质上是相当潜在的。 然而,这里的缺陷是,OIO可能无法达到你所希望的客户数量。 无论如何,我会使用一个OIO事件循环/工厂,看看它是怎么回事。

我自己有一个TCP服务器,在本地主机上需要大约30ms的时间来发送和接收和处理几个TCP数据包(从客户端打开一个套接字到服务器关闭时测量)。 如果你真的需要这么低的延迟,我建议你切换TCP由于打开连接所需的SYN / ACK垃圾邮件,这将使用你的10毫秒的很大一部分。

如果使用System.nanoTime()这类简单的东西,则在多线程环境下测量时间非常困难。 想象一个1核心系统的以下几点:

线程A被唤醒并开始处理传入的请求。

线程B被唤醒并开始处理传入的请求。 但是由于我们正在研究1核心机器,所以最终要求线程A暂停。

线程B完成并且执行速度非常快。

线程A重新开始并结束,但是花费了线程B的两倍。因为您实际测量了完成线程A +线程B所花费的时间。

在这种情况下,如何正确测量有两种方法:

您可以强制始终只使用一个线程。


这可以让您测量 *** 作的确切性能, 如果 *** 作系统不干涉。 因为在上面的例子中,线程B也可以在你的程序之外。 在这种情况下,一个常见的方法是将干扰中位数,这将给你一个你的代码速度的估计 。


但是,你可以假设,在一个空闲的多核系统上,将会有另一个核心来处理后台任务,所以你的测量通常不会被打断。 将此线程设置为高优先级也有帮助。

你使用一个更复杂的工具插入到JVM中来实际测量原子执行和时间,这将有效地消除外部干扰。 一种工具是VisualVM ,它已经集成在NetBeans中,并可作为Eclipse的插件使用。

作为一个普遍的建议:使用比core更多的线程并不是一个好主意,除非你知道这些线程会被某些 *** 作频繁地阻塞。 当使用非阻塞NIO进行IO *** 作时,情况并非如此,因为没有阻塞。

因此,在你的特殊情况下,如上所述,你实际上会降低客户的性能,因为在高负载下通信将被搁置达50%。 在最坏的情况下,这可能会导致客户端甚至会超时,因为不能保证线程实际恢复时(除非您明确要求公平的调度)。

总结

以上是内存溢出为你收集整理的剖析Netty性能全部内容,希望文章能够帮你解决剖析Netty性能所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1156875.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存