快速业务通道

使用Java构造高可扩展应用 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

使用Java构造高可扩展应用

时间:2011-06-16 IBM / 戴 晓君 甘 志 齐 尧 罗 志达

当 CPU 进入多核时代之后,软件的性能调优就不再是一件简单的事情。没有 并行化的程序在新的硬件上可能会运行得比从前更慢。当 CPU 数目增加的时候 ,芯片制造商为了取得最佳的性能/功耗比,降低 CPU 的运行频率是一件非常明 智的事情。相比 C/C++ 程序员而言 , 利用 Java 编写多线程应用已经简单了很 多。然而,多线程程序想要达到高性能仍然不是一件容易的事情。对于软件开发 人员而言, 如果在测试时发现并行程序并不比串行程序快,那不是一件值得惊 讶的事情,毕竟,在多核时代之前, 受到广泛认可的并行软件开发准则通常过 于简单和武断。

在本文中,我们将介绍提高 Java 多线程应用性能的一般步骤。 通过运用本 文提供的一些简单规则,我们就能获得具有高性能的可扩展的应用程序。

为什么性能没有增长?

多核能带来性能的大幅增长,这很容易通过简单的一些测试来观察到。如果 我们写一个多线程程序,并在每个线程中对一个本地变量进行累加,我们可以很 容易的看到多核和并行带来的成倍的性能提升。这非常容易做到,不是吗?在 参考资源 里我们给出了一个例子。然而,与我们的测试相反,我们很少在实际 软件应用中看到这样完美的可扩展性。阻碍我们获得完美的可扩展性有两方面的 因素存在。首先,我们面临着理论上的限制,其次软件开发过程中也经常出现实 现上的问题。让我们看看 图 1 中的三条性能曲线:

图 1. 性能曲线

使用Java构造高可扩展应用 - 编程入门网

作为追求完美的软件工程师,我们希望看到随着线程数目的增长程序的性能 获得线性的增长,也就是图 1 中的蓝色直线。而我们最不希望看到的是绿色的 曲线,不管投入多少新的 CPU,性能也没有丝毫增长。(随着 CPU 增长而性能 下降的曲线在实际项目中也存在)。而图中的红色线条则说明通常的 90-10 法 则并不适用于可扩展性方面。假设程序中有 10% 的计算只能串行进行,那么其 扩展性曲线如红线所示。由图可见,当 90% 的代码可以完美的并行时,在 10 个 CPU 存在的情况下,我们也只能获得大约 5 倍的性能。如果任务中具有无法 并行的部分,那么在现实世界,我们的性能曲线大致上会位于图 1 中的灰色区 域。

在这篇文章中,我们不会试图挑战理论极限。我们希望能解释一个 Java 程 序员如何能够尽可能的接近极限,这已经不是一个容易的任务。

是什么造成了糟糕的可扩展性?

可扩展性糟糕的原因有很多,其中最为显著的是锁的滥用。这没有办法,我 们就是这样被教育的:“想要多线程安全吗?那就加一个锁吧”。想想 Python 中臭名昭著的 Global Intepreter Lock,还有 Java 中的 Collections.synchronizedXXXX() 系列方法,跟随巨人的做法有什么不好吗? 是的,用锁来保护关键区域非常方便,也较容易保证正确性,然而锁也意味着只 有一个进程能进入关键区域,而其他的进程都在等待!如果观察到 CPU 空闲而 软件执行缓慢,那么检察一下锁的使用是一个明智的做法。

对于 Java 程序而言,Performance Inspector 中的 Java Lock Monitor 是 一个不错的开源工具。

使用Java构造高可扩展应用(2)

时间:2011-06-16 IBM / 戴 晓君 甘 志 齐 尧 罗 志达

对一个多线程应用进行调优

下面,我们将提供一个例子程序并演示如何在多核平台上获得更好的可扩展 性。这个例子程序演示了一个假想的日志服务器。它接收来自多个源的日志信息 并将其统一保存到文件系统中。为了简单起见,我们的例子代码中不包含任何的 网络相关代码,Main() 函数将启动多个线程来发送日志信息到日志服务器中。 对于性急的读者,让我们先看看调优的结果:

图 2. 日至服务器调优结果

使用Java构造高可扩展应用 - 编程入门网

在上图中,蓝色的曲线是一个基于 Lock 的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号