`
freeroy
  • 浏览: 73743 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

架构设计之性能设计经验

阅读更多

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

      但架构设计实际是一个平衡设计,在可用性、可扩展性、可维护性、可靠性、高性能等之间做个妥协选择。这些非功能性的需求再加上复杂的功能性需求,同时还要考虑到项目管理上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中就有就有DataReaderDataSetIList等的选择以及转换等,这个根据具体情况而定;还有就是大家常采用的数据的格式化和压缩,以及采用分页,减少传输的数据量;是否可以把一部分处理逻辑放在客户端呢,减少服务端的工作量。界面端也是有很多针对性能优化的考虑,例如绘图,控件重绘都是非常耗资源的,各控件的数据加载和数据绑定性能也各不相同,尽量采用惰性加载,异步加载;初始化和启动速度等都是需要考虑和优化的。


   这些只是我项目经验积累和归纳,水平有限,项目有限,认识更有限,欢迎大家指正补充。

分享到:
评论

相关推荐

    ClickHouse性能之巅:从架构设计解读性能之谜.docx

    ClickHouse 性能之巅:从架构设计解读性能之谜 本文旨在探讨 ClickHouse 的性能优势和设计原理,并结合实际应用场景,介绍如何选择合适的数据库,以及数据库性能的影响因素。ClickHouse 是一种高性能的分布式列式...

    MySQL性能调优与架构设计(pdf高清)

    MySQL性能调优与架构设计MySQL性能调优与架构设计MySQL性能调优与架构设计MySQL性能调优与架构设计MySQL性能调优与架构设计MySQL性能调优与架构设计MySQL性能调优与架构设计MySQL性能调优与架构设计

    MySQL性能调优与架构设计.pdf

    "MySQL性能调优与架构设计.pdf" 本资源摘要信息是关于 MySQL 数据库软件的性能调优和架构设计的知识点。MySQL 是一个流行的开源数据库管理系统,具有简单高效可靠的特点,广泛应用于各个行业。以下是从给定的文件中...

    MySQL性能调优与架构设计.mobi

    本书以 MySQL 数据库的基础及维护为切入点,重点介绍了 MySQL 数据库应用系统的性能调优,以及高可用可扩展的架构设计。 全书共分3篇,基础篇介绍了MySQL软件的基础知识、架构组成、存储引擎、安全管理及基本的备份...

    架构设计架构设计架构设计

    架构设计不仅仅是技术层面的问题,更是解决业务需求、优化系统性能、确保系统可扩展性和稳定性的关键。本篇文章将深入探讨“架构设计”的重要性、原则和方法,以"Beautiful Architecture"为线索,引导我们理解一个...

    MySQL性能调优与架构设计 PDF图书 百度网盘下载链接

    MySQL性能调优与架构设计 PDF图书MySQL性能调优与架构设计 PDF图书

    软件平台架构设计与技术管理之道.docx

    "软件平台架构设计与技术管理之道" 本文总结了软件平台架构设计与技术管理之道的重要性、架构设计要点、架构设计目标与原则、技术管理的关键作用等知识点。 一、软件平台架构设计的重要性 软件平台架构设计是指...

    MySQL性能调优与架构设计

    ### MySQL性能调优与架构设计的关键知识点 #### 一、MySQL基本介绍与历史背景 **1.1 MySQL Server简介** MySQL是由MySQL AB公司(后被Sun Microsystems收购,现属Oracle Corporation)开发的一款开源数据库管理...

    系统架构设计师教程_第5章_软件架构设计

    软件架构设计是软件开发过程中的关键环节,它决定了软件系统的整体结构、组件及其相互关系,以及如何满足功能需求和非功能需求(如性能、安全性、可维护性等)。良好的软件架构设计能够确保系统在面对未来变化时具有...

    开发HarmonyOS应用需要注意应用架构设计、性能优化、安全性、跨设备能力等方面.zip

    开发HarmonyOS应用需要注意应用架构设计、性能优化、安全性、跨设备能力等方面.zip 开发HarmonyOS应用需要注意应用架构设计、性能优化、安全性、跨设备能力等方面.zip 开发HarmonyOS应用需要注意应用架构设计、性能...

    MySQL性能调优与架构设计(中文版)

    第3篇 架构设计篇  第12章 MySQL可扩展设计的基本原则  第13章 可扩展性设计之MySQL Replication  第14章 可扩展性设计之数据切分  第15章 可扩展性设计之Cache与Search的利用  第16章 MySQL Cluster  ...

    架构设计之美迷你版本

    《架构设计之美迷你版本》是一本深入探讨软件架构的书籍,旨在通过简洁的形式展示架构设计的核心理念和实践经验。书中的内容分为四个主要部分,分别涵盖了软件架构的基础概念、实际案例分析、可伸缩性架构设计以及...

    软考系统架构设计师教程(第4版)+历年系统架构设计师考试试题分类精解(综合知识篇)+历年系统架构设计师考试试题分类精解_案例分析与论文篇 三本全集

    《软考系统架构设计师教程...这三本书的组合,为考生提供了系统性的学习资源,既有理论知识的讲解,又有实战经验的分享,有助于考生顺利通过系统架构设计师的考试,并在未来的工作中成为一名优秀的系统架构设计师。

    系统设计规范和模板word+pdf版(架构设计、概要设计、详细设计和数据库设计)

    一个好的架构设计能够保证系统的可扩展性、可维护性和性能。 2. **概要设计文档**:此文档详细描述了系统的主要功能和组成部分,是架构设计的具体化。它包括模块划分、模块间接口定义、数据结构和算法的初步设计。...

    mysql 性能优化与架构设计(word版)

    MySQL性能优化与架构设计是数据库管理员、开发人员和系统管理员关注的重要领域,因为数据库性能直接影响到应用程序的响应速度和整体用户体验。本资料提供了一个全面的视角,深入探讨了如何优化MySQL的性能并进行有效...

Global site tag (gtag.js) - Google Analytics