性能优化概述
2019-07-21 09:49:25 by冲冲
1. 理解性能优化
计算机的体系结构主要包括三部分:硬件、操作系统、应用程序。其中,硬件有CPU、内存、硬盘等;操作系统有进程、虚拟内存、文件系统、内核等;应用程序有Apache、MySQL、Nginx、Memcahed等。
性能调优就是对计算机硬件、操作系统和应用程序有相当深入的了解,调节三者之间的关系,实现整个系统(包括硬件、操作系统、应用程序)的性能最大化,并能不断的满足现有的业务需求。
性能优化通常着重考虑对操作系统和应用程序的调优。
2. 硬件调优
(1)无论是租用服务器还是够买服务器,都需要选择服务器的硬件配置。选择依据主要是服务器的应用类型,也就是服务器的业务需求。
- 负载均衡:性能要求相对较低,因为只负责转发数据。注意配置一性能突出的网卡。(推荐配置:CPU E5620 x 1、内存 8G、硬盘 500G(RAID5))
- Web 服务器:只处理一些静态页面或者图片等,要求不是很高,主流的服务器都可以。(推荐配置:CPU E5620 x 1、内存 16G、硬盘 500G(RAID5))
- 应用服务器:承担网站功能的实现,在架构中占较重的位置,特别是网站架构中只有一台应用服务器,对CPU、内存、磁盘要求都比较高。(推荐配置:CPU E5620 x 2 内存 32G 硬盘 500G(RAID10))
- 缓存服务器:分为前端页面缓存与后面数据缓存,典型应用分别是Varnish与Memcached,对内存的要求比较大,注意配置较大的内存。(推荐配置:CPU E5620 x 1 内存 32G 硬盘 500G(RAID10))
- 数据库服务器:对CPU、内存、磁盘的要求都很高,某部分的短板都会带来性能问题。(推荐配置:CPU E5620 x 2 内存 64G 固态硬盘 500G(RAID10))
- 备份服务器:要求不高,注意配置足够大的硬盘空间。(推荐配置:CPU E5620 x 1 内存 4G 硬盘 2TB(RAID5))
- 监控服务器:要求不高,普通的PC服务器就可以。(推荐配置:CPU E5620 x 1 内存 4G 硬盘 500(RAID5))
- 其它服务器:具体需要,具体分析。
(2)硬件的性能调优主要包括两方面:
- 上线前(硬件选型):节约成本的前提下把钱花在刀刃上。要求选择合适的硬件配置,这是网站开始构建架构或者项目实施首先要解决的问题。
- 上线后(硬件扩展)
3. 操作系统调优
① 参数调优:《Linux Performance Tuning》(Linux 性能调优)指出,厂商发布的OS,通过保守的默认配置,能够兼容市场绝大部分计算机。但是你可以调节OS的配置参数来获得更高的性能,比如你有个高性能的磁盘,但是如果你的操作系统中一些选项参数默认没有启动的话,就不能实现这些高级功能来提高硬盘性能。
- 操作系统安装优化
- 系统初始化
- 进程调优
- 内存调优
- IO 调优
- 文件系统调优
- 网络调化
② 版本选择:RedHat、CentOS等操作系统在项目实施或网站架构中较多使用,它们是针对企业级应用而开发的操作系统。而Ubuntu之类的操作系统对桌面支持得比较好,所以选择发行版本时得注意(一般企业中用的比较多的是CentOS)。再有就是我们一般不要选择最新的发行版,因为刚出来的发行版相对来说bug还比较多,不要先当“小白鼠”了。比如:刚刚出来CentOS 7 等过一段时间稳定了再使用,目前我们可以选择 CentOS 6.4 或 6.5即可。但是新版本也有很多好处,新版本中加入了很多新功能,去掉许多已知bug,对于一些不重要的应用,可尝试使用新的操作系统。
4. 应用程序调优
应用程序的调优对象通常是Apache、Nginx、MySQL。
(1)MySQL的调优
- MySQL 编译安装优化
- MySQL 配置文件优化
- 索引优化
- MySQL 引擎优化
- 查询缓存优化
- SQL 语句优化
- 优化表类型(MyISAM或InnoDB)
- 锁机制优化
- MySQL 服务器优化(换SSD)
5. 程序代码调优
① Buffer:缓解应用系统上下层组件之间的性能差异,比如通常的 IO Buffer。
② Cache:通常用于读多写少的情况,也是用来缓解应用系统上下层组件之间的性能差异。比如,应用 local cache,Memcached/Redis。
③ Batch:网络或磁盘里的批量操作,通过合并小任务或小请求为大任务大请求,来提升数据传输效率低。比如 TCP 中的 nagle 算法,就是通过合并多个小分组来提升网络传输效率的。
④ Pool:通过减少对象创建,连接建立的开销来提升性能。比如线程池,连接池,对象池。
⑤ Concurrency:通过将串行改为并行,能过有效的降低系统延时。在多核系统中,并行处理才能提升 CPU 使用率。
⑥ Lock Less:多线程访问共享资源时,通常需要加锁。重量级的锁往往引起线程切换,而线程切换非常耗时。那么可以通过优化锁的使用来提升性能,优化锁有两种方法:
A. 通过减小锁的粒度,分离竞争点来减少竞争。比如 Java 里 HashTable 中锁的粒度是整个对象,ConcurrentHashMap 中锁的粒度只是一个 Segment。
B. 在竞争较少的情况下,使用轻量级锁来代替重量级锁,减少线程切换带来的性能消耗,比如自旋锁代替互斥锁。
6. 流程调优
性能优化是一个团队的事情。项目的开发流程主要是:
- 运营部门提出需求
- 产品部门整理需求
- 开发部门开发具体的业务应用
- 运维部门搭建开发环境
- 测试(QA)部门进行项目测试
- 运维部门进行项目上线
- 监控部门进行项目监控
一个项目(业务)存在性能问题,不会只是运维部门需要性能调优而是所有部门一起解决该性能问题。因为需要调优的地方可能出现在产品,也可能出现在程序上(*.php),也可能是业务需要本身就有问题,也可能是运维的环境搭建有问题。但参加性能调优的更多的是开发、运维、测试和监控。
7. 怎样进行性能调优?
(1)性能调优的时期
- 上线前(基本优化):①准备硬件服务器、安装操作系统、搭建开发环境。②开发出项目。③性能调优。
- 上线后(持续优化):对上线后的项目进行性能监控(包括服务器性能监控和服务性能监控) 。
(2)性能调优的具体步骤
- 性能指标 –> 确认衡量标准
- 性能测试 –> 验证性能指标
- 性能分析 –> 找出性能瓶颈
- 性能调优 –> 解决性能问题
- 性能监控 –> 检验调优效果
① 性能指标
- 吞吐量 –> 是单位时间内完成的用户或系统的请求数量。
- 并发数 –> 同时能接受多少用户的访问请求。
- 响应时间 –> 用户发出请求到收到响应的时间间隔。
② 性能测试
③ 性能分析
使用监控工具为性能调优提供数据,找出瓶颈。
硬件:
- 用vmstat、sar、iostat检测是否是CPU瓶颈
- 用free、vmstat检测是否是内存瓶颈
- 用iostat检测是否是磁盘I/O瓶颈
- 用netstat检测是否是网络带宽瓶
操作系统:
- 进程
- 文件系统
- SWAP 分区
- 内核参数调整
应用程序(MySQL):
- mysqlreport 性能分析报告
- mysqlsla 慢查询日志分析
④ 性能调优
- 确定调优目标
- 具体调优步骤
- 检测调优结果
A, 确定调优目标。首先,跟上司明确性能提升的数值(10%、20%、或者更大)。然后,各部门各司其职。通常填补开发部门的代码坑(例如优化SQL查询),性能的提升效率远高于优化OS。
B. 具体调优步骤:
- 如果你不懂系统的参数,你千万不要对系统的参数进行随意的改动,不然你会后悔。
- 每次只对一种系统资源进行系统调试,如CPU、或内存、磁盘。
- 每次改动尽量少的参数设置,推荐每次修改一个设置。
- 分析一项系统资源时,使用多种工具,往往有意想不到的结果。
- 不及胜于过之(宁愿少做一点,不要做过头了,性能已达到要求就不要随意乱动,做好你的监控)。
C. 检测调优结果。每次性能调优后必须对性能进程检测,如Web服务器的ab工具,就是一个很好的检测工具,每次调优后都能看到具体的变化。
⑤ 性能监控
① 服务器性能监控
- CPU 使用率
- CPU 负载
- 内存使用率
- 磁盘I/O
- 网络流量
- 磁盘空间
- 系统进程
② 服务性能监控(MySQL)
- MySQL查询吞吐率,包括Change DB、Select、Insert、Update、Delete
- MySQL持久连接利用率
- MySQL查询缓存空间使用率
- MySQL查询缓存命中率
- MySQL缓存查询数
- MySQL索引缓存命中率
- MySQL索引读取统计
- MySQL连接吞吐率
- MySQL连接缓存命中率
- MySQL并发连接数,包括最大允许连接数、实际最大连接数、当前连接数、活跃连接数、缓存连接数
- MySQL流量统计
- MySQL表统计锁定
参考:
https://blog.csdn.net/zenglinhua1/article/details/79047514
https://blog.csdn.net/hustspy1990/article/details/77834550