一、 什么是性能调优?
这个系统好慢、网站又打不开了,太卡了,又没响应了,相信大家都遇到过用户的这种抱怨,此时,说明我们的应用系统出现了性能问题,那么怎么办呢,首先想到的应该是优化一下性能,优化的目标是以用户的期望为依据,因为优化性能没有固定的标准,也很难知道优化的极限在哪里。因此,我们的目标往往是符合用户的期盼即可,也就是说,用户觉得系统的使用满足自己的需求,就算达到了优化的目的。
性能调优就是对计算机硬件、操作系统和应用有相当深入的了解,调节三者之间的关系,实现整个系统(包括硬件、操作系统、应用)的性能最大化,并能不断的满足现有的业务需求。
二、为什么需要性能调优
为什么需要性能调优,其实说到底就两原因:一是为了获得更好的系统性能(就是你现有的系统运行的还不错,但优化一下可以运行的更好)。二是通过性能调优来满足不断增加的业务需求。
通过性能调优,可以用更少的硬件资源,支撑更大量的业务发展,从而达到节省硬件投资的目的。同时,可以在资源有限,不能扩容的情况下,提升系统的响应能力,从而为用户带来更好的使用体验。
三、什么地方需要性能调优
在进行调优的开始,我们需要明白,哪些方面需要调优,这里我们先从大的方面总结一下,主要包括硬件、操作系统、应用程序这三大块,这里的应用程序是指apache、nginx、Mysql、redis等这些应用,其实还有一个很重要的方面,就是业务程序本身的优化,而这个方面需要开发人员根据业务需求进行性能调优,而对于我们运维人员来说接触的比较少而已。
下面我们就重点说一下硬件、操作系统、应用程序这三大块在进行性能优化时需要关注的一些细节和具体的优化思路。
首先,硬件优化主要是对硬件选型、例如CPU、内存、磁盘、网卡等进行合理的选型和配置。
其次,操作系统优化主要包含了操作系统的系统参数、内核参数、进程参数、文件系统、磁盘IO等方面进行合理的配置。
最后,应用程序优化,主要包含对应用软件例如:apache、nginx、redis、Mysql、keepalived、kafka等进行参数方面合理的配置和整合。
下面展开来进行介绍一下这三个方面优化包含的内容。
1、硬件优化
这应该是优化的第一步,在上线一个业务系统之前,首先需要进行的工作就是硬件的采购,那么硬件采购的标准是什么呢,当然是业务系统的运行特点和对资源的占用情况,例如,我们要上线一套redis集群,那么很明显,redis是内存数据库,特点是占用内存会非常大,所以进行采购的时候,要重点考虑的硬件资源就是内存,第一内存要大,第二内存资源要可扩展。由于redis对磁盘读、写并不会很频繁,同时,占用的磁盘空间也不会太大,所以,对磁盘的采购,可以不需要太大的磁盘空间,普通的SAS磁盘即可,如果资金充裕,那么也可以采购SSD磁盘。最后,至于CPU和网卡,一般的双路CPU,加上千兆网卡即可满足要求,无需特殊配置。
那么,如果我们要上线的是一套数据库系统,又该怎么对硬件进行选型呢?这还要从要上线的业务系统的特点入手,数据库系统的特点是比较耗费CPU(SQL硬解析完全靠CPU),也比较耗费内存(大量sql查询和缓冲的时候),对数据安全性要求很高。从这个特点入手,对于数据库服务器,无论你使用的是MySQL、SQLServer还是Oralce,一般情况下,我们认为它需要配置足够快的CPU,足够大的内存,足够稳定可靠的硬盘,同时硬盘需要做RAID,RAID10最好。
我们为什么说需要根据具体的应用来选型呢,一方是什么样的应用需要什么样的硬件配置,还有点很重要就是节约成本,钱得要在刀刃上不该花的钱我们不能乱花,也是为公司节约成本,实现资源利用最大化。
当然,有些朋友说了,硬件没什么选型的,买最好,最高的硬件配置肯定没问题,是的,确实如此,但是,成本是任何公司都需要考虑的,过高的硬件配置,会导致资源浪费,所以,合理、专业的硬件选型是最能体现运维价值的事情。
上面说的这些是业务上线前的硬件选型优化,此外,硬件优化还包含业务上线后的硬件扩展优化,由于我们业务做的越来越好,项目创建初期可能没有完全考虑到会有这么大的性能需要(访问量),所以可能会出现现有的硬件不能满足业务需求,此时我们就需要更换或扩展更好的CPU、更大的内存和更快的磁盘。因此,硬件的可扩展性也许需要考虑到的,特别是在业务上线前的硬件选型,一定要考虑到后期硬件的扩展性,这样在后期可以根据业务量的提升进行实时扩展。
2、操作系统优化
操作系统介于硬件和应用之间,起到一个承上启下的作用,相关的系统参数设置关系到内存、IO的调用机制、文件系统的使用效率、进程调度的优先级,因此,操作系统优化是整个调优过程中最重要的一个方面。
本专栏重点介绍基于Linux操作系统的性能优化,具体的优化包含如下几个方面:
操作系统安装优化
进程管理调优
内存资源调优
IO调度调优
文件系统调优
网络传输调优
性能调优需要在深刻理解硬件资源、操作系统和应用程序的基础上进行。很明显,操作系统位于中间地带,必须掌握Linux是如何处理任务以及与硬件资源进行交互的,下图展示了Linux的内部结构以及与硬件的协助机制。
上图中,在最底层,是硬件设备(Hardware)接着,在硬件设备之上,是Firmware,表示固化到硬件中的程序,然后是driver,即为设备驱动程序,设备驱动程序是一种特定形式的软件程序,旨在实现与硬件设备的交互。没有所需的设备驱动程序,相应的硬件设备将无法工作。
接着,就是操作系统层面的组成部分了,首先是系统内核(kernel),在内核基础之上是系统库、共享库等系统运行必须的库文件(Libraries),在最上层就是系统中运行的应用程序(Applications),也就是我们在系统中安装的各种应用软件,例如MySQL、Samba、FTP等。
了解这个架构非常重要,因为它展示了操作系统的组成以及和硬件之间的依赖关系,例如网卡driver如果出现bug,那么就会影响操作系统中网络的正常运行。例如,在平时运维过程中,经常出现网卡驱动出现bug,导致网卡突然down掉,最后升级网卡驱动,问题才得到解决。
由此可知,操作系统优化是一个从底层硬件到上层软件应用,逐级优化的过程。
3、应用程序
应用程序优化是针对具体的应用进行有目的的优化,优化的依据就是应用系统目前出现的问题,最直观的表现是从日志中发现异常,然后根据日志中的异样进行综合判断得出优化结论。
这其中最容易忽略的方面是代码优化,很多技术人员在应用系统出现性能瓶颈时,第一想到的是硬件不够了,网络带宽不足了,或者内存不足了等等外在原因,而很少从代码层面考虑,是否是代码出现了一些问题呢,所以,当应用系统出现性能瓶颈时,第一步就应该是分析相关的代码,找出相应的瓶颈,再来考虑具体的优化策略。有一些性能问题,完全是由于代码写的不合理,通过直接修改一下代码就能解决问题的,比如for循环次数过多、作了很多无谓的条件判断、相同逻辑重复多次等。
在排除代码层面的问题后,就需要考虑架构层面、参数配置层面等方面的问题,这里以数据库调优为例,当数据库有性能瓶颈的时候,第一想到的应该是SQL调优,先检查是否有不合理的SQL在运行,这里以MySQL为例,最常见的方式是,用自带的慢查询日志或者开源的慢查询系统定位到具体出问题的SQL,然后使用explain、profile等工具来逐步调优,最后经过测试达到效果后上线。
接着,还需要从架构层面进行调优,例如数据库的架构是否合理,架构层面的调优包括读写分离、多从库负载均衡、水平和垂直分库分表等方面,架构层面的调优一般改动较大,但是改动频率没有SQL调优高,此外,还需要的调优手段有连接池调优、数据库参数调优等,总之,调优是一个有点到面,逐渐深入的过程。
最后,通过一个对MySQL数据库进行调优,简单总结一下需要关注的方面有哪些,
MySQL安装编译优化
MySQL配置文件优化
MySQL存储引擎优化
优化表类型(MyISAM或InnoDB)
查询缓存优化
SQL语句优化
锁机制优化
MySQL服务器优化(操作系统参数、存储盘换SSD等)
看到了吧,调优真是一个大话题,随便一个方面,都能发现有很多要优化的内容。
通过上面的对硬件、操作系统、应用程序的具体优化思路的介绍,相信大家对性能优化有了更深层次的了解,下面我们来说一个重要的问题,什么时候来进行性能优化?
四、什么时候需要进行调优?
记得国外有位大师说过一句经典的话:在没有遇到性能问题的时候去优化,那就是灾难。所以,当你系统没有问题的时候,千万不要盲目的去进行调优,因为那真的没有必要,而如果发现了性能问题,开始优化的第一步就是找到性能慢的关键原因,优化必须针对最痛的那个点,与其花80%努力去提升那20%的性能,不如花20%的努力去优化那影响了80%效率的问题点。所以,优化时机和找到优化的通点同样重要。
一般调优分为两个时间段,分别是业务上线前,这个时间点要做的是基础的优化,或者叫通用的优化,包括操作系统优化和应用环境优化等,例如添加时间同步ntpserver、配置ulimit优化系统资源参数等,这些参数属于通用配置,所以在服务器安装完成后,就可以进行优化配置了。
第二个优化阶段是业务系统上线后,在上线前我们已经做过基本的性能优化,可以解决大部分的性能问题,但毕竟上线前的所以测试都是模拟测试并进行相关的性能优化,与上线后的真实环境还是有相当大的区别,所以业务上线后,还需要根据实际情况,根据业务系统日志提示,结合具体的用户量进行第二个阶段有针对性的调优。
五、如何进行性能调优?
上面说了那么多,我们还不清楚如何进行调优,这里说到重点了,要开始进行性能调优,具体步骤大致如下:
确定性能指标
验证性能指标
找出性能瓶颈
解决性能问题
检验调优效果
1、确定性能指标
上面我们已经介绍了,我们优化的目的是为了获得更好的性能,那么性能指标是什么呢?我们怎么来衡量一个业务系统的性能指标呢,这里以一个网站系统为例,对网站平台的性能指标主要有五个,分别是:
吞吐量:
是指单位时间内系统能处理的请求数量,体现系统处理请求的能力,这是目前最常用的性能测试指标。系统吞吐量几个重要参数: QPS、TPS、并发数、响应时间。
QPS:
即Queries Per Second,意思是“每秒查询率”,表示每秒钟能处理多少次请求;注意这里是处理完。具体是指发出请求到服务器处理完成功返回结果。
TPS:
即Transactions Per Second,意思是”每秒处理的事务数“,也就是每秒钟能处理完的事务次数。注意这里”事务“的含义,一个事务是指一个用户向服务器发送请求然后服务器做出反应的过程。用户在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。由此可知,一个事务可能会对应多个请求。
并发数:
系统同一时间处理的请求数或事务数。主要指系统可以同时承载的正常使用系统功能的用户的数量。与吞吐量相比,并发用户数是一个更直观但也更笼统的性能指标。
RT:
即Response Time,表示响应时间,一般取平均响应时间。客户端发一个请求开始计时,到客户端接收到从服务器端返回的响应结果所经历的时间,响应时间由请求发送时间、网络传输时间和服务器处理时间三部分组成。也叫Think Time。
了解了QPS、TPS、并发数与响应时间的概念之后,下面看看他们之间的联系。
QPS = 并发量 / 平均响应时间
并发量 = QPS * 平均响应时间
注意,平均响应时间位是秒,这里有个关键的点就是QPS一定是跟并发量联系在一起的,离开并发数谈QPS是没意义的。
了解这些指标对于调优至关重要,这些指标确定之后,下面就以这个标准作为调优的依据。
2、通过测试验证性能指标
测试系统的性能,需要我们收集系统的QPS/TPS、并发数、响应时间这几个重要的指标。具体步骤是:
确认QPS/TPS、并发数、响应时间这几个值
找到或开发相应的性能测试工具
开始进行性能测试
反馈结果并提交测试报告
如果测试结果没有达到我们预期的目标,下面就需要查找性能瓶颈并进行性能优化。
3、通过性能分析工具找出性能瓶颈
通过上面的性能测试,如果发现网站没有达到我们预期定义的性能目标,这时需要做的就是对现有的服务器进行监控,包括硬件与软件的监控,为性能调优提供有效的性能监控数据。那么,用什么工具能找出性能瓶颈呢,首先是硬件方面的工具,常用的命令如下:
用vmstat、htop、iostat工具检测CPU瓶颈
用free、vmstat、smem工具检测内存瓶颈
用iostat、iotop工具检测磁盘I/O瓶颈
用netstat、mtr、traceroute工具检测网络连通性以及带宽瓶颈
然后,重点关注Linux操作系统方面,主要关注的方向如下:
系统进程状态
文件系统状态
SWAP、物理内存状态
系统内核参数状态
应用程序资源状态(如MySQL、Nginx等)
通过性能监控工具结合操作系统运行状态,基本可以判定是哪里出现了问题。那么接下来就可以进行调优了。
4、开始性能调优,解决性能问题
在进行调优的时候,要遵循如下步骤:
如果你没有彻底弄懂某个系统参数,千万不要对这个参数进行随意的改动,不然你会很难受。
每次只对一个目标参数进行调试,或CPU、或内存、或磁盘,不要一次调整多种参数。
每次改动尽量少的参数设置,推荐每次修改一个设置。
性能已达到要求时就不要在随意改动,并且做好参数的状态监控。**
上面每个步骤都很重要,是调优务必遵循的原则。
5、通过性能监控,验证调优效果
调优参数完成后,性能监控这个很重要,因为通过监控,可以发现和验证我们的调优是否达到了想要的效果,监控包括服务器性能监控和服务的性能监控。下面我们说一说服务器有哪些性能监控指标,必须要监控的指标有如下几个:
CPU使用率
CPU负载
内存使用率
磁盘I/O
网络流量
磁盘空间
系统进程
通过对系统这些软、硬件指标的监控,我们就可以核验之前做的调优设置是否生效,是否达到了理想的效果。
================================================================
更多Linux、云计算、云原生、大数据、docker、k8s知识,可访问:奇智云课堂