多处理器多线程软件性能优化

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

多处理器多线程软件性能优化

——JAWS框架案例分析

摘要:随着应用软件日趋复杂,对性能的要求不断提高,多处理器技术成为服务器技术的重要技术支点。然而,多处理器需要有操作系统、编译器以及应用软件架构和工具的支持,否则根本达不到性能提升的目的。本文以JAWS框架为例,首先讨论如何通过通讯模式优化和多处理器优化,提升基于JAWS框架的通讯服务器在多处理器平台下的性能;然后介绍一个基于JAWS框架开发的多播服务器的性能测试环境,通过对性能测试结果进行分析,研究软件架构对多处理器平台下软件性能的影响。

关键字:多处理器多线程性能优化 JAWS

1 引言

回首处理器的发展历程,并行技术从指令级的超标量发展到线程级的超线程或者并发多线程,再到今天处理器级的多内核,总的趋势都没有改变。随着科学计算、政府的大型数据库管理系统、数字医疗领域、通讯、金融、大型企业的ERP、CRM等应用软件日趋复杂,对性能的要求不断提高。如目前的通讯服务器应用,在功能不断增强的同时,还要求更高的吞吐率和更多的用户容量。无论是需求推动技术,还是技术激发了新的需求,多处理器技术已经成为服务器技术的重要技术支点。然而,多处理器需要有操作系统、编译器以及应用软件架构和工具的支持,否则根本达不到性能提升的目的;如果使用多处理器运行单线程软件,性能方面不会得到提升。

本文以JAWS框架为例,讨论在软件架构层面上的上多处理器优化技术,并建立性能测试环境,通过对性能测试结果进行分析,研究软件架构对多处理器平台下软件性能的影响。

JAWS是一种高性能和自适配的、实现了HTTP协议的Web服务器。它还是一个平台无关的应用构架,其他类型的通信服务器可以通过它来构建。

JAWS被构造为框架的框架(framework of frameworks)。整个JAWS构架含有以下组件和构架:并发框架(Concurrency Frameworks)、事件框架(Event Frameworks)、I/O事件(I/O Events)、定时事件(Timing Events)和协议框架(Protocol Frameworks)。各个框架都被构造为一组使用ACE中的组件实现的协作对象。

本文组织如下:第2节描述JAWS框架的通讯模式优化;第3节描述在通讯模式优化基础上进行的多处理器优化;第4节描述测试环境及测试结果分析;第5节是结束语。

2 通讯模式优化

典型的客户/服务器系统采用简单的同步通讯模式:服务器等待客户端发送一个完整的请求消息,处理该请求,然后向客户端发送响应消息。当客户端发送完请求消息,但未接收到服务器的响应消息之前,客户端不会发送下一条请求消息。这种通讯模式容易理解和实现,然而存在效率低的缺点。当服务器因为某种资源的缺乏而导致消息处理过程被阻塞时,客户端却不能发送其它服务器可以并发处理的请求。这种典型的客户/服务器系统包括HTTP、

SMTP、POP、FTP等传统的通信系统。

为了提高服务器吞吐量,一些系统支持采用异步通讯模式:发送请求消息之前,客户端为每一条请求消息设置一个唯一的编号。发送完请求之后,客户端可以不用等待服务器的响应消息而接着发送下一条请求消息。服务器接收到客户端的请求消息后,可以根据资源的紧急情况,合理调度请求消息的处理顺序。当完成一条请求消息的处理之后,在响应消息中设置相应的消息唯一编号,然后发送给客户端。一些现代的通讯系统(如IMAP、SIP等)都支持类似的机制。

如果换个角度(程序的应用层与I/O层之间的交互)分析同步通讯模式和异步通讯模式,则它们之间的区别表现在:(1)对于同步通讯模式,任意时刻应用层与I/O层之间最多存在一个读或写的I/O调用;(2)对于异步通讯模式,同一时刻应用层与I/O层之间可能同时出现读和写操作的I/O调用。

JAWS框架支持多种I/O模式,包括Synch I/O,Reactive I/O和Asynch I/O。其中Reactive I/O是最常用的I/O模式。Reactive I/O模式(如图1)采用ACE_Reactor单件来注册、处理所有的I/O事件,而ACE的Reactor模式实现限制:同一个句柄在同一个时刻只能注册一个事件处理器(ACE_Event_Handler)。对于JAWS框架来讲,意味着同一时刻,协议状态机只能发起一个I/O操作(读或写)。这些限制导致基于JAWS开发的通讯服务器无法实现异步的通讯模式。

图 1 JAWS框架Reactive I/O模式

解决JAWS框架上述问题的办法是分别实例化一个用于读操作的ACE_Reactor对象readReactor和一个用于写操作的ACE_Reactor对象writeReactor(如图2)。所有的读操作都注册到readReactor;而所有的写操作都注册到writeReactor。通过上述优化,我们实现了基于JAWS框架的异步通讯模式。

图 2 JAWS 框架通讯模式优化

通过在双CPU 平台下的性能测试,我们发现经过优化的JAWS 框架比未优化以前的JAWS 框架提升性能10%左右。

3 多处理器优化

对于传统的通讯软件,服务器端应用层逻辑通常是循环在所有的TCP 连接上接收客户端请求消息,然后处理该请求,返回响应消息。还有一类通讯软件(如应用层多播软件、会议服务器及应用网关等)的应用层逻辑则更加复杂,通常在一个TCP 连接上接收消息后,服务器需要进一步将处理后的消息转发到多个其它的TCP 连接。这类的通讯软件往往存在读操作与写操作频率相差悬殊的特点。这种情况下,如果为负责读操作和写操作的Reactor 对象分配同等数量的CPU ,则无法充分利用多CPU 硬件平台。容易出现部分CPU 非常繁忙,而其它CPU 经常出现空闲的状况(如图3)。

I/O

总线

处理写事

件的线程

处理读事件的线程

空闲处理

空闲处理

图 3 多处理器平台CPU 占用示例

解决上述问题的办法是设计读和写Reactor 对象池,每个Reactor 对象拥有独立的线程。

相关文档
最新文档