我正在测试支持连续查询的数据流系统的性能。
这是它的工作原理: - 有一个轮询服务,可以将数据发送到我的系统。 - 当数据传入系统时,每个查询将根据当前时间流的窗口进行评估。 - 当数据传入时,窗口会滑动。
我的问题是,当我向系统添加更多查询时,我预计吞吐量会减少,因为它无法应对数据速率。
但是,我实际上观察到吞吐量增加。
我无法理解为什么会这样,我猜这与JVM分配CPU,内存等的方式有关。
任何人都可以解决我的问题吗?
答案 0 :(得分:4)
大多数Java虚拟机最初都会使用JVM字节码,这比本机机器代码执行稍慢。当JVM发现您正在重复使用代码的特定部分时,它会将该部分代码编译为本机代码(提高其处理速度)。因此,有时压力测试代码,甚至使代码运行更长时间,往往会加速执行而不是减慢速度。 HotSpot JVM(SUN中的默认JVM)是最知名的JVM,它执行本机编译以加速代码执行。
此外,与您过去可能遇到的一些库相比,许多Java库非常成熟。这意味着它们可能在套接字,可重新分配的工作线程的线程池或适用于高吞吐量处理的任何数量的技术上使用非阻塞侦听器而不是分配线程来处理请求。这与JIT(类似HotSpot)JVM的自调整相结合,使Java基准测试成为一项挑战。一般来说,随着时间的推移,事情往往越快,直到某一点。
答案 1 :(得分:2)
与往常一样,答案是剖析。但是,只是提出一个猜测:Hotspot VM在它开始执行它的JIT魔法之前需要相当多的传递。
答案 2 :(得分:2)
您的问题对技术细节非常清楚,但这是猜测。
如果IO流式子系统相当有效(例如基于select
)并且单个客户端不会使网络接口饱和,则许多客户端的存在可能会增加总吞吐量,因为服务器进程可以处理更多数据
答案 3 :(得分:0)
Java应用程序的性能,尤其是微基准测试(对一小段代码进行基准测试)在Java中可能非常困难,因为JVM,JIT编译器和垃圾收集器可能会对性能产生巨大且难以预测的影响该计划。
Java并发和性能大师Brian Goetz撰写了一系列精彩的文章“Java理论与实践”:
答案 4 :(得分:0)
另一个笨症理论:当然,当负载增加时,吞吐量会增加,至少在你达到容量之前。如果平均每秒可以处理100个查询,并且平均每秒发送10个查询,则每秒吞吐量为10个查询。如果平均将负载增加到100qps,则吞吐量(几乎)为100qps。当然,它会变得更糟。你不是靠近容量吗?对不起,如果这是你肯定已经排除的东西。