我正在写一份棘手的申请书。该应用程序运行在64位八核linux机器上
Netty应用程序是一个简单的路由器,它接受请求(传入管道),从请求中读取一些元数据,并将数据转发给远程服务(传出管道)。
此远程服务将向传出管道返回一个或多个响应。Netty应用程序将把响应路由回发起客户端(传入管道)
会有成千上万的客户。将会有成千上万的远程服务。
我正在做一些小规模的测试(十个客户端,十个远程服务),但我没有看到99.9%的预期性能低于10毫秒。我从客户端和服务器端测量延迟。
我使用的是类似于SPDY的完全异步协议。当我们在FrameDecoder中处理第一个字节时,我捕获时间(我只使用System.nanoTime())。我停止计时器之前,我们调用channel.write()。我正在测量从传入管道到传出管道的亚毫秒时间(99.9百分位数),反之亦然。
我还测量了从FrameDecoder中的第一个字节到在(上面)message.write()上调用ChannelFutureListener回调的时间。时间高达几十毫秒(99.9%),但我很难说服自己这是有用的数据。
我最初的想法是我们有一些慢客户。我看了这个频道。isWritable()并在返回false时记录。在正常情况下,此方法不会返回false
一些事实:
有没有一种调试技术,我可以遵循来确定为什么我的Netty应用程序没有运行得像我认为的那样快?
感觉像是频道。write()将消息添加到队列中,而我们(使用Netty的应用程序开发人员)对此队列没有透明度。我不知道这个队列是网络队列、操作系统队列、网卡队列还是什么。无论如何,我正在回顾现有应用程序的示例,我没有看到我遵循的任何反模式
感谢您的帮助/见解
如果使用像System.nanoTime()这样简单的东西,在多线程环境中测量时间是非常困难的。想象一下1核系统的以下情况:
在这种情况下,有两种方法可以正确测量:
>
您可以强制要求在任何时候只使用一个线程。
如果操作系统不干扰,这允许您测量操作的确切性能。因为在上面的例子中,线程B也可以在程序之外。在这种情况下,一种常见的方法是中置干扰,这将为您提供代码速度的估计。
然而,您可以假设,在一个空闲的多核系统上,会有另一个核心来处理后台任务,因此您的测量通常不会中断。将此线程设置为高优先级也有帮助。
您可以使用一个插入JVM的更复杂的工具来实际测量原子执行和执行时间,这将有效地几乎完全消除外部干扰。一个工具是VisualVM,它已经集成在NetBeans中,并且可以作为Eclipse的插件使用。
作为一般建议:使用比内核更多的线程不是一个好主意,除非你知道那些线程会经常被一些操作阻塞。当使用非阻塞NIO进行IO操作时,情况并非如此,因为没有阻塞。
因此,在您的特殊情况下,您实际上会降低客户机的性能,如上所述,因为在高负载情况下,通信将有50%的时间处于暂停状态。在最坏的情况下,这甚至可能导致客户端运行超时,因为无法保证线程何时实际恢复(除非您明确请求公平调度)。
您还没有指定您的Netty版本,但它听起来像Netty 3。Netty 4现在已经稳定,我建议您尽快更新到它。您已经指定需要超低延迟时间,以及数以万计的客户端和服务。这真的混得不好。与OIO相反,NIO本质上具有合理的潜在性。然而,这里的陷阱是OIO可能无法达到您希望的客户数量。尽管如此,我还是会使用OIO事件循环/工厂,看看它是如何运行的。
我自己有一个TCP服务器,它需要大约30毫秒的localhost来发送和接收并处理几个TCP数据包(从客户端打开一个套接字到服务器关闭它的时间来测量)。如果您确实需要如此低的延迟,我建议您切换到TCP,因为打开连接需要SYN/确认字符垃圾邮件,这将使用您的10ms的很大一部分。
Netty创建运行时。getRuntime()。默认情况下,availableProcessors()*2个工作进程。你的情况是16。这意味着您可以同时处理多达16个频道,其他频道将等待,直到您释放ChannelUpstreamHandler。handleUpstream/SimpleChannelHandler。messageReceived处理程序,因此不要在这些(IO)线程中执行繁重的操作,否则可能会阻塞其他通道。
性能分析 StackExchange.Redis 公开了少量的方法和类型来开启性能分析。由于其异步性和多路复用行为,性能分析是一个有点复杂的话题。 接口 性能分析接口是由这些组成的:IProfiler,ConnectionMultiplexer.RegisterProfiler(IProfiler),ConnectionMultiplexer.BeginProfiling(object), Con
使用perf内核性能分析工具,可以分析出很多问题。具体参考perf命令的用法。 还有oprofile可以分析性能。mpstat查看cpu的使用分布。strace查看系统调用情况。参考:http://blog.csdn.net/win_lin/article/details/9377209
SRS支持gprof性能分析。 SRS性能分析 SRS使用gprof分析的步骤如下: 配置:./configure --with-gprof 编译:make 直接启动即可:rm -f gmon.out; ./objs/srs -c conf/console.conf 退出SRS:killall -2 srs # or CTRL+C to stop gprof 生成gprof报告:gprof -b
ObQuote... "One serious obstacle to the adoption of good programming languages is the notion that everything has to be sacrificed for speed. In computer languages as in life, speed kills." — Mike Vani
查看用户在某个时间单位内,进行某个事件的频次分布,以此分析用户对功能的使用情况或依赖程度。 1.1. 1. 功能说明 查看满足特定条件的用户在某个时间单位内,进行某个事件的频次分布; 分析产品或功能对用户来说的粘性程度; 页面如下图: Figure: images 1.2. 2.操作详解 1.2.1. a.选择时间单位、事件和筛选条件 Figure: images 标识 说明 A 统计中使用的时间
当我从Netty 3升级到Netty 4时,性能下降了大约45%。 我在进行性能测试时比较了 Netty 3 和 Netty 4 的线程转储。Netty 4 服务器似乎将更多时间用于写入操作。但是,如果我使用基于Netty 4的客户端和基于Netty 3的服务器,则性能下降仅为5%左右,因此我猜原因是在服务器端,但我找不到原因。 有人能给我建议吗? 代码可以在以下URL中看到:https://co