系统优化都没做过?看这篇就够了

       

目录

一、系统优化指标

二、系统优化简介

三、系统优化

        3.1 CPU 高

        3.2 内存占用高

        业务引起的内存升高

        程序自身引起的内存问题

        3.3 磁盘I/O

        3.4 网络

        3.5 数据库优化

        3.6 响应时间高

        3.7 吞吐量

        3.8 代码层面优化

        3.9 业务优化

四、JVM优化

        4.1 堆内存设置

        4.2 选择何时的垃圾收集器

        4.3 其他方面的调优


        在平时的工作中相信你一定做过系统优化吧,如果你还没做过,一直停留在简单的 CRUD 层面,那你要小心了...,这篇文章将带你了解系统调优的方法论及实际经验。

        首先看一个案例,以前工作的公司,是金融方面的公司,每天的凌晨都有很多结算任务,其中一个定时任务跑的特别慢,随着数据的增长,每天大概需要跑4个多小时,严重的影响了后续业务的进行,急迫的需要进行优化。公司有个大佬任务,分析了半天时间,没改任何代码就是修改了一个配置,就让这个定时任务的执行时间缩短了1半,降到了两个多小时,是不是觉得很厉害?

一、系统优化指标

        想要对系统进行优化首先要了解有哪些因素可以体现出系统存在的性能问题,主要有以下这些方面:

        CPU:有的应用需要进行大量的计算,它们会长时间、不间断的占用 CPU 资源,导致其他资源无法获取 CPU 资源,从而影响其性能。

        内存:内存是很重要的提升性能的利器,如果内存资源紧张,那应用程序无论如何也是快不起来的。

        磁盘I/O:磁盘相比内存来说,存储空间要大很多,但磁盘 I/O 读写的速度要比内存慢,虽然目前引入的 SSD 固态硬盘已经有所优化,但仍然无法与内存的读写速度相提并论。

        网络:网络对于系统性能来说,也起着至关重要的作用。如果你购买过云服务,一定经历过,选择网络带宽大小这一环节。带宽过低的话,对于传输数据比较大,或者是并发量比较大的系统,网络就很容易成为性能瓶颈。

        数据库指标:大部分系统都会用到数据库,而数据库的操作往往是涉及到磁盘 IO 读写。大量的读写操作,会导致磁盘 IO 性能瓶颈, 进而导致数据库操作的延迟性,对于大量数据库操作读写来说,数据库的性能优化是整个系统的核心。

        响应时间:响应时间是一个很重要的指标,响应时间越短,性能越好,一般的接口响应时间应该在 200ms 以内,超过 1s 的话,用户的感觉已经很明显了,用户体检较差。

        吞吐量:我们需要关注系统的 QPS(每秒查询数) 和 TPS(每秒事务数),QPS 可以反应出系统在高并发场景下的处理能力,TPS 可以反应出系统处理复杂业务的能力。

二、系统优化简介

        遇到系统优化有的人一上来就是 JVM 优化,相反 JVM 差不多快是系统优化的最后手段了,影响系统性能的因素有很多,如下图:

        想做系统优化一个很重要的问题是首先要发现系统的瓶颈,那就需要完善的监控系统了。监控工具有很多开源的或者商用的监控,相信每个公司都会进行监控系统的接入,就不过多介绍,只要你能通过监控工具发现问题就行,下面来说一下如何进行系统优化。

三、系统优化

        3.1 CPU 高

        CPU 是很重要的监控指标,任何程序的运行都离不开 CPU,那 CPU 高了,我们要如何定位到时哪里引起的呢?

        首先执行 top -c 显示进程运行列表信息。输入P(大写),进程按照CPU使用率排序。

        如上图,最耗 CPU 的进程PID为 7。 执行top -Hp 7,显示一个进程的线程运行列表,输入P(大写),线程按照CPU使用率排序。

        如上图,进程7内,最耗CPU的线程PID为174。产看堆栈,定位到线程,看看他在干嘛。首先将PID转为16进制:printf "%x\n" 174

        之所以要转成16进制,是因为堆栈里,线程id是16进制表示的。查看堆栈:jstack 7 | grep '0x7b' -C5 --color

        如上图找到了 CPU 高的线程对应的线程名称“http-nio-8080-exec-38”,以及看到了该线程正在执行的代码的堆栈。最后根据堆栈,找到对应的代码。

        CPU 高的原因可能由以下几点

  1. 运算操作确实过多,CPU真实的高
  2. 大量的IO操作,CPU在等待IO,由于没有办法做切换,这使CPU虚高
  3. 程序问题,出现死循环等

        3.2 内存占用高

        关于内存引起的性能问题,通常由两个方面,一个是业务上使用不当,一个是程序可能存在内存泄漏或内存溢出。

        业务引起的内存升高

        先看一个例子,我们生产环境使用的 TiDB 分布式数据库,某一天突然出现了很多慢查询报警,然后就开始分析,通过监控发现,内存较之前升高了很多,用户量没有增长,那为何内存使用会突然增高呢?后来发现是TiCDC同步数据的问题。

        TiDB server 和 TiCDC 是部署在同一台机器上的,表里的数据很多,然后新增字段对表进行了刷数据,这是 TiCDC 需要将数据同步到灾备库里,但是灾备库的性能很差,就导致数据长时间停留在 TiCDC 的内存中,TiDB server 和 TiCDC 又是部署在同一台机器上,间接导致 TiDB server 可用内存减少,这就导致了大量慢查询的产生,这种内存问题是使用问题,只要用心观察就会发现问题所在。

        问题解决方案页简单,将 TiCDC 组件与 TiDB server 分开部署,同时升级灾备库的硬件,这个问题就解决了。

        程序自身引起的内存问题

        在来看程序使用的问题,如果 JVM 无法回收你的对象,时间长了就会产生内存泄漏,比如不签当使用 ThreadLocal 没有调用 remove 方法,从而引起对象无法回收,长期占用内存资源。

        内存溢出则是在程序运行过程中,试图申请的内存超过了系统所能分配的最大内存空间,或者超过了当前剩余可用的内存空间,导致系统无法满足程序的内存需求。一旦发生内存溢出,程序往往会抛出异常(如Java中的OutOfMemoryError),并可能导致程序终止运行。

        如果 JVM 设置的堆内存较小,而一次又加载大量数据,就会引起内存溢出问题。

        3.3 磁盘I/O

        磁盘 I/O 高代表磁盘的读写压力很大,通常可以升级磁盘硬件性能,或者增加磁盘数量来分散压力等方式即可解决。

        3.4 网络

        网络使用过高指的是网络带宽占用过高或网络资源消耗过大,导致网络性能下降、网络延迟增加或网络服务质量受到影响。

        定位问题:使用网络监控工具(如NetTop、Wireshark、iftop、nethogs等)来实时监测网络流量,找出占用带宽最大的进程或服务。

        然后要减少必要的请求,使用缓存减少请求等方式来减少交互,或者通过升级网络带宽的方式来改善该问题。

        3.5 数据库优化

        数据库是很多系统必不可少的组件,可以通过监控慢 SQL或其他监控 来进一步确定优化的方向。关于 MySQL 的相关的问题,欢迎查阅往期文章。

        3.6 响应时间高

        接口的响应时间高有很多影响因素,比如依赖三方服务卡顿、数据库问题、当时网络问题、同步操作大量数据、缓存失效等等。

        提升接口的响应时间方案有很多,比如找到借口的瓶颈点后进行相应的优化、并行处理、优化数据库、异步处理、增加缓存等等方式。

        3.7 吞吐量

        提高吞吐量的方式主要包括以下几点:

  1. 提升服务器硬件性能
  2. 使用缓存技术
  3. 数据库层面优化,减少慢查询,长事务等
  4. 代码层面,优化数据接口,减少 I/O 操作、使用多线程、合理设置 JVM 参数等
  5. 架构层面,采用无模式的水平扩容,增加服务机器
  6. 使用消息中间件来进行服务解耦,实现异步处理,增加吞吐量

        3.8 代码层面优化

        正确的使用代码是提高服务性能的基本条件,这里列举一些能提升代码性能的使用规范

  1. 使用 String 时,尽量复用字符串,少创建新对象,比如使用 intern
  2. 合理使用 ArrayList 和 LinkedList,注意其使用场景
  3. 尽量避免使用锁,减少不要的竞争和上下文切换
  4. 使用合理的 I/O 模型
  5. 避免磁盘随机读写
  6. 涉及到文件操作时,使用零拷贝
  7. 使用缓存减少查询数据库
  8. 需要序列化时避免使用 Java 序列化

        3.9 业务优化

        其实除了技术方面上的优化,业务上也有很多改进点,比如电商中的上面详情页,这个页面很重要,是关系到用户购买的关键一环,通常会在详情页上方优惠券等,来提高用户的购买意愿。但是页面加载的越多,意味着性能越差,可以把不想关的东西迁移到其他地方,比如优惠券可以在用户下单后再订单总展示。

        同样的例子有很多,APP 的首页中不要放不想关的东西,一次来提升关键点的性能。

四、JVM优化

        VM(Java虚拟机)调优主要是为了提高Java应用程序的性能,减少内存溢出、提高响应速度、优化资源利用效率等问题。

        4.1 堆内存设置

  • 调整 -Xms(初始堆大小)和 -Xmx(最大堆大小),避免频繁的堆空间动态扩展带来的性能损耗。
  • 设置 -XX:NewRatio 控制年轻代和老年代的比例,优化 GC 策略。
  • 考虑使用 -XX:MetaspaceSize、-XX:MaxMetaspaceSize 等设置元空间大小。

        4.2 选择何时的垃圾收集器

        根据应用特点选择合适的垃圾回收器(如Serial、Parallel、CMS、G1、ZGC、Shenandoah等),并对其相关参数进行调优。

        4.3 其他方面的调优

  • 设置合理的Survivor区比例(-XX:SurvivorRatio)和Eden区大小(与年轻代大小相关联)。
  • 考虑是否开启压缩类空间指针(-XX:+UseCompressedOops)。
  • 考虑是否开启偏向锁、轻量级锁等优化(-XX:+UseBiasedLocking,-XX:+UseFastAccessorMethods)。

        总结:系统调优是一个很复杂的系统工程,平时要多注意观察学习,总结经验。生产环境通常情况下要经过压测才能找到系统的瓶颈,才能知道系统达到什么程度会有性能问题,做到心中有数,提前规划。

往期经典推荐

即时编译器在JVM调优战场的决胜策略-CSDN博客

JVM垃圾收集器你会选择吗?-CSDN博客

MySQL为什么会选错索引-CSDN博客

Redis使用规范的最佳实践:打造高性能与稳定性的关键法则-CSDN博客

SpringBoot项目并发处理大揭秘,你知道它到底能应对多少请求洪峰?_一个springboot能支持多少并发-CSDN博客

TiDB内核解密:揭秘其底层KV存储引擎如何玩转键值对_tidb 的key value是如何做到的-CSDN博客

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

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

相关文章

半导体工艺技术

完整内容点击:【半导体工艺技术】

win10蓝牙开关不见了怎么办,win10设置里面蓝牙开关不见了

最近,有用户在使用win10系统的时候,发现设置蓝牙和其他设备中蓝牙开关不见了。正常情况下,“蓝牙和其他设备”下面是有蓝牙开启开关的,没有的话是怎么回事呢?出现这样的情况,可能是应为系统没有将测到蓝牙设备或者蓝牙…

高德地图key注册教程_地图数据采集软件

1.先注册成为开发者账号。 2.再申请高德地图Key。 3.把申请得到的高德地图Key填入软件中。 1.请先打开以下连接 高德地图key注册地址 易地图数据采集大师手机App版介绍 易地图数据采集大师电脑PC版介绍 2.注册新用(如果已有开发者账号,本步可省略&am…

知识蒸馏详解及pytorch官网demo案例

知识蒸馏Knowledge Distillation(KD) 1、简介 一种模型压缩方法 知识蒸馏的一般框架(如下图) 三部分:知识、蒸馏算法、师生架构。 知识 将知识分为三种形式:基于响应的(response-based)、基于特征的&…

pytest--python的一种测试框架--pytest常用断言类型

一、pytest常用断言类型 等于: 不等于&#xff1a;&#xff01; 大于&#xff1a;> 小于&#xff1a;< 属于&#xff1a;in 不属于&#xff1a;not in 大于等于&#xff1a;> 小于等于&#xff1a;< 是&#xff1a;is 不是&#xff1a;is not def test_two():ass…

酷得单片机方案 2.4G儿童遥控漂移车

电子方案开发定制&#xff0c;我们是专业的 东莞酷得智能单片机方案之2.4G遥控玩具童车具有以下比较有特色的特点&#xff1a; 1、内置充电电池&#xff1a;这款小车配备了可充电的电池&#xff0c;无需频繁更换电池&#xff0c;既环保又方便。充电方式可能为USB充电或者专用…

LATTICE进阶篇DDR2--(0)获取ddr2 IP核

前言 想要仿真lattice的DDR2由来已久&#xff0c;但苦于对其了解甚少&#xff0c;在查阅过很多资料后&#xff0c;终于对这个IP核的仿真有了一些了解。 现做一些总结&#xff0c;以备不时之需&#xff0c;也让有需要的朋友&#xff0c;少走一些弯路。 环境&#xff1a;win10…

算法学习——LeetCode力扣动态规划篇5

算法学习——LeetCode力扣动态规划篇5 198. 打家劫舍 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统…

通知中心架构:打造高效沟通平台,提升信息传递效率

随着信息技术的快速发展&#xff0c;通知中心架构作为一种关键的沟通工具&#xff0c;正逐渐成为各类应用和系统中必不可少的组成部分。本文将深入探讨通知中心架构的意义、设计原则以及在实际场景中的应用。 ### 什么是通知中心架构&#xff1f; 通知中心架构是指通过集中管…

信息学奥赛一本通T1268-完全背包问题

solution1 二维形式 #include<iostream> #include<algorithm> using namespace std; const int maxn 35, maxv 210; int w[maxn], c[maxn], dp[maxn][maxv]; int main(){int n, m;scanf("%d%d", &m, &n);for(int i 1; i < n; i){scanf(&…

电脑win10系统更新后很卡怎么办,win10电脑更新完系统特别卡

更新或者升级win10系统后发现电脑变卡了,这是什么原因呢?如果电脑硬件不是特别差,那么可以按照下面的方法来缓解卡顿,因为可能是内存不足所引起的,试试清理更新缓存和禁用开机启动项。但如果是硬件较低或者太老旧,并且本身的内存就很小的话,那么建议你还是升级硬件吧。下…

.NET 开发支持技术路线 .Net 7 将停止支持

.NET 开发技术路线图 微软方面强调&#xff0c;使用 .NET 7 的应用程序将在支持结束后继续运行&#xff0c;但用户可能无法获得 .NET 7 应用程序的技术支持。他们不会继续为 .NET 7 发布新的安全更新&#xff0c;用户可能会面临安全漏洞问题。 开发人员必须使用 .NET 8 SDK 构建…

Windows提权!!!

之前讲过一下提权&#xff0c;但是感觉有点不成体系&#xff0c;所以我们就成体系的来讲一下这个操作系统的提权 目录 Windows的提权 1.Widnows的内核溢出提权 1.MSF自带的提权模块&#xff08;Win11都能提上来&#xff0c;有点牛逼&#xff09; 2.CS的插件提权 3.补丁对比…

毕设论文目录设置

添加目录 选择一种格式的自动目录 更新目录 发现该目录中只有1、2章&#xff0c;3、4章 然后再点击更新目录 对应的&#xff0c;小标题添加二级目录

基于JavaSpringMVC+Mybatis+Jquery高校毕业设计管理系统设计和实现

基于JavaSpringMVCMybatisJquery高校毕业设计管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐…

【C语言】结构体详解(一)

目录 1、什么是结构体? 2、结构体成分 3、结构体变量的定义与初始化 3.1、结构体变量的三种定义方式 3.2、结构体变量的初始化 4、结构体成员的访问&#xff08;两种方式&#xff09; 4.1、直接访问 4.2、间接访问 5、结构的特殊声明 5.1、不完全声明&#xff08;匿…

医院陪诊管理系统(源码+文档)

TOC) 文件包含内容 1、搭建视频 2、流程图 3、开题报告 4、数据库 5、参考文献 6、服务器接口文件 7、接口文档 8、任务书 9、功能图 10、环境搭建软件 11、十六周指导记录 12、答辩ppt模板 13、技术详解 14、前端后台管理&#xff08;管理端程序&#xff09; 15、项目截图 1…

06-JavaScript DOM对象

1. 从ECMA到W3C 我们知道&#xff0c;ECMA定义的是js的变量语法等基础的标准规范&#xff0c;而W3C是针对浏览器API提出的规范&#xff0c; 所以我们要工作不可能只了解语法&#xff0c;我们的代码要在浏览器上跑起来就需要我们去了解W3C的标准。 那么W3C规定了哪一系列的的A…

深入PostgreSQL中的pg_global表空间

pg_global表空间的位置 在PG当中&#xff0c;一个实例(cluster)初始化完以后&#xff0c;你会看到有下边两个与表空间相关的目录生成&#xff1a; $PGDATA/base $PGDATA/global 我们再用元命令\db以及相关视图看看相应的表空间信息&#xff1a; postgres# \db …

28. UE5 RPG同步面板属性(四)

在前面几篇中&#xff0c;我们实现了以下步骤&#xff1a; 首先我们需要通过c去实现创建GameplayTag&#xff0c;这样可以在c和UE里同时获取到Tag创建一个DataAsset类&#xff0c;用于设置tag对应的属性和显示内容创建AttributeMenuWidgetController实现对应逻辑 上面几步在前…