【性能优化】(1)概述

时间:2021-10-24 23:46:17

性能优化概述


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