系统性能调优吐血总结分享:原创

标签: 系统 性能调优 吐血 | 发表时间:2011-06-29 13:44 | 作者:围成 crystal
出处:http://www.cnblogs.com/

概述

Ø 性能优化的思路

首先是较为精准的定位问题,借助于相应的工具包,分析系统性能瓶颈在哪,在根据其性能指标,以及所处于层级决定选择优化的方式方法。在选择优化的方式方法时,大家可以参照以下章节调优方法,架构优化递进,进行正确的,有针对性,有步骤的优化。可能会发现部分指导思想或许有相悖嫌疑,大可不必较真,系统优化的过程本身就是一个不断分离+共享的组合拳,至于具体选择哪种优化方式,根据具体需求来定,但大型应用发展的总体思路是不断分离,在通过索引(非数据库)进行关联起来,

切记:优化一定要对系统进行细致的望闻问切,找到性能问题根源切入点,而不被表象迷糊,对症下药,发现病症所在的医生并不比操作手术刀的医生水平差。本文有工具包一章节,对于需要做优化的人员,需要熟悉,他就是我们诊断所用的CT,例如我们发现内存高了,首先想到不是内存不够用,而是为什么如此消耗内存,用工具看看内存消耗在什么地方,试想之,如在医院,病人告诉医生,他心脏不好,医生就换心脏,那样的话,每个人只要熟练掌握菜刀,都可以做医生

Ø 迭代优化

性能优化未必一次性就能满足的,可能此处瓶颈消失了,系统一旦运转快速后,在其他地方又发现新的性能瓶颈,所以性能优化是一个迭代的工作。直至满足系统需要的性能指标。

Ø 优化的成本

系统性能设计或优化是否可以一步升天,按照最好的分布式架构进行设计和优化呢,单个节点一直也运转及其健康,理论上是可以达到共产国际的,但实际实施层面不可取,必须结合实际的非功能需求进行设计和优化,一则一步到极致的话,系统的成本太过虑庞大,光是性能设计和优化的成本就高于系统本身给客户所提供的价值,也造成研发成本开销过大。二则好像能够架构这样完美系统的人还没诞生。所以一句话也同样适合架构师:有理想而不理想化,废话少扯:具体见法则

调优方法

数据库优化

很多应用,优化DB往往是最直接,最方便,见效最显著的,但并非所有的系统性能都处在瓶颈,或者DB瓶颈解决之后,可能应用层瓶颈,WEB层瓶颈,甚至架构瓶颈都会冒出来了,所以数据库优化十分重要,但往往很多人理解系统优化就是数据库优化,是不全面的。优化角色一般推荐具备较深数据知识的程序员,或者专业的DBA,而不只是会CRUD开发人员

Ø 建立正确的主键,外键,以及索引

Ø 分离原则:读写分离,业务数据分离

a) 分库

b) 分区

c) 分表

d) 分列(将大字段,不常用的隔离到他表,按需查询)

Ø 选择隔离级别:某些对数据一致性要求不高的,可以牺牲部分一致性,降低加锁阻塞

Ø 保证事务简短以及减少不必要的锁机制。

Ø 查询优化规则:

e) 避免表内的相关子查询;

f) 避免排序或为尽可能少的行排序,

g) 做大量数据排序时相关数据放在临时表中

h) .尽量在where后多传查询条件,以减少不必要返回的行

i) .尽量select只需要的字段,以减少不必要返回的列

Ø 分页存储过程:大列表的查询也可以利用分页存储过程达到优化效果。

Ø 利用数据库缓存,视图,临时表等最大程度优化系统,并对存储过程和函数进行必要的优化

Ø 如有需要,可以冗余表中字段,避免联合查询

Ø 如有需要,也可以将表内的大字段分离到单独表中,使其单独查询

Ø 必做多表关联时,尽量过滤不符条件表中数据,减少笛卡尔积计算量

Ø 复杂表表:如实时性要求不高,尽量后台任务计算,避免动态查询

应用层优化

应用层优化侧重于应用层本身的逻辑优化,算法优化,代码优化等,优化的角色可以是熟悉应用的程序员

Ø 优化算法,选择合适高效的算法,降低不必要的递归,循环、多层循环嵌套等计算

Ø 避免申请过多的不必要的内存开销

Ø 降低内存泄露(using,Dispose,弱引用,Finalize)

Ø 使用频率较低的大文件,大对象,大数组等使用完毕后,及时释放

Ø 使用频率较高的大文件,大对象,大数组尽量缓存

Ø 考虑多线程技术

Ø 选择适当的通信方式:长连接,短连接,有以下方式Socket、Remoting、Web Services(Rest,Soap)、WCF、 Named Pipes

Ø 降低应用之间通信次数,例用户认证服务,工作流服务,数据库服务

Ø 降低应用之间传输数据量,不必要传输的不传,少传

Ø 缓存机制:缓存常用的,不易变化的,偶有变化,可以考虑缓存依赖机制

Ø 支持异步计算,降低等待时间

Ø 考虑延迟加载,或者提前加载两种方式

Ø 分离原则:分离业务模块,如分离大I/O模块、分离高耗内存模块,分离高耗宽带模块

Ø 考虑分布式应用,分布式存储,如以上所有仍然搞不定的

Web优化

Web优化偏向于熟悉前端开发的技术人员

Ø 减少http请求

Ø 避免404错误

Ø 在html页面header加入缓存标签

Ø Gzip压缩网页

Ø 减少cookie体积

Ø 使用外部的js和css

Ø 消减js和css

Ø 压缩js

Ø 使用css sprites技术,众多图片合成在一起,通过CSS切分,降低图片传输的频率和数据量

Ø 可以使用静态网页的,避免使用动态网页

架构优化递进

为以示与应用层优化的区别,本文对架构的描述更侧重偏向于物理层面,再次赘述下,涉及变更架构的,需要我们的应用具有良好的拓展性,考验我们的架构师平时的功底,如何刚刚好满足需求以及两三年内业务增量,但并非架构做的越强大,越灵活,越可配置,越易水平拓展就是越好的,其一考虑此应用的投入产出比,换言之,是否值得投入这么多架构设计成本,其二架构设计也是具有一定的时效性的,IT速度太快了,今天的好东西未必是明天的好东西,年轻貌美的姑娘,总有变成老太婆那一天嘛,再者、越灵活的架构,就意味着存在更多的配置项,从某一方面,反而增加了系统的复杂度,最后、很多大型,成熟的应用,也并非一蹴而就,而是通过不断的调整优化,不断变更架构的。圣人也并非天生的,而是不断的总结,提炼,优化,重构

Ø 硬件方面使用高性能的小型机、存储设备。使用极好的网络带宽

Ø 物理分离Web Server和DB Server或者其他服务如:用户认证服务

Ø 缓存

ü 数据缓存机制

ü 页面缓存机制

Ø 物理分离业务模块,单业务单独部署一台服务器

Ø 部署多台Web Server

Ø Web负载均衡-F5

Ø 数据读写分离

Ø 使用消息队列 进行各种应用间进行同步/异步计算

Ø 应用间选择合适的通信方式,通信协议

Ø Web分布式,应用分布式,数据分布式

Ø 分布式的节点使用高性能服务器,小型机群,辅以高速网络带宽等

工具包

Ø 进程管理器,CPU,内存,I/O

Ø 日志:IIS日志,Windows日志,系统本身日志

Ø 使用dotTrace,跟踪方法执行时间,找出速度慢的方法,针对性优化

Ø Sql Profile跟踪SQL耗时情况,针对性优化

Ø HttpWatch跟踪请求耗时,以及发送和收到数据量

Ø Performance Count,使用计数器,统计相关性能指标

Ø CLRProfiler内存泄露检测工具

Ø LoadRunner,压力测试,发现性能瓶颈

其他补充

系统性能调优

源文档下载

作者: 围成 发表于 2011-06-29 13:44 原文链接

评论: 15 查看评论 发表评论


最新新闻:
· 新浪微博发声明回应病毒事件:已向公安机关报案(2011-06-29 18:14)
· 百度发布移动开放平台 推移动框计算(2011-06-29 18:13)
· IE兼顾鱼和熊掌 微软挖苦Chrome/Firefox(2011-06-29 17:09)
· 移动支付公司Square创立8个月 C轮融资1亿美元(2011-06-29 16:00)
· 聚变推进器推进太空旅行(2011-06-29 15:59)

编辑推荐:做Java开发这一年

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

相关 [系统 性能调优 吐血] 推荐:

系统性能调优吐血总结分享:原创

- crystal - 博客园-首页原创精华区
首先是较为精准的定位问题,借助于相应的工具包,分析系统性能瓶颈在哪,在根据其性能指标,以及所处于层级决定选择优化的方式方法. 在选择优化的方式方法时,大家可以参照以下章节调优方法,架构优化递进,进行正确的,有针对性,有步骤的优化. 可能会发现部分指导思想或许有相悖嫌疑,大可不必较真,系统优化的过程本身就是一个不断分离+共享的组合拳,至于具体选择哪种优化方式,根据具体需求来定,但大型应用发展的总体思路是不断分离,在通过索引(非数据库)进行关联起来,.

Mysql Tomcat C3p0 系统性能调优个人总结

- - CSDN博客数据库推荐文章
应用逻辑 就是用c3p0 到数据库查询数据并http返回Json数据. 1 调优前的最初的测试结果   JMeter test result. 这个数据是从程序的log 中打印出的 数据库select语句 中得出的结果(正确与否后面会有讨论). 2 经过IOD系统打印 SQL query 的执行时间 和 tomcat 每个request 的 响应时间,找出 系统瓶颈 是因为一个 select语句 使用了 in:.

浅谈高并发系统性能调优 - 360 OPSDEV

- -
高并发系统的优化一直以来都是一个很重要的问题,下面基于笔者的实践,和大家聊聊高并发系统的一些调优和优化策略. 吞吐量(Throughput) 系统单位时间内处理任务的数量. 延迟(Latency) 系统对单个任务的平均响应时间. 一般来说,考量一个系统的性能主要看这两个指标. 而这两个指标之间又存在着一些联系:对于指定的系统来说,系统的吞吐量越大,处理的请求越多,服务器就越繁忙,响应速度就会慢下来;而延迟越低的系统,能够承载的吞吐量也相应的更高一些.

某证券清算系统的一次性能调优

- - Java - 编程语言 - ITeye博客
上线前,用户预估平均一天交易量约一万条,峰值约两万条. 项目上线第一天,交易量有4万条. 对于这4万条左右的交易信息的清算,花了一个多小时(清算时需要我们系统发指令给清算所,由清算所按照我们系统的指令进行清算,最后把结果通过MQ返回给我们). 用户提出以后交易的峰值可能达到一天5万条. 我们按照2倍的处理能力,定下一天10万条交易信息的处理量的目标.

JVM 性能调优实战之:一次系统性能瓶颈的寻找过程

- - ImportNew
玩过性能优化的朋友都清楚,性能优化的关键并不在于怎么进行优化,而在于怎么找到当前系统的性能瓶颈. 性能优化分为好几个层次,比如系统层次、算法层次、代码层次…JVM 的性能优化被认为是底层优化,门槛较高,精通这种技能的人比较少. 笔者呆过几家技术力量不算弱的公司,每个公司内部真正能够进行 JVM 性能调优的人寥寥无几、甚至没有.

HBase性能调优

- - 学着站在巨人的肩膀上
我们经常看到一些文章吹嘘某产品如何如何快,如何如何强,而自己测试时却不如描述的一些数据. 其实原因可能在于你还不是真正理解其内部结构,对于其性能调优方法不够了解. 本文转自TaoBao的Ken Wu同学的博客,是目前看到比较完整的HBase调优文章. 原文链接:HBase性能调优. 因官方Book Performance Tuning部分章节没有按配置项进行索引,不能达到快速查阅的效果.

hbase性能调优

- - 数据库 - ITeye博客
   1)、hbase.regionserver.handler.count:该设置决定了处理RPC的线程数量,默认值是10,通常可以调大,比如:150,当请求内容很大(上MB,比如大的put、使用缓存的scans)的时候,如果该值设置过大则会占用过多的内存,导致频繁的GC,或者出现OutOfMemory,因此该值不是越大越好.

Hadoop性能调优

- - 开源软件 - ITeye博客
是否对任务进行profiling,调用java内置的profile功能,打出相关性能信息. 对几个map或reduce进行profiling. 非常影响速度,建议在小数据量上尝试. 1表示不reuse,-1表示无限reuse,其他数值表示每个jvm reuse次数. reuse的时候,map结束时不会释放内存.

MapReduce - 性能调优

- - CSDN博客云计算推荐文章
        Hadoop为用户作业提供了多种可配置的参数,以允许用户根据作业特点调整这些参数值使作业运行效率达到最优.         对于一大批MapReduce程序,如果可以设置一个Combiner,那么对于提高作业性能是十分有帮助的. Combiner可减少Map Task中间输出的结果,从而减少各个Reduce Task的远程拷贝数据量,最终表现为Map Task和Reduce Task执行时间缩短.

Java 性能调优

- - 编程语言 - ITeye博客
1.用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用. 但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法. clone()方法不会调用任何类构造函数. 在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单.