关闭

性能优化概述

标签: 性能优化代码分析性能测试优化
172人阅读 评论(0) 收藏 举报
分类:

如何做性能优化

  1. 确定优化目标
  2. 定位性能瓶颈
  3. 制定优化方法
  4. 测试优化效果

性能优化目标是什么

  1. 吞吐量,越大越好
  2. 延时,越低越好

同样的资源下(前提),吞吐量越高越好,响应时间越低越好。通俗的讲就是:多快好省。

如何定位系统性能的瓶颈呢

  1. 资源分析
  2. 代码分析

资源分析

资源分析以对系统资源的分析为起点,涉及的系统资源有:CPU,内存,磁盘,网卡。通过对资源使用率的分析,判断某项资源是否已经处于或接近极限。

常用的分析工具有:top,free,vmstat,iostat,iotop,netstat。更多工具见下图:

来自 Brendan Gregg 的性能观测工具图

通常资源使用率超过 60% 可能会是问题,为什么呢?因为时间间隔的均值,掩盖了使用率 100% 的短期爆发。

定位瓶颈之后,可以通过增加资源来提升性能,也可以通过优化系统减少资源占用来优化性能。

代码分析

根据2:8原则来说,20%的代码消耗了80%的性能,找到那20%的代码,你就可以优化那80%的性能。

通常使用 Profiler 工具,来收集程序运行时的信息。如果 CPU 是瓶颈,寻找那些消耗 CPU 最多的代码去优化。如果内存是瓶颈,则优化消耗内存最多的代码。

常用的 Profiler,有 Linux 的 OProfile/perf,Java 的 JProfiler/JMC。

常见的性能优化方法

一般性能优化方法有两种:一是,从代码层面优化,提升某个方法的性能,从而提升单机性能;二是,从系统结构层面优化,通过减少无用功,来减少资源消耗。

代码层面优化

  1. Buffer:缓解应用系统上下层组件之间的性能差异,比如通常的 IO Buffer。
  2. Cache:通常用于读多写少的情况,也是用来缓解应用系统上下层组件之间的性能差异。比如,应用 local cache,Memcached/Redis。
  3. Batch:网络或磁盘里的批量操作,通过合并小任务或小请求为大任务大请求,来提升数据传输效率低。比如 TCP 中的 nagle 算法,就是通过合并多个小分组来提升网络传输效率的。
  4. Pool:通过减少对象创建,连接建立的开销来提升性能。比如线程池,连接池,对象池。
  5. Concurrency:通过将串行改为并行,能过有效的降低系统延时。在多核系统中,并行处理才能提升 CPU 使用率。
  6. Lock Less:多线程访问共享资源时,通常需要加锁。重量级的锁往往引起线程切换,而线程切换非常耗时。那么可以通过优化锁的使用来提升性能,优化锁有两种方法:
    • 通过减小锁的粒度,分离竞争点来减少竞争。比如 Java 里 HashTable 中锁的粒度是整个对象,ConcurrentHashMap 中锁的粒度只是一个 Segment。
    • 在竞争较少的情况下,使用轻量级锁来代替重量级锁,减少线程切换带来的性能消耗,比如自旋锁代替互斥锁。

系统架构优化

可以看看:性能优化案例(一):通过修改路由算法提升系统性能

如何做性能基准测试

什么是有效的性能基准测试呢?

基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。有以下特性:
1. 可重复:就像科学实验一样,能够被他人重复,才能被认可
2. 可观测:测试结果能过被分析和理解
3. 可对比:通过对比,才能知道性能优化的效果
3. 符合现实:测量结果符合现实情况
4. 易执行:开发人员能快速地修改系统并测试

基准测试有三种类型:微基准测试,模拟,回放。从下图可以看出来,回放最接近生产环境。
基准测试类型

微基准测试利用人造的工作负载对某类特定的操作做测试,例如执行一种类型文件系统I/O,数据库查询,系统调用。其优势是简单:
1. 对组件的数量和所牵扯的代码路径做限制,能更容易地研究目标,从而快速地确定性能差异的根源。
2. 因为来自其他组件的变化以及尽可能的被玻璃了,所以测试通常是可重复的。

许多基准测试会模拟客户应用程序的工作负载,基于生产环境的工作负载特征,来决定所要模拟的特征。模拟所生成的结果与客户在真实世界所执行的工作负载是相似的。相较于微基准测试。模拟能覆盖复杂系统相互作用的影响,这点是微基准测试可能缺失的。

回放:用真实捕捉到的客户机的操作,来测试性能。有很多分布式服务框架带有复制线上流量,引流到测试机器的功能。

做性能测试时,要多去思考性能数据背后的根本原因,避免因各种外界因素的干扰导致测试失真。

参考资料:

  1. 《性能之巅:洞悉系统,企业与云计算》
  2. Linux Performance
0
0
查看评论

【性能优化】ORACLE数据库性能优化概述

为了保证ORACLE数据库运行在最佳的性能状态下,在信息系统开发之前就应该考虑数据库的优化策略。优化策略一般包括服务器操作系统参数调整、ORACLE数据库参数调整、网络性能调整、应用程序SQL语句分析及设计等几个方面,其中应用程序的分析与设计是在信   分析评价ORACLE数据库性能主要有数据库吞...
  • liu870915
  • liu870915
  • 2016-07-05 16:28
  • 235

mysql性能优化概述

MySQL性能优化   性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间。性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等。本文介绍方法的主要有: 优化查询优化数据库结构优化MySQL服务器     数据库管理人...
  • mydreammaqiang
  • mydreammaqiang
  • 2014-09-09 14:24
  • 437

ORACLE数据库性能优化概述

调整数据结构的设计 这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等。 调整应用程序结构设计 这一部分也是在开发信息系统之前完成,程序员在这一步需要考虑应用程序使用什么样的体系结构,是使...
  • liu870915
  • liu870915
  • 2016-07-05 16:25
  • 204

Oracle 的性能优化概述

 Oracle 的性能优化概述一 个数据库系统的生命周期可以分成设计、开发和成品三个阶段。在设计阶段进行数据库性能优化的成本最低,收益最大。在成品阶段进行数据库性能优化的成本最高,收益最小。数据库的优化可以通过对网络、硬件、操作系统、数据库参数和应用程序的优化来进行。最常见的优化手段就是对...
  • suny_duan
  • suny_duan
  • 2008-11-03 19:20
  • 541

性能优化1-概述

性能优化1-概述 性能优化
  • zhaozhenzuo
  • zhaozhenzuo
  • 2017-07-30 13:00
  • 102

Android开发之性能优化概述

来源:Android开发之性能优化概述 程序能否运行的快速而高效,这在资源有限的移动终端设备上尤其显得重要。因为即使目前最强大的移动终端的计算能力也无法和市场上普通的桌面PC相抗衡。简单地说,有两个原则在资源受限的系统中必须遵守: 不做不必要的事情。 不分配不必要的内存。
  • farsight2009
  • farsight2009
  • 2011-08-05 10:12
  • 859

Java程序的性能优化概述

复杂应用的开发变得相对简单,毫无疑问,它的这种易用性对Java的大范围流行功不可没。然而,这种易用性实际上是一把双刃剑。一个设计良好的Java程序,性能表现往往不如一个同样设计良好的C++程序。在Java程序中,性能问题的大部分原因并不在于Java语言,而是在于程序本身。养成好的代码编写习惯非常重要...
  • xwdengjie
  • xwdengjie
  • 2008-06-24 15:11
  • 294

Java程序性能优化-概述

前言     这两天在看《Java程序性能优化》这本书,将我学到的书上好的东西分享给大家。做过开发的人应该或多或少都碰到过性能问题,遇到性能问题你是怎么做的呢?你能看懂程序的性能吗?本篇给大家讲下如何看懂程序的性能及性能的参考指标。 正题 程序性能的表现方式: 1.执行速度:...
  • zhaodandan19910306
  • zhaodandan19910306
  • 2015-02-28 11:31
  • 782

mysql 性能优化概述

1,硬件优化          a>内存——大内存、大内存位宽,尽量不要用SWAP;          b>硬盘——1500...
  • bravezhe
  • bravezhe
  • 2013-03-19 13:17
  • 573

MySql性能优化概述

1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。 这里最主
  • fangaoxin
  • fangaoxin
  • 2011-08-30 11:23
  • 484
    个人资料
    • 访问:604290次
    • 积分:7751
    • 等级:
    • 排名:第3263名
    • 原创:192篇
    • 转载:6篇
    • 译文:0篇
    • 评论:99条
    博客专栏
    文章分类
    最新评论