写点什么

关于有效的性能调优的一些建议

2015 年 2 月 28 日

只有采用有效的性能调优手段,才能使得性能调优达到事倍功半的效果。近日,个人博客 Liguanglei 中发布了一篇关于有效性能调优建议的文章,该篇文章是作者阅读《性能调优:综合指南》的读书笔记。作者从影响系统性能的算法、算法运行环境与所需资源以及算法和环境资源的交互等因素讲述了性能调优的一些建议。新手能够直接根据这些建议进行系统调优,老手也可以拿来当作调优的参考。现对这些建议进行一个全面的梳理,以供读者参考和学习,具体内容如下:

1. 算法本身的优化

算法优化是性能局部优化的首选, 并常采用各种性能监控软件来度量 CPU 时间、内存占用率、函数调用次数以问题定位,然后实施各种调优方法, 如优化循环、利用空间换时间、采用合适的数据结构等。但是算法本身的优化只能够帮助大家消除一些明显的编程细节引起的瓶颈,尤其单单通过算法优化的手段还不能完全解决性能问题,且具有非常大的难度。

2. 优化运行环境与资源

运行环境与资源包括各种软硬件平台,硬件环境包括 CPU、内存、磁盘以及网络等。最简单且最省事的调优方法是优化硬件资源,使用快速计算资源代替慢速计算资源,提升资源的计算能力。

优化硬件资源的方式包括:

  • 更快的 CPU
  • 更快的本地 IO 设备,比如内存代替硬盘, SSD 代替机械硬盘
  • 加内存减少分页
  • 快的网络 IO 设备,比如使用光纤及专线增加网络带宽,使用万兆千兆网卡代替千兆百兆网卡
  • 快速计算资源代替慢速计算资源,比如快速存储代替慢速存储(属于同类型资源);本地计算换网络传输的优化最好采用压缩传输内容的优化手段(属于不同类型的资源),该方式尽管增加了 CPU 的压缩 / 解压时间,但减少了大量网络传输时间

软件环境包括操作系统、数据库、中间件等。软件环境调优的成本要相对较高, 并且工作量很大,如从 Windows 平台迁移到 Linux 平台、从数据库 A 切换到数据库 B、从 EJB 切换到 Spring 等。这类调优见效快,但受制于预算和硬件本身的限制。由于资源始终是有限的,随着资源的消耗,仍然存在性能瓶颈。

3. 优化算法和资源间的交互

当前各种调优实践最集中的领域是优化算法和资源间的交互,如减少单台服务器 (或单位计算资源) 的处理量、充分利用系统资源、减少不必要的计算、减少不必要的 IO 等。

具体内容如下:

  • 减少单台服务器 (或单位计算资源) 的处理量当在单台机器处理能力已达上限的情况,就需要把压力分散到多台机器上, 从而使每台机器都能获得可接受的延迟或吞吐量。总的优化原则是分而治之,具体维度包括业务、组件边界、访问频率或对系统资源的消耗程度、瓶颈资源等。

    具体内容如下:

    业务:把大应用按业务分成独立的互相合作的系统,如高层的采用 SOA 方式,低层的采用数据库分库方式

    组件边界: Web 服务器、应用服务器、数据库服务器、文件服务器

    对系统资源的消耗程度:采用读写分离的方式

    瓶颈资源: 对数据库进行分表、分片

一旦按上述维度处理好了,大家还可以在所有维度上应用负载均衡,把访问量分散到不同服务器。

  • 充分利用系统资源采用多进程、多线程、异步操作以及负载均衡等手段,其中负载均衡主要做到了防止某台服务器过满和防止某台服务器过闲。

  • 减少不必要的计算次数缓存计算结果,尤其是服务端缓存,以减少不必要的计算。

  • 减少不必要的 IO 次数网络 IO 次数:客户端缓存、CDN 缓存、合并资源以减少请求次数

    磁盘 IO 次数:缓存常用数据,如利用 Redis、Memcached 进行缓存

最后,作者总结指出缓存是减少不必要计算和 IO 的重要手段,缓存的设计主要是根据资源变化频率对资源进行分类,比如动静分离等;其前提是恰当的状态管理、分离无状态的逻辑和有状态的逻辑,但会付出对一致性的一定妥协和运维的复杂为代价。缓存的适用场景包括热点不均衡、有效时间不太短、一致性牺牲程度可接受。作者还指出以上所有优化手段可以组合使用,有冲突时再做权衡。

作者还推荐了一些参阅文章:有关压力测试、负载测试的《重述:性能、容量、负载以及压力测试》和《性能调优技术的几个角度》。此外,有兴趣的读者还可以参阅酷壳陈皓发表的一篇题为《性能调优攻略》的文章。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2015 年 2 月 28 日 08:254719
用户头像

发布了 46 篇内容, 共 46.4 次阅读, 收获喜欢 10 次。

关注

评论

发布
暂无评论
发现更多内容

解析字节算法面试真题,深入探究ArrayList应用原理

小Q

Java 学习 编程 架构 面试

《码出高效:Java 开发手册》“码” 出高效的同时编写出高质量的代“码”。PDF文档资料免费开放下载!

Java成神之路

Java 程序员 架构 面试 编程语言

将原则纳入到架构的生命中

soolaugust

架构 思考 设计

Java进阶文档:彻底搞懂JVM+Linux+MySQL+Netty+Tomcat+并发编程

Java架构之路

Java 程序员 架构 面试 编程语言

云图说 | 云上资源管控有神器!关于IAM,你想知道的都在这里!

华为云开发者社区

服务 权限管理 iam

腾讯高工强烈推荐的“Netty速成手册”原理+应用+调优,带你将知识点一网打尽

比伯

Java 编程 程序员 架构 Netty

一文带你彻底了解大数据处理引擎Flink内存管理

华为云开发者社区

大数据 数据 处理

什么是全场景AI计算框架MindSpore?

华为云开发者社区

人工智能 AI mindspore

一文为你详解Unique SQL原理和应用

华为云开发者社区

数据库 sql unique

从 JMM 透析 volatile 与 synchronized 原理

码哥字节

volatile JVM JMM Java 25 周年 synchronized

熟练掌握Spring Cloud已然成为Java工程师的面试门槛,简历上没写熟悉掌握微服务连面试机会都难得!

Java成神之路

Java 程序员 架构 面试 编程语言

硬肝到秃头!Alibaba强推并发编程笔记我跪了,真的学到好多东西!

Java架构追梦

Java 学习 架构 面试 并发编程

一口气说出四种幂等性解决方案,面试官露出了姨母笑~

不才陈某

Java 分布式 接口

即构实时音视频多中心调度设计

ZEGO即构

80%Java开发者面试都问的SpringBoot你竟不会?看完这些笔记足以

Java架构之路

Java 程序员 架构 面试 编程语言

dubbogo 3.0:牵手 gRPC 走向云原生时代

阿里巴巴云原生

go gRPC 云原生 中间件 dubbo-go

产品策略闭环是个什么环?

万事ONES

项目管理 团队协作 需求管理 需求分析 产品策略

4年Java开发经验裸辞之后闭关修炼2个多月,成功拿下美团、京东、字节跳动(Java架构师)offer。

Java成神之路

Java 程序员 架构 面试 编程语言

五年开发经验裸辞之后投递简历,收到阿里面试邀请四面成功斩获offer,特分享本次阿里面经希望对大家有所帮助。

Java成神之路

Java 程序员 架构 面试 编程语言

我和阿里P7差的不是薪资?而是Redis+微服务+Nginx+MySQL+Tomcat

Java架构之路

Java 程序员 架构 面试 编程语言

耗时一个月整理的97道大厂Java核心面试题出炉,精心整理,无偿分享

Java架构之路

Java 程序员 架构 面试 编程语言

IDEA 文档插件 DocView 版本更新:修改 UI 并支持 IDEA 2020.3 !

程序员小航

idea插件 IntelliJ IDEA 文档生成

为了SpringBoot提交Tomcat执行,我总结了这么多

小Q

tomcat 学习 面试 微服务 springboot

从源码的角度搞懂 Java 动态代理!

Java架构师迁哥

面试被问高并发一脸懵?那是你没看过我整理得高并发回答模板

小Q

Java 学习 面试 高并发 性能调优

倾斜摄影实景三维在智慧工厂 Web 3D GIS 数字孪生应用

一只数据鲸鱼

GIS 数字化 数据可视化 3D渲染 数字工厂

智慧警务可视化平台开发,重点人员管控系统搭建

t13823115967

智慧公安 智慧警务系统开发

朋友突然从某度外包人员摇身一变成为大厂架构师,在我的死缠烂打下他说出了自己的秘密武器。

Java成神之路

Java 程序员 架构 面试 编程语言

好久不见!这份Spring全家桶、Docker、Redis架构大礼包免费赠送

Java架构之路

Java 程序员 架构 面试 编程语言

VACUUM无法从表中删除死元组的三个原因

PostgreSQLChina

数据库 postgresql

太赞了!滴滴开源了一套分布式ID的生成系统...

Java架构师迁哥

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

关于有效的性能调优的一些建议-InfoQ