【转】架构设计之性能设计经验

性能(performance)设计很是重要,对于服务器端实时交易系统来讲系统性能的重要性不言而喻,对客户端软件来讲性能好的软件也会得到良好的用户体验,从而给用户留下高质量软件的良好印象。所以在进行架构设计中性能设计很是重要。html

      但架构设计实际是一个平衡设计,在可用性、可扩展性、可维护性、可靠性、高性能等之间作个妥协选择。这些非功能性的需求再加上复杂的功能性需求,同时还要考虑到项目管理上tight schedule, low cost, perfect effect的三角难题约束,有时需求还不是很明确,vision不是很清楚,这种状况下系统架构设计真是一门艺术。(可参考笔者另一篇文章《也谈系统设计的一些原则》)

      
单就性能设计来讲,在架构设计初期就必定要把系统性能考虑在内,不然等开发完成之后测试发现性能很差就比较难办,一般要花费较长的时间来诊断性能瓶颈,找到提高的办法,甚至要改变架构,伤筋动骨,每每形成项目延期。因此性能设计首先要有明确的性能目标,根据用户和软件自己的性能要求来设计,合适的就是最好的。其次,要有适当的度量标准和量化的性能指标。最后,要有相应的设计策略,具体的测试方法。

      根据个人经验,影响系统性能主要瓶颈在I/O,包括数据库,socket,网络通讯,文件等,例如频繁查询数据库并返回大量结果集,频繁操做大文件等,这些昂贵的操做会占用大量的CPU时间。拿系统响应和服务一个事务来讲,有几个Round trip,要经过哪几层I/O,如何合理的分配这些I/O的调用,下降没必要要的I/O,都是进行系统性能设计要考虑的。而有些性能问题在初期并不会表现出来,但当拿到实际上线环境下,存在多用户并发、大数据量的状况下就会暴露出严重的问题。因此性能设计时必定要考虑到I/O,同步,并发,资源争用,以及大数据量等因素。一般,I/O操做、网络响应、差的算法、数据库、以及其余的低效的资源使用都会致使低劣的性能。

正则表达式

具体可用的设计策略有:

算法

l        缓存以及缓存层(caching layer)

数据库

    在数据层和应用层之间增长数据缓存层,提供全局数据服务。能够大大减小数据库往返次数。与读取数据库和读取大文件(如XML文件)读取内存的速度无疑要快的多。因此对常常要访问的数据进行缓存是很是好的实践方法。由于如今系统每每内存很大,能够充分利用大内存,而共享内存更能实现数据并发访问

编程

l        多线程(multi-threading)

数组

    如今基本上大部分软件实现多线程或多进程,多线程对单CPU系统还只是顺序利用CPU时间和改善用户体验,多CPU系统才是真正的并行。要注意的是多线程不要争抢访问同一资源而致使部分串行操做,要作到真正的并行操做多线程并不容易。另外,在多线程间同步一个庞大的资源,过多建立线程又没有实现线程池也会致使系统性能降低。

缓存

l        负载平衡(load balancing)

性能优化

    物理上增长地位对等集群服务器(Cluster),经过负载分配算法 分配相应服务器来响应客户端请求。不少系统支持负载均衡,Windows server2003 IIS就支持负载均衡服务,其余如WebLogic, WebSphere也有集群版本支持负载均衡。固然你也能够本身实现负载分配算法。

服务器

l        数据库优化(database optimization

网络

   若是应用程序使用了数据库,能够采起许多步骤来消除访问写入数据时的瓶颈:

Ø         标识潜在的索引,但不要建立过多的索引。

Ø         若是使用 SQL Server,则使用 SQL Server 的事件探查器和索引优化向导。

Ø         监视处理器的使用;理想范围是:75-80% 处理器时间

Ø         使用查询分析器分析查询计划以优化查询。

Ø         使用存储过程优化性能。

Ø         标准化写入的大量数据 —写入较少的数据。

Ø         取消标准化读取的大量数据 —读取较少的数据。

l        文件系统优化

     有时候系统性能很差,但当你关闭写log的功能,性能一会儿提升不少。由于频繁的打开关闭大log文件时I/O开销很是大,一样记录log到数据库也同样。因此,release版尽可能减小写log,或干脆移到裸设备上。

      频繁打开关闭文件对系统性能降低程度是惊人的,能够经过一些变通办法来减小文件的频繁操做。

      例如,原来的缓存持久化实现是保存在XML文件,每次要得到一个配置项,都打开XML文件,经过XPath拿到这个配置项的值,这样效率不高,并且容易把这个XML文件lock住;改进的方法是:经过比较XML文件的修改时间(System.IO.File.GetLastWriteTime)判断是否要再次打开文件,大大提升了效率;另外一个能够改进的方法是:启动时读取全部配置到一个静态的HashTable,每次要得到一个配置项都从内存HashTable获取,在最后或适当的时候持久化到XML。



l        代码性能设计

             在编程实现上,代码性能设计也很重要,一些昂贵的操做会占用大量的资源和CPU时间。例如,字符串相加没用StringBuilder, 频繁建立对象,差劲的排序或递归算法,过多的装箱拆箱,过多的使用反射(Reflection),频繁new HashTable或大的数组,用异常(Catch Exception)用作正常的逻辑,使用复杂的正则表达式,等等。具体能够参考《Effective C++》《Effective C#》等书籍。

l  语言的选择

   另外,语言选择也很重要。好比相对于Java, C#, C++, 大多数OLTP系统用C语言效率高的多,由于在全部的高级程序设计语言中,C程序设计语言的运行效率是公认的。再好比咱们熟悉的一些框架,框架自己是C#或是Java的,但其核心独立模块是C++封装的,这样能够达到最佳的性能。因此对于一些特定的业务需求目标和数据的具体状况,对于核心的模块或算法,能够用特定的语言来实现以得到更好的效率。

l  应用层   

   
 好比应用层和数据库的API,在.Net中就有就有DataReader、DataSet和IList等的选择以及转换等,这个根据具体状况而定;还有就是你们常采用的数据的格式化和压缩,以及采用分页,减小传输的数据量;是否能够把一部分处理逻辑放在客户端呢,减小服务端的工做量。界面端也是有不少针对性能优化的考虑,例如绘图,控件重绘都是很是耗资源的,各控件的数据加载和数据绑定性能也各不相同,尽可能采用惰性加载,异步加载;初始化和启动速度等都是须要考虑和优化的。

相关文章
相关标签/搜索