性能调优概述
什么是性能调优?(what)
在说什么是性能调优之前我们先来说一下,计算机的体系结构。
如上图,简单来说包括三块:硬件、操作系统、应用程序。其实,性能调优就是调节这些内容,包括硬件、操作系统、应用程序。其中,这三大方面中又包含了若干的内容。
- 硬件包括:CPU、内存、磁盘、网卡、其它……,
- 操作系统包括:进程、虚拟内存、文件系统、网络、其它……,
- 应用程序我就不用说了大家都懂,常见的有Apache、MySQL、Nginx、Memcahed等。
那什么是性能调优呢?
性能调优就是对计算机硬件、操作系统和应用有相当深入的了解,调节三者之间的关系,实现整个系统(包括硬件、操作系统、应用)的性能最大化,并能不断的满足现有的业务需求。
为什么需要性能调优?(why)
下面我们来说一说为什么需要性能调优,其实说到底就两原因:一是为了获得更好的系统性能(就是你现有的系统运行的还不错,但优化一下可以运行的更好)。二是通过性能调优来满足不断增加的业务需求。为了更直观的帮助大家来理解为什么要性能调优?我们分别从三个方面来说:
- 硬件选型(根据服务器应用类型来选购服务器)
- 操作系统发行版本 (选择发行版本)
- 应用程序 (Nginx、MySQL等)
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))
- 其它服务器:至于其它服务器就看各位的具体需要具体分析了。
这下各位知道什么是硬件的性能调优了吧,根据你具体的应用,进行具体分析特别是像MySQL这样的服务器,对CPU、内存、磁盘要求都比较高。
所以,对硬件的性能调优我们必须做到选择合适的硬件配置。这是网站架架构或者项目实施首先要解决的问题!
2.操作系统
有本书叫《Linux Performance Tuning》(Linux 性能调优)这本书是老外写的,作者是 Fernando Apesteguia 。
为什么我们需要性能调优?他得出的结论是这样的:
“当一个发行版打包发送到客户手中的时候,它是为了完全兼容市场中大部分计算机而设计的。这是一个相当混杂的硬件集合(硬盘,显卡,网卡,等等)。
所以Red Hat,SUSE,Ubuntu和其他的一些发行版厂商选择了一些保守的设置来确保安装成功。”
简单说,你的操作系统已经运行的不错了,但是你可以调节它获得更高的性能,比如你有个高性能的磁盘,但你的操作系统中一些选项参数默认没有启动,就不能实现这些高级功能来提高硬盘性能。
还有我想说就是对操作系统发行版选择的问题,RedHat或CentOS这些操作系统在项目实施或网站架构中用的比较多,主要针对企业应用而开发的操作系统。
而Ubuntu之类的操作系统对桌面支持的比较好,所以选择发行版本时得注意。(一般企业中用的比较多的是CentOS)再有就是我们一般不要选择最新的发行版,因为刚出来的发行版相对来说bug还比较多,不要先当“小白鼠”了,
比如:刚刚出来CentOS 7 等过一段时间稳定了再使用,目前我们可以选择 CentOS 6.4 或 6.5即可。
(但新版本也有很多好处,新版本中加入了很多新功能,去掉习已知bug,对于一些不重要的应用,可尝试使用新的操作系统)
3.应用程序
最后,我们得来说说应用程序了,我们先来简单看到一下Apache的MPM配置文件:
prefork 模型:
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
大家可以从上面的配置文件中可以看出,apache 开始启动时启用 8个进程,最小 5个进程,最大20个进程,每个进程限制请求数为256个,最多可以接受请求 4000个,超过这个限制数自动销毁。
worker 模型:
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
在看一下,worker模型的配置文件,默认启动2个进程,每个进程可以接受的请求为150个,每个进程中最小线程数25个,最大线程数为75个,默认线程数25个,每个线程可以接受的请求没有限制为0。
好了,大家看完上面的配置文件,可以看出默认的Apache配置文件,设置的比较保守,只适于一些中小网站,想要获得高性能的Apache服务器还必须进行性能调优,包括apache编译选项,配置文件优化等,具体的调优我们在这里先不细说。
通过我们上面的讲解,我们分别从硬件、操作系统、应用程序,这三个方面入手和大家谈谈为何需要性能调优,相信大家已经知道并了解,相信大家都迫不及待了吧。
嘿嘿,我们先不急还有很多问题没有说清楚,下面我们和大家来说说,什么时候需要性能调优?
什么时候需要性能调优?(when)
一般分为两个时间段:
- 上线前(基本优化)
- 上线后(持续优化)
为什么这样说呢,一般我们在项目实施到项目上线这段时间,不但要准备硬件服务器、安装操作系统、环境搭建,还有个很重要的问题就是进行性能优化,包括操作系统优化和应用环境优化等,我称上线前的优化为基本优化也称为经验优化。
根据你做过的项目和你工作中的经验对上线前的服务器或架构进行基本的性能优化来满足业务需求。
再有就是项目上线后的优化,在上线前我们已经经过基本的性能优化,解决大部分的性能问题,但毕竟上线前的所以测试都是模拟测试并进行相关的性能优化,与上线后的真实环境还是有相当大的区.
我们首先要做的就是对上线后的项目进行性能监控包括服务器性能监控和服务性能监控。
服务器性能监控包括:
CPU使用率、CPU负载、内存使用率、磁盘I/O、磁盘空间使用率、网络流量、系统进程等,服务性能监控包括apache、nginx、mysql。
以上架构中所有的服务都需要进行性能监控,一但发现有问题我们都得去进行性能优化,在这个过程中我称为持续优化也称为监控优化。下面我们来具体的说一下,具体什么地方需要性能调优?
什么地方需要性能调优?(where)
在上面我们说性能调优只说一些大的方面,包括硬件、操作系统、应用程序这三大块。
其实还有一块就是程序本身的优化,开发人员根据需求开发出来的程序本身就需要性能优化,但对于我们运维人员来说接触的比较少而已。下面我们就来看看这三大块:
- 硬件 (CPU、内存、磁盘、网卡)
- 操作系统(进程、文件系统、内核 ……)
- 应用程序(Nginx、MySQL ……)
1.硬件
硬件优化一般也包括两块:
- 上线前(硬件选型)
- 上线后(硬件扩展)
一般项目搭建时都需要根据具体的应用进行硬件配置选型,在这方面需要一定的运维经验刚接触的朋友可以在这方面有点欠缺,但没事一般做过一两个项目以后,对硬件配置选型也就会了。
但有个不成文的经验,硬件配置还是越高越好。
我们为什么说需要根据具体的应用来选型呢,一方是什么样的应用需要什么样的硬件配置,还有点很重要就是节约成本,钱得要在刀刃上不该花的钱我们不能乱花,也是为公司节约成本,实现资源利用最大化。
上面我们说的是项目搭建初期,你运气比较好项目一开始你就在这边。
一般有经验的运维工程师在硬件选型是不会有问题的,所以我们在性能优化时就不考虑硬件这块,从理论上讲我们服务器硬件配置一般不会出现在这种性能问题上。
但是呢,由于我们业务做的越来越好,项目创建初期没有考虑到会有这么大的性能需要(访问量),现在有的硬件不能满足业务需求,所我们这时需要更换更好的CPU、更大的内存和更快的磁盘。
至于如何找出硬件是性能瓶颈我们先在这里不细说,在后面的文章中我们将会细说。最后我们来看一张硬件架构图,能帮你更好的理解硬件优化,如下图(Dell R 710 架构):
2.操作系统
下面我们来说操作系统,其实绝大部分的优化都在操作系统和应用程序的优化,除了上线前的硬件选型和上线后的硬件扩展,下面我们就来看看操作系统优化包括哪些:
- 操作系统安装优化
- 系统初始化
- 进程调优
- 内存调优
- IO 调优
- 文件系统调优
- 网络调化
下面我们来看一张图,可以更直观的帮且我们理解,如下图:
3.应用程序
最后我们来说说应用程序优化,这里我们来说一下MySQL优化例子,让大家更直观的了解。
- MySQL 编译安装优化
- MySQL 配置文件优化
- 索引优化
- MySQL 引擎优化
- 查询缓存优化
- SQL 语句优化
- 优化表类型(MyISAM或InnoDB)
- 锁机制优化
- MySQL 服务器优化(换SSD)
通达上面的对硬件、操作系统、应用程序的具体说明相信,大家对性能优化有了更深层次的了解,下面我们来说一个重要的问题,什么人来进行性能优化?
什么人来进行性能调优?(who)
一说起性能优化我们第一个想到的是运维工程师,他们来进行优化。
其实我想说,这么说是片面的性能优化不仅仅是运维工程师的事。
其实呢,性能优化是一个团队的事。我为什么这么说呢?
下面我们就来说一下,大家想啊一公司需要做一项目,我们就拿最常见的电子商务中商城的项目来说吧,公司确认由于业务需要我们需要在网上做一个建材商城,那项目的具体流程是什么呢?可能不是很详细,但大体过程是样的:
- 运营提出需求
- 产品整理需求
- 开发开发具体的业务应用
- 运维搭建开发环境
- QA 进行项目测试
- 运维进行项目上线
- 监控进行项目监控
开发一个具体的应用需要运营部、产品部、开发部、运维部、QA (测试)、监控等所以有部门的参加。
同样的一个项目(业务)存在性能问题,不会只是运维部门需要性能调优而是所以部门一起解决这个性能问题,这是缺一不可的。
可能出现在产品,也可能出现在程序上(*.php),也可能是业务需要本身就有问题,也可能是运维的环境搭建有问题。但参加性能调优的更多的是开发、运维、测试和监控。
怎么样进行性能调优?(How)
下面进入正题了我们说一说怎么进行性能调优,具体步骤如下:
- 性能指标 –> 确认衡量标准
- 性能测试 –> 验证性能指标
- 性能分析 –> 找出性能瓶颈
- 性能调优 –> 解决性能问题
- 性能监控 –> 检验调优效果
1.性能指标
上面我们说了,我们优化的目的是为了获得更好的性能,那么性能指标是什么呢?我们怎么样来衡量,一般衡量一个项目(这里指的网站)的指标有三个:
- 吞吐量 –> 是单位时间内完成的用户或系统的请求数量。
- 并发数 –> 同时能接受多少用户的访问请求
- 响应时间 –> 用户发出请求到收到响应的时间间隔。
2.性能测试
我们做产品或者说项目(更直白的说是网站)目的是为了让用户使用,我们得先站在用户的角度分析一下,用户需要关注哪些性能。
对于用户来说,当点击一个按钮、链接或发出一个操作指令,到系统把请求处理好发给用户并用网页的形式展现出来为止,这个过程中所消耗的时间是用户对这个网站性能的直观印象。
也就是我们所说的响应时间,当响应时间较小时,用户体验相对来说就会好,当然用户体验的响应时间包括个人主观因素和客观响应时间。
在网站开发与搭建时,我们就需要考虑到如何更好地结合这两部分达到用户最佳的体验。用户关注的是用户操作的相应时间。
其次,我们站在运维的角度考虑需要关注的性能点。再次,我们得站在开发(设计)人员角度去考虑网站性能。最后,由QA测试与反馈我们网站性能。
经过上述的说明,我们来测试系统的性能,需要我们收集系统的吞吐量、并发数、响应时间这三个重要的指标。具体步骤是:
- 确认吞吐量、并发数、响应时间这三个值
- 找到或开发相应的性能测试工具
- 进行性能测试
- 反馈结果并提交测试报告
结果,有两个一种是达到我们预期的性能目标,这样我们就不需要性能优化任务完成可以交给运维上线,只需要进行相关的性能监控,方便上线后进行性能优化。
另一种是没有达到我们预期的目标,我们要查找性能瓶颈并进行性能优化。
3.性能分析
通过上面的性能测试,我们发现网站没有达到我们预期定义的性能目标,这时我们需要做的就是对现有的系统(服务器)进行监控,包括硬件与软件监控,为性能调优提供有效的性能监控数据。
下面我们重点来说一下,用什么工具能找出性能瓶颈:
硬件:
- 用vmstat、sar、iostat检测是否是CPU瓶颈
- 用free、vmstat检测是否是内存瓶颈
- 用iostat检测是否是磁盘I/O瓶颈
- 用netstat检测是否是网络带宽瓶
操作系统:
- 进程
- 文件系统
- SWAP 分区
- 内核参数调整
应用程序(MySQL等):
- mysqlreport 性能分析报告
- mysqlsla 慢查询日志分析
4.性能调优
- 确定调优目标
- 具体调优步骤
- 检测调优结果
确定调优目标
我们性能优化的目标是网站性能提高10%还是20%,不能老大说今天你给我优化一下网站性能,你就能使用网站性能翻一倍。
首先,你要问他我们需要达到一个怎么的目标。
然后,我们要了解一下整个环境(架构)包括代码(当然你需要了解一下业务逻辑,大致了解一下,肯定没坏处),有时间多和开发沟通一下,问问代码中有多少坑要填,这很重要。
往往他们优一下代码中的SQL查询,比你优化系统多少天都来的有效果,哈哈。
具体调优步骤
- 如果你不懂系统的参数,你千万不要对系统的参数进行随意的改动,不然你会后悔。
- 每次只对一种系统资源进行系统调试,如CPU、或内存、磁盘。
- 每次改动尽量少的参数设置,推荐每次修改一个设置。
- 分析一项系统资源时,使用多种工具,往往有意想不到的结果。
- 不及胜于过之(宁愿少做一点,不要做过头了,性能已达到要求就不要随意乱动,做好你的监控)。
检测调优结果
每次性能调优后必须对性能进程检测,如Web服务器的ab工具,就是一个很好的检测工具,每次调优后都能看到具体的变化。
5.性能监控
性能监控这个很重要,具体包括服务器性能监控和具体服务的性能监控。下面我们说一说具体有哪些性能监控指标:
服务器的性能监控
- CPU 使用率
- CPU负载
- 内存使用率
- 磁盘I/O
- 网络流量
- 磁盘空间
- 系统进程
服务的性能监控(MySQL)
- MySQL查询吞吐率,包括Change DB、Select、Insert、Update、Delete
- MySQL持久连接利用率
- MySQL查询缓存空间使用率
- MySQL查询缓存命中率
- MySQL缓存查询数
- MySQL索引缓存命中率
- MySQL索引读取统计
- MySQL连接吞吐率
- MySQL连接缓存命中率
- MySQL并发连接数,包括最大允许连接数、实际最大连接数、当前连接数、活跃连接数、缓存连接数
- MySQL流量统计
- MySQL表统计锁定