后端不哭!最新性能优化经验分享来啦

2023-05-30 0 477

每晚傍晚,蔬果按时献上!

后端不哭!最新性能优化经验分享来啦

责任编辑来自:blog.sina.com.cn/s/blog_493a84550102z8t2.html

后端不哭!最新性能优化经验分享来啦

那时chicourt销售业务控制系统操控性难题预测确诊和操控性强化各方面的文本。这首诗重点项目却是谈早已上架的销售业务控制系统先期再次出现操控性难题后的难题确诊和强化重点项目。

控制系统操控性难题预测业务流程

后端不哭!最新性能优化经验分享来啦

他们具体来说来预测下假如两个销售业务控制系统上架前没操控性难题,而在上架后再次出现了相当严重的操控性难题,所以事实上潜在性的情景主要就源自于下列两个各方面。

销售业务再次出现大并发的访问,导致再次出现操控性瓶颈

上架后的控制系统数据库数据日积月累,数据量增加后再次出现操控性瓶颈

其它关键环境改变,比如他们常说的网络带宽影响

正是由于这个原因,当他们发现操控性难题的时候,具体来说就需要判断是单用户非并发状态下本身就有操控性难题,却是说在并发状态才存在操控性难题。对于单用户操控性难题往往比较容易测试和验证,对于并发操控性难题他们可以在测试环境进行加压测试和验证,以判断并发下的操控性。

假如是单用户本身就存在操控性难题,所以大部分难题都出在程序代码和SQL需要进一步强化上面。假如是并发操控性难题,他们就需要进一步预测数据库和中间件本身的状态,看是否需要对中间件进行操控性调优。

在加压测试过程中,他们还需要对CPU,内存和JVM进行监控,观察是否存在类似内存泄漏无法释放等情况,即并发下操控性难题本身也可能是代码本身原因导致操控性异常。

操控性难题影响因素预测

后端不哭!最新性能优化经验分享来啦

对于操控性难题影响因素,简单来说包括了硬件环境,软件运行环境和软件程序三个各方面的主要就文本。下面分别再展开说明下。

硬件环境

硬件环境就是他们常说的计算,存储和网络资源。

对于服务器的计算能力,一般来说厂家都会提供TPMC参数作为两个参考数据,但是他们实际看到相同TPMC能力下的X86服务器能力仍然低于小型机的能力。

除了服务器的计算能力参数,另外两个重点项目就是他们说的存储设备,影响到存储的重点项目又是IO读写操控性难题。有时候我们监控发现CPU和内存居高不下,而真正的瓶颈通过预测反而发现是由于IO瓶颈导致,由于读写操控性跟不上,导致大量数据无法快速持久化并释放内存资源。

后端不哭!最新性能优化经验分享来啦

比如在Linux环境下,本身也提供了操控性监控工具方便进行性能预测。比如常用的iostat,ps,sar,top,vmstat等,这些工具可以对CPU,内存,JVM,磁盘IO等进行操控性监控和预测,以发现真正的操控性难题在哪里。

比如他们常说的内存使用率持续告警,你就必须发现是高并发调用导致,却是JVM内存泄漏导致,却是本身由于磁盘IO瓶颈导致。

对于CPU,内存,磁盘IO操控性监控和预测的两个思路可以参考:

后端不哭!最新性能优化经验分享来啦

运行环境-数据库和应用中间件

数据库和应用中间件操控性调优是另外两个经常再次出现操控性难题的地方。

数据库操控性调优

拿Oracle数据库来说,影响数据库操控性的因素包括:控制系统、数据库、网络。数据库的强化包括:强化数据库磁盘I/O、强化回滚段、强化Rrdo日志、强化控制系统全局区、强化数据库对象。

后端不哭!最新性能优化经验分享来啦

要调整具体来说就需要对数据库操控性进行监控

他们可以在init.ora参数文件中设置TIMED_STATISTICS=TRUE 和在你的会话层设置ALTER SESSION SET STATISTICS=TRUE 。运行svrmgrl 用 connect internal 注册,在你的应用控制系统正常活动期间,运行utlbstat.sql 开始统计控制系统活动,达到一定的时间后,执行utlestat.sql 停止统计。统计结果将产生在report.txt 文件中。

数据库操控性强化应该是两个持续性的工作,两个各方面是本身的操控性和参数巡检,另外两个各方面就是DBA也会经常提取最占用内存的低效SQL语句给开发人员进一步预测,同时也会从数据库本身的下列告警KPI指标中发现难题。

比如他们可能会发现Oracle数据库再次出现内存使用率高的告警,而通过检查会发现是产生了大量的Redo日志导致,所以他们就需要从程序上进一步预测为何会产生如此多的回滚。

应用中间件操控性预测和调优

应用中间件容器即他们常说的Weblogic, Tomcat等应用中间件容器或Web容器。应用中间件调优两个各方面是本身的配置参数强化设置,一个各方面就是JVM内存启动参数调优。

对于应用中间件本身的参数设置,主要就包括了JVM启动参数设置,线程池设置,连接数的最小最大值设置等。假如是集群环境,还涉及到集群相关的配置调优。

对于JVM启动参数调优,往往也是应用中间件调优的两个关键点,但是一般JVM参数调优会结合应用程序一起进行预测。

后端不哭!最新性能优化经验分享来啦

比如他们常见的JVM堆内存溢出,假如程序代码没内存泄漏难题的话,我就需要考虑调整JVM启动时候堆内存设置。在32位操作控制系统下只能够设置到4G,但是在64位操作控制系统下早已可以设置到8G甚至更大的值。

其中JVM启动的主要就控制参数说明如下:

-Xmx设置最大堆空间

-Xms设置最小堆空间

-XX:MaxNewSize设置最大新生代空间

-XX:NewSize设置最小新生代空间

-XX:MaxPermSize设置最大永久代空间(注:新内存模型早已替换为Metaspace)

-XX:PermSize设置最小永久代空间(注:新内存模型早已替换为Metaspace)

-Xss设置每个线程的堆栈大小

所以这些值究竟设置多大合适,具体来讲:

后端不哭!最新性能优化经验分享来啦

Java整个堆大小设置,Xmx 和 Xms设置为老年代存活对象的3-4倍,即FullGC之后的老年代内存占用的3-4倍。永久代 PermSize和MaxPermSize设置为老年代存活对象的1.2-1.5倍。

年轻代Xmn的设置为老年代存活对象的1-1.5倍。

老年代的内存大小设置为老年代存活对象的2-3倍。

注意在新的JVM内存模型下早已没PermSize而是变化为Metaspace,因此需要考虑Heap内存和Metaspace大小的配比,同时还需要考虑相关的垃圾回收机制是采用哪种类型等。

对于JVM内存溢出难题,我前面写过一篇专门的预测文章可以参考。

从表象到根源-两个软件控制系统JVM内存溢出难题预测解决全过程 

后端不哭!最新性能优化经验分享来啦

软件程序操控性难题预测

在这里具体来说要强调的一点就是,当他们发现操控性难题后具体来说想到的就是扩展资源,但是大部分的操控性难题本身并不是资源能力不够导致,而是他们程序实现上再次出现明显缺陷。

比如他们经常看到的大量循环创建连接,资源使用了不释放,SQL语句低效执行等。

为了解决这些操控性难题,最好的方法仍然是在事前控制。其中包括了事前的代码静态检查工具的使用,也包括了开发团队对代码进行的Code Review来发现操控性难题。

所有已知的难题都必须形成开发团队的开发规范要求,避免重复再犯。

销售业务控制系统操控性难题扩展思考

对于销售业务控制系统的操控性强化,除了上面谈到的标准预测业务流程和预测要素外,再chicourt其它一些操控性难题引发的关键思考。

上架前的操控性测试是否有用?

有时候大家可能觉得奇怪,为何他们控制系统上架前都做了操控性测试,为何上架后却是会再次出现控制系统操控性难题。所以他们可以考虑下事实上他们上架前操控性测试可能存在的一些无法真实模拟生产环境的地方,具体为:

硬件能否完全模拟真实环境?最好的操控性测试往往是直接在搭建完成的生产环境进行。

数据量能否模拟实际情景?真实情景往往是多个销售业务表都早已存在大数据量的积累而非空表。

并发能否模拟真实情景?两个是需要录制复合销售业务情景,两个是需要多台压测机。

而事实上他们在做操控性测试的时候以上两个点都很难真正做到,因此要想完全模拟出生产真实环境是相当困难的,这也导致了很多操控性难题是在真正上架后才发现。

控制系统本身水平弹性扩展是否完全解决操控性难题?

第二个点也是他们经常谈的比较多的点,就是他们的销售业务控制系统在进行架构设计的时候,特别是面对非功能性需求,他们都会谈到控制系统本身的数据库,中间件都采用了集群技术,能够做到弹性水平扩展。所以这种弹性水平扩展能力是否又真正解决了操控性难题?

事实上他们看到对于数据库往往很难真正做到无限的弹性水平扩展,即使对于Oracle RAC集群往往也是最多扩展到单点的2到3倍操控性。对于应用集群往往可以做到弹性水平扩展,当前技术也比较成熟。

当中间件能够做到完全弹性扩展的时候,事实上仍然可能存在操控性难题,即随着他们控制系统的运行和销售业务数据量的不断积累增值。事实上你可以看到往往非并发状态下的单用户访问本身就很慢,而不是说并发上来后慢。因此也是他们常说的要给点,即:

单点访问操控性正常的时候可以扩展集群来应对大并发状态下的同时访问

单点访问本身操控性就有难题的时候,要优先强化单节点访问操控性

销售业务控制系统操控性确诊的分类

对于销售业务控制系统操控性确诊,假如从静态角度他们可以考虑从下列三个各方面进行分类

操作控制系统和存储层面

中间件层面(包括了数据库,应用服务器中间件)

软件层面(包括了数据库SQL和存储过程,逻辑层,前端展现层等)

所以两个销售业务控制系统应用功能再次出现难题了,他们当然也可以从动态层面来看实际两个应用请求从调用开始究竟经过了哪些代码和硬件基础设施,通过分段方法来定位和查询难题。

比如他们常见的就是两个查询功能假如再次出现难题了,具体来说就是找到这个查询功能对应的SQL语句在后台查询是否很慢,假如这个SQL本身就慢,所以就要强化强化SQL语句。假如SQL本身快但是查询慢,那就要看下是否是前端操控性难题或者集群难题等。

软件代码的难题往往是最不能忽视的两个操控性难题点

对于销售业务控制系统操控性难题,他们经常想到的就是要扩展数据库的硬件操控性,比如扩展CPU和内存,扩展集群,但是事实上可以看到很多应用的操控性难题并不是硬件操控性导致的,而是由于软件代码操控性引起的。对于软件代码常见的操控性难题我在以往的博客文章里面也谈过到,比较典型的包括了。

循环中初始化大的结构对象,数据库连接等

资源不释放导致的内存泄露等

没基于情景需求来适度通过缓存等方式提升操控性

长周期事务处理耗费资源

处理某两个销售业务情景或难题的时候,没选择最优的数据结构或算法

以上都是常见的一些软件代码操控性难题点,而这些往往需要通过他们进行Code Review或代码评审的方式才能够发现出来。因此假如要做全面的操控性强化,对于软件代码的操控性难题排查是必须的。

通过IT资源监控或APM应用工具来发现性能难题

后端不哭!最新性能优化经验分享来啦

对于操控性难题的发现一般有两条路径,两个就是通过他们IT资源的监控,APM的操控性监控和预警来提前发现操控性难题,两个是通过销售业务用户在使用过程中的反馈来发现操控性难题。

APM应用性能管理主要就指对企业的关键销售业务应用进行监测、强化,提高企业应用的可靠性和质量,保证用户得到良好的服务,降低IT总拥有成本(TCO)。

资源池-》应用层-》销售业务层

这个可以理解为APM的两个关键点,原有的网管类监控软件更多的是资源和操作控制系统层面,包括计算和存储资源的使用和利用率情况,网络本身的操控性情况等。但是当要预测所有的资源层难题如何对应到具体的应用,对应到具体的销售业务功能的时候很难。

传统模式下,当再次出现CPU或内存满负荷的时候,假如要查找到具体是哪个应用,哪个进程或者具体哪个销售业务功能,哪个sql语句导致的往往并不是容易的事情。在实际的操控性难题强化中往往也需要做大量的日志预测和难题定位,最终才可能找到问题点。

比如在他们最近的项目实施中,结合APM和服务链监控,他们可以快速的发现究竟是哪个服务调用再次出现了操控性难题,或者快速的定位出哪个SQL语句有验证的操控性难题。这个都可以帮助他们快速的进行操控性难题预测和确诊。

资源上承载的是应用,应用本身又包括了数据库和应用中间件容器,同时也包括了前端;在应用之上则是对应到具体的销售业务功能。因此APM两个核心就是要将资源-》应用-》功能之间进行整合预测和衔接。

而随着DevOps和自动化运维的思路推进,他们更加希望是通过APM等工具主动监控来发现操控性难题,对于APM工具最大的好处就是可以进行服务全链路的操控性预测,方便他们发现操控性难题究竟发生在哪里。比如他们提交两个表单很慢,通过APM预测他们很容易发现究竟是调用哪个销售业务服务慢,或者是处理哪个SQL语句慢。这样可以极大的提升他们操控性难题预测确诊的效率。

— END —

– 后端不哭!最新性能优化经验分享来啦 | 更多精彩文章 –

Java爬取美女图片妹子图

除了b站,原来还有a、c、d、e、f、g、h、i、j、k、l、m、n…z站?

手把手教你实现 Docker 部署 Redis 集群

如何设计 QQ、微信等第三方账号登陆 ?并说出数据库表设计!

《Java进阶知识手册》

后端不哭!最新性能优化经验分享来啦

手册

后端不哭!最新性能优化经验分享来啦

>> 点击进入技术讨论群 <<<“>>>> 点击进入技术讨论群 <<<▽想知道更多?后端不哭!最新性能优化经验分享来啦

觉得不错就点个在看 后端不哭!最新性能优化经验分享来啦

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务