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

news2024/9/22 12:25:20

一、 什么是性能调优?

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

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

二、为什么需要性能调优

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

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

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

在进行调优的开始,我们需要明白,哪些方面需要调优,这里我们先从大的方面总结一下,主要包括硬件、操作系统、应用程序这三大块,这里的应用程序是指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.coloradmin.cn/o/1229121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

磁钢的居里温度和工作温度

你知道吗,磁体在超过一定温度时会永久的失磁,不同的磁体能够承受的最大工作温度是不同的,那么与温度相关的指标有哪些?如何根据工作温度来选择合适的磁钢?今天我们就来解答一下这些问题。 居里温度 说到温度与磁性关…

深入分析高性能互连点对点通信开销

今天分享最近阅读的一篇文章:“Breaking Band,A Breakdown of High-Performance Communication”,这篇文章发表在ICPP 2019会议。由加州大学欧文分校和ARM公司合作完成。从题目中可以看到,这篇文章是一篇评测型的文章,…

大厂秋招真题【单调栈】Bilibili2021秋招-大鱼吃小鱼

文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出说明 示例二输入输出说明 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 小明最近喜欢上了俄罗斯套娃、大鱼吃小鱼这些大的包住小的类型的游戏。 于…

汇编-loop循环指令

LOOP指令是根据ECX计数器循环,将语句块重复执行特定次数。 ECX自动作为计数器, 每重复循环一次就递减1。 语法如下所示: 循环目的地址必须在距离当前位置计数器的-128到127字节范围内 LOOP指令的执行有两个步骤: 第一步&…

记一次线上bug排查-----SpringCloud Gateway组件 请求头accept-encoding导致响应结果乱码

基于公司的业务需求,在SpringCloud Gateway组件的基础上,写了一个转发服务,测试开发阶段运行正常,并实现初步使用。但三个月后,PostMan请求接口,返回异常,经排查,从日志中获取到转发…

js高效函数库Lodash.js

Lodash 是一个 JavaScript 的实用工具库,提供了许多实用且高效的函数,可以简化 JavaScript 编程中的常见任务。 Lodash具有高性能、模块化和易用性等特点,表现一致性以及可扩展,下面将介绍一些 Lodash 的重要特性和用法&#xff1…

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

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

Ultipa Transporter V4.3.22 即将发布,解锁更多易用功能!

Ultipa Graph 作为一款领先的实时图数据库分析平台,即将发布最新版的数据导入/导出工具Ultipa Transporter V4.3.22 以实现对 Neo4j数据源的导入支持。自今年以来,Ultipa Transporter不断增加新功能,除原本支持本地CSV文件导入导出外&#xf…

修改bat文件默认编辑软件

Windows默认编辑bat文件的软件是自带的文本编辑器。无法高亮显示bat中的命令。 修改方式一: 打开注册表文件,变更键值 HKEY_CLASSES_ROOT\batfile\shell\edit\command 对应软件地址 修改方式二: 制作批处理文件,代码如下&#x…

github 开源whisper ros llm

GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision openai whisper ROS LLM https://github.com/Auromix/ROS-LLM/tree/ros2-humble/llm_input

我理解的反射

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 我之前对反射的理解未必…

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

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

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

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

源启容器平台KubeGien 打造云原生转型的破浪之舰

云原生是应用上云的标准路径,也是未来发展大的趋势。如何将业务平滑过渡到云上?怎样应对上云期间的各项挑战呢?中电金信基于金融级数字底座“源启”打造了一款非常稳定可靠、多云异构、安全可控、开放灵活的容器平台产品——源启容器平台Kube…

第二证券:知名私募美股持仓曝光 科技与消费板块成“心头好”

近来,美国证券交易委员会(SEC)网站闪现,高毅资产、HHLR(高瓴旗下独立二级商场基金管理人)、景林资产和千合本钱旗下对冲基金TOP ACE,陆续宣告了到三季度末的美股持仓。 据私募排排网核算&#…

代码逻辑修复与其他爬虫ip库的应用

在一个项目中,由于需要设置 http_proxy 来爬虫IP访问网络,但在使用 requests 库下载文件时遇到了问题。具体表现为在执行 Python 脚本时,程序会阻塞并最终超时,无法正常完成文件下载。 解决方案 针对这个问题,我们可以…

本地部署 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…

【Java SE】如何解读Java的继承和多态的特性?

前言 什么是继承和多态,为什么被称为Java三大特性,这两大特性为我们程序员带来了什么影响呢?是让复杂的代码简化了,还是为程序员写代码提供了多样性呢?那让我们一起来揭开这层神秘的面纱吧! 1.继承 1.1为…

日期相关整理

3214. 节日 有一类节日的日期并不是固定的,而是以“a 月的第 b 个星期 c ”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日。 现在,给你 a,b,c 和 y1,y2,希望你输出从公元 y1 年到公元 y2 年间的每年的 a 月的第 b 个…