论软件的性能优化设计<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
摘要:
本文结合我2004年在某市级自来水公司实施的水务综合管理系统的经历,就软件的性能优化设计进行了详细讨论。在系统的设计中针对企业的实际应用环境主要从以下几方面对系统性能进行了优化设计:(1)、选择当前成熟的三层C/S体系结构进行开发,以减轻数据库服务器的负担;(2)、优化数据存取策略以降低系统运行对网络带宽的要求;(3)、对客户端应用进行优化,如减少数据请求量、相关的处理利用多线程进行以提高系统的响应速度。通过以上优化设计,系统满足了企业百万级以上主题数据库处理要求,得到了企业领导与同事的认可与赞许。最后对系统中存在的不足进行了简要的总结,如系统应用服务器端的负载平衡算法过于简单等。
正文:
本人所在的某市级自来水公司经过多年的信息化建设,已经形成了数个应用系统如客户用水工程系统、用水抄表计量系统、营业收费管理系统、欠费催收系统、生产调度系统及客户服务系统等。由于原来的系统都是由各部门或分公司为主导建设的,因业务需求的“局部性”导致系统之间很难共享信息,已经不再适应公司业务发展的需要。为此,公司领导经过研究决定于2004年利用自身技术力量重新开发设计一套水务综合管理系统,我作为技术部的负责人及主要技术骨干,主持并参与了系统的方案选型、系统分析、设计及部分开发工作。
新的水务综合管理系统涉及到客户用水工程、抄表计量、营业收费、欠费催收、用水报障、生产调度、客户服务及网上业务授理等业务,除了满足以上的业务功能需求以外,还要应对如下性能方面的需求。(1)、公司的大部分业务工作都由分散全市各镇区的分公司和营业所完成,相应要求系统适合于分布式的应用环境并提供较好的性能;(2)、对于远程客户端应用来说,必须在较小的网络带宽占用下完成日常业务处理,如分公司都使用512KB的ADSL与总公司连接,但一般的业务处理要求在10秒以内完成;(3)、对于大型的业务如抄表数据的上传、水费的批量计算,报表统计与生成工作等,要求不能影响其它业务的正常进行。
根据公司的业务和管理特点及上述提出的对软件性能方面的要求。在对软件的性能优化设计中我和系统分析人员主要做了以下几方面的工作。(1)、选择当前成熟的三层C/S体系结构进行开发,以减轻数据库服务器的负担;(2)、优化数据存取策略以降低系统运行对网络带宽的要求;(3)、对客户端应用进行优化,如减少数据请求量、相关的处理利用多线程进行以提高系统的响应速度。
工欲善其事,必先利其器。在本系统的开发中我们选择了目前在数据库开发方面非常成熟的Borland公司的Delphi开发工具、负载平衡使用的是其附带的ConnectionBroker、应用服务器连接则采用其MIDAS(DataSnap)技术。由于整个技术方案都使用的是Borland公司的技术,系统具有良好的兼容性与可扩展性的同时,也为系统的性能改善提供了可能。下面将就我在系统性能优化方面所做工作进行详细介绍。
首先,在水务综合管理系统中我们根据企业业务处理分散在异地的特点,采用了三层C/S体系结构,系统的体系结构如下图所示:
通过三层C/S体系结构的设计可以将数据库的访问及业务处理逻辑移到应用服务器进行。由于我司应用特点,我们在应用服务器的设计中主要采取了连接池和负载均衡的技术来提高系统性能。(1)、对于客户的连接我们首先去查找连接池中是否有可用的连接,如果没有才则建立之,否则直接利用连接池中的连接来处理客户端的请求,这样做可以有效降低系统因建立与数据库的连接而带来的性能影响,同时也可以较好的节约系统资源。(2)、针对系统主题数据库容量上百万及日常业务处理繁重的情况,在应用服务器端我们利用Borland公司的VisiBroker组件为系统提供了负载均衡的能力,如在业务处理高峰期系统将会自动通过VisiBroker Agent将客户端的请求转发给空闲的应用服务器,这样极大的提高了应用服务器的响应能力。
其次,优化的数据库存取策略降低了系统的网络数据传输量。各分公司及营业所都采用512KB的ADSL与总公司进行连接,要求系统能够在较低的网络带宽下提供良好的性能表现。为此,我经过与系统分析人员的讨论验证后决定将系统所有的数据库访问请求与处理操作都放在应用服务器端进行,如客户报装、资料修改、客户查询等业务流程的处理客户端只负责将相关的客户资料传给应用服务器,应用服务器进行处理后再将结果显示在客户端从而减轻网络带宽的需求。另外,在系统中我们采用了大量的存储过程对业务进行处理,既简化了业务逻辑变化带来的维护工作量,利用数据库服务器的处理能力也提高了系统的性能。
最后,在客户端主要采取GUI方式与用户进行交互,那么如何利用客户端技术提高系统的性能呢?我们主要使用了以下技术和方法:(1)、使用多线程技术对用户输入进行处理,如用户输入完相关资料在提交时,系统利用线程来进行处理,这样系统主线程就不会因等待处理结果而停顿。另外,系统在查询中也大量使用了线程技术,系统首先利用线程对用户要求的资料进行查询,待结果出来后再交给主线程将结果显示出来。(2)、将抄表数据上传、水费计算、银行代扣及报表生成等大型业务利用作业的形式在系统闲时进行处理,一方面可以缓解业务高峰期的性能压力,另外还可以实现作业的调度提高系统的自动化程度。(3)、在客户端我们还充分利用了TClientDataSet组件中的Clone方法及PacketRecords特性来提高系统处理速度和降低网络流量。如对业务数据的修改就使用了克隆数据集的方式进行处理;(4)、在显示浏览表格或用户查询结果时并不是一下将所有的结果都从服务器提取过来,而是每次利用PacketRecords设置的记录数如每次100条记录,如果用户继续查看则进行“翻页”操作以提高系统的响应速度。
通过综合利用以上技术,系统于2004年底投入试运行时就取得了较好的效果,满足了在系统分析与设计时所提出的性能需求,也得到了公司领导和同事的一致认可与赞许。我也看到了系统存在的不足之处。(1)、对于应用服务器中的负载均衡处理过于简单,在实际的应用环境中容易造成有些应用服务器负载过度而另外一些则十分空闲的情况,对于协同处理时的事务支持也不是很完美。(2)、在利用线程进行处理时虽然能够较好的解决系统性能问题,但也引起了另外一方面的问题,如各线程在对用户界面进行处理时可能造成冲突。通过此次水务综合管理系统的顺利实施为我在中、大型软件性能设计方面积累了较多的经验,为我以后的工作提供了很好的帮助。同时,软件技术的日新月异也促使我要不断更新自己的知识结构,为应对不同体系结构的软件分析与设计做好准备。