多线程应用程序 提升应用性能的“必杀技”

日期: 2010-06-08 作者:Frank J. Ohlhorst翻译:黄永兵 来源:TechTarget中国 英文

过去,服务器和桌面CPU历来都被认为是应用程序性能不佳的罪魁祸首,随着新应用的不断到来,速度越来越慢,CPU负担越来越大,终端用户抱怨不停。应用程序开发人员将性能瓶颈归咎于硬件,而硬件厂商则将责任推卸给不断膨胀的代码。其实大家争论的焦点就是单核,单CPU计算已经不能满足用户的需要。   时光转到今天,CPU制造商已经将CPU的处理能力提高了数倍,现在的服务器和工作站都具备高性能计算能力,多核CPU成为标配,多线程和并行处理成为流行语,部分软件开发商已经利用了这些硬件级新功能,尤以操作系统和虚拟化软件开发商为代表,特别值得一提的是,虚拟化技术从多核和多CPU获得了巨大的好处。

  但是,大多数传……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

过去,服务器和桌面CPU历来都被认为是应用程序性能不佳的罪魁祸首,随着新应用的不断到来,速度越来越慢,CPU负担越来越大,终端用户抱怨不停。应用程序开发人员将性能瓶颈归咎于硬件,而硬件厂商则将责任推卸给不断膨胀的代码。其实大家争论的焦点就是单核,单CPU计算已经不能满足用户的需要。

  时光转到今天,CPU制造商已经将CPU的处理能力提高了数倍,现在的服务器和工作站都具备高性能计算能力,多核CPU成为标配,多线程和并行处理成为流行语,部分软件开发商已经利用了这些硬件级新功能,尤以操作系统和虚拟化软件开发商为代表,特别值得一提的是,虚拟化技术从多核和多CPU获得了巨大的好处。

  但是,大多数传统应用程序,特别是那些内部开发的应用程序,都没有使用多核或多线程编程技术,这意味着最新的CPU也不能给这样的程序带来性能上的飞跃,因此现在人们不再抱怨CPU的处理能力不够用,转而将矛头直指程序开发人员,为什么不好好利用CPU的多核和多CPU的计算能力呢?

  IT管理员和经理们现在正集中精力考虑现有应用程序如何用上最新CPU提供的多核和多CPU,有人说最好是重新开发,但这会耗费多少人力物力,幸运的是,这并不是唯一的办法,新的操作系统和虚拟化技术为应用程序提供了重新编码的机会,目标是使用新的处理器特性,提升应用程序性能,同时保障资源的有效分配,避免系统请求膨胀。

  认识多线程产品

  这一切都归结为多线程 - 创建一个可启动多线程的解决方案(应用程序的不同部分可以同时工作),跨多个核心执行,这个概念本身并不新鲜,在多核普及之前,高端服务器就有多颗CPU,允许开发人员创建对称多进程感知应用程序,实际上,在为SMP优化过的应用程序和多核应用程序之间没有太多的差异,换句话说就是,如果应用程序支持SMP,它在多核CPU上也很可能正常工作,特别是操作系统和虚拟化产品更是如此。

  例如,Windows 7会将SMP进程看成是多核进程,换句话说就是,操作系统不会区分单CPU多核和单核多CPU之间的差别,其它类似的应用程序还包括数据库(如Oracle,MySQL和DB2),SAP应用程序和使用最新开发环境创建的应用程序。

  多线程和处理器无关的应用程序可能会改变服务器购买决策,过去,组织都致力于提高服务器的性能,因此一般会购买昂贵的,多CPU服务器,多核CPU的出现改变了游戏规则,在许多情况下,大型昂贵的服务器可被包含多核CPU的服务器刀片替代,简而言之,一个刀片可以替换传统的四路(4CPU)服务器,但选择服务器不光是看CPU,传统的多CPU服务器一般都整合了容错技术,如多电源,熄灯支持和其它与业务连续性紧密相关的技术。

  真正要解决的问题是如何提高应用程序的性能,对于一些自制应用程序,可能需要重新编码或重新开发,这需要付出昂贵的代价。微软.NET开发环境通过包含在并行语言集成查询(Parallel Language Integrated Query,PLINQ)和任务并行库(Task Parallel Library)中的API简化了多线程编程,在Java编程环境中,多线程编程都属“并行”编程的内容,Java平台天生就支持并行编程,在Java语言和Java类库方面都提供了良好的支持。从Java 5开始,Java平台包含一个高级并行API,它位于java.util.concurrent包中。

  多线程应用的思考

  不过要在应用程序中正确启用多线程仍然需要一些努力和专业知识,也需要一些额外的开发工具,有些工具包括在开发环境中,如PINQ,其它第三方选项,如java.util,另外一些操作系统也包含有用的工具,这些工具通常用来识别不平衡的线程,监控CPU核心使用率和跟踪性能,有些可以用Windows任务管理器实现,如任务管理器可以实时监控CPU利用率,让开发人员对应用程序如何使用线程有一个直观快速的感觉,除了这个基本的分析外,开发人员还可以选择诸如英特尔的高性能计算套装工具,如英特尔的VTune性能分析器和线程检查器。

  但在开始写代码之前,开发人员应该弄清楚几件事情。首先,是否有现成的商业应用程序可代替当前的自制程序,使用商业应用程序可以节省大量的开发时间,特别是当内部设计团队在忙于其它项目,或者内部开发人员不熟悉目标编程语言时。但商业应用程序在维护和定制方面需要的费用往往较高,企业需要有一定的经济承受能力。

  同时也要权衡用户群感受到的性能影响,例如,经过重新编码,应用程序在多核/多线程环境中可能表现得更好,但该应用程序对用户来说却很少使用,这样的投资就没有多大的意义,另一方面,如果很多用户都要求改善某个应用程序的性能,那对这种应用程序就值得投资的。

  开发人员可能会发现,重新编码不是改善处理器利用率的唯一途径,特别是应用程序运行在数据中心的服务器上时,对于托管的应用程序,改善服务器性能和提高资源利用率可能是最好的,一般都是通过升级操作系统和实施虚拟化来实现的,这两种战术都可以运用在多核上,以多线程应用程序运行。使用服务器虚拟化时,应用程序可由单个服务器实例承载,即使在单个线程下,也允许对一个应用程序最大化CPU吞吐量。更重要的是,多个服务器实例可以设置负载均衡,这将有助于应用程序跨虚拟服务器共享CPU核心。较新的操作系统可以使用“处理器亲和度”解决应用程序性能问题,使用处理器亲和度配置选项可将某个特定的处理器分配给特定的应用程序,这是一个相对快速的提高应用程序性能的办法。

  虽然重新编码可能会带来最大的好处,但效益和成本不一定成正比,重新编码需要周密计划,采购硬件和冗长的测试,在大多数情况下,开发人员可能会发现替代解决方案,如虚拟化,可能是一个更经济的办法。

相关推荐