谈谈系统性能调优中都需要考虑哪些因素

一、 什么是性能调优?

这个系统好慢、网站又打不开了,太卡了,又没响应了,相信大家都遇到过用户的这种抱怨,此时,说明我们的应用系统出现了性能问题,那么怎么办呢,首先想到的应该是优化一下性能,优化的目标是以用户的期望为依据,因为优化性能没有固定的标准,也很难知道优化的极限在哪里。因此,我们的目标往往是符合用户的期盼即可,也就是说,用户觉得系统的使用满足自己的需求,就算达到了优化的目的。

性能调优就是对计算机硬件、操作系统和应用有相当深入的了解,调节三者之间的关系,实现整个系统(包括硬件、操作系统、应用)的性能最大化,并能不断的满足现有的业务需求。

二、为什么需要性能调优

为什么需要性能调优,其实说到底就两原因:一是为了获得更好的系统性能(就是你现有的系统运行的还不错,但优化一下可以运行的更好)。二是通过性能调优来满足不断增加的业务需求。

通过性能调优,可以用更少的硬件资源,支撑更大量的业务发展,从而达到节省硬件投资的目的。同时,可以在资源有限,不能扩容的情况下,提升系统的响应能力,从而为用户带来更好的使用体验。

三、什么地方需要性能调优

在进行调优的开始,我们需要明白,哪些方面需要调优,这里我们先从大的方面总结一下,主要包括硬件、操作系统、应用程序这三大块,这里的应用程序是指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知识,可访问:奇智云课堂 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/166937.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CNCC 2023 | 大模型全面革新推荐系统!产学界多位大咖精彩献言

随着人工智能领域的不断突破,大模型的潮流已然席卷而来。大模型一跃成为时代的新宠,展现出强大的通用性和泛化能力,为 AI 技术的应用进一步打开了想象空间。与此同时,推荐系统作为大规模机器学习算法应用较为成熟的方向之一&#…

腾讯混元模型

最近腾讯的混元大模型内测,我有幸申请到了一个名额。 身为一个程序员,我想大家最关注的一定是该模型的代码和类代码能力,因为这直接关系到这个模型能帮我们解决多少问题,节约多少时间,提高多少效率。 对此,我针对工作中可能会用到的几个点进行了详细的体验。 先说结论:腾讯混元…

工业基础类IFC—材质和纹理

在我们的 IFC技术交流群(788206534)里,经常会有人提问“如何学习 IFC文档或者其开发”的问题。对于这个问题,我一直没有机会做一个完整的回答,这次我认真回忆了自己关于IFC的学习经历,在此与大家分享。一是…

利用API连接抖音外卖与电商平台和营销系统,实现无代码开发的集成

利用API连接抖音外卖和电商平台 抖音来客,作为抖音生活服务商家经营平台,为商家提供一站式经营服务,其中包括入驻、上品、经营和履约等功能。商家可以通过API调用,实现电商平台和抖音外卖的连接,从而优化运营效率。例…

Java SE——*API API帮助文档

1. API概述 Java中的API可以理解为一本编程字典或者工具包,它包含了许多预定义的类、接口和方法,可以帮助我们更方便地开发Java程序 想象一下,当你要做一个饭菜的时候,你需要食谱和厨具。食谱告诉你需要哪些食材和步骤&#xff…

解决 VS2022 关于 c++17 报错: C2131 表达式必须含有常量值

使用 VS2022 编译 ORB-SLAM3 加载Vocabulary 二进制ORBvoc.bin 时,在 DBOW2 里修改 TemplatedVocabulary.h 代码显示这样的错误: 编译器错误 C2131 表达式的计算结果不是常数 定位到我的代码中: char buf [size_node] ; 原因 : …

基于GATK流程化进行SNP calling

在进行变异检测时,以群体基因组重测序数据为例,涉及到的个体基本都是上百个,而其中大多数流程均是重复的步骤。 本文将基于GATK进行SNP calling的流程写入循环,便于批量分析。 1 涉及变量 1.工作目录work_dir/ 2.参考基因组ref…

SMART PLC数值积分器功能块(矩形+梯形积分法完整源代码)

PLC的数值积分器算法也可以参考下面文章链接: PLC算法系列之数值积分器(Integrator)-CSDN博客文章浏览阅读1.5k次,点赞3次,收藏3次。数值积分和微分在工程上的重要意义不用多说,闭环控制的PID控制器就是积分和微分信号的应用。流量累加也会用到。有关积分运算在流量累加上…

助力安全生产--韩施电气为您提供电动机保护及电机故障解决方

上海韩施电气自成立于2008年,是一家专门从事销售电气自动化设备、电力设备、机电设备的综合型贸易公司,公司自成立以来一直专注于EOCR产品的推广销售和技术服务,成为韩国施耐德EOCR在国内的总代理,并授予代理证书,我们…

uni-app:前端实现心跳机制(全局)+局部页面控制心跳暂停和重新心跳

一、App.vue全局中写入心跳 在data中定义变量heartbeatTimer,便于暂停心跳使用在onLaunch中引用开始心跳的方法startHeartbeat()写入开始心跳方法写入暂停心跳方法写入请求后端刷心跳机制 定义变量 // 在全局设置的心跳机制中添加一个变量来保存定时器的标识 data(…

云计算行业敲门砖—证书盘点

未来10年,都会是云计算技术不断发展变革的时代,这其中会产生非常多的就业机会。有数据统计,未来五年,云计算行业人才缺口达150万,选对了行业,你就成功了一半。 云计算可以考的证书还是很多的,很…

React中StrictMode严格模式,导致开发环境,接口会请求两次或多次( useEffect 请求多次)

问题描述: 我在用 create-react-app时,开发环境,一进页面接口会请求两次或多次。 我在首页 useEffect里 请求一个接口,整个页面就在这里请求这一次接口。但 实际上请求了两次。我检查了代码,确定只调用了一次&#xf…

本地部署 Qwen-14B-Chat

本地部署 Qwen-14B-Chat 1. Qwen-14B 概述2. Github 地址3. 创建虚拟环境4. 安装依赖项5. 快速使用6. 启动 web 演示7. 访问 Qwen 1. Qwen-14B 概述 通义千问-14B(Qwen-14B) 是阿里云研发的通义千问大模型系列的140亿参数规模的模型。Qwen-14B是基于Tra…

快速上手 TypeScript

什么是TypeScript TypeScript 简称 TS ,既是一门新语言,也是 JS 的一个超集,它是在 JavaScript 的基础上增加了一套类型系统,它支持所有的 JS 语句,为工程化开发而生,最终在编译的时候去掉类型和特有的语法…

一些损失函数的学习

CrossEntropy loss 交叉熵是用来衡量两个概率分布之间的差异性或不相似性的度量交叉熵定义为两个概率分布p和q之间的度量。其中,p通常是真实分布,而q是模型预测的分布 交叉熵还等于信息熵 相对熵 这里,x遍历所有可能的事件,p(x)…

从0开始学习JavaScript--JavaScript中的集合类

JavaScript中的集合类是处理数据的关键,涵盖了数组、Set、Map等多种数据结构。本文将深入研究这些集合类的创建、操作,以及实际应用场景,并通过丰富的示例代码,帮助大家更全面地了解和应用这些概念。 数组(Array&…

grafana面板介绍

grafana 快速使用 背景 随着公司业务的不断发展,紧接来的是业务种类的增加、服务器数量的增长、网络环境的越发复杂以及发布更加频繁,从而不可避免地带来了线上事故的增多,因此需要对服务器到应用的全方位监控,提前预警&#xf…

在回调之间共享数据

可以在 App 中为 UI 组件编写回调函数,以指定用户与其交互时的行为方式。 在具有多个相互依赖的 UI 组件的 App 中,回调函数通常必须访问主 App 函数中定义的数据,或与其他回调函数共享数据。例如,如果创建一个具有列表框的 App&a…

vue3按需引入 vite-plugin-style-import 2.0版本报错(解决办法)

报错配置():报错信息解决方法配置 报错配置(): //vite.config.js 部分代码 // 按需自动引入 elementplus 相关样式文件 import styleImport from vite-plugin-style-import// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()…

leetcode:914. 卡牌分组(python3解法)

难度:简单 给定一副牌,每张牌上都写着一个整数。 此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组: 每组都有 X 张牌。组内所有的牌上都写着相同的整数。 仅当你可选的 X > 2 时返回 tru…
最新文章