性能调优通用逻辑

news2024/10/6 8:37:39

调优准备

定目标:根据线上预估访问量评估单场景QPS及混合场景QPS,和对应的RT值

环境区分:

测试环境单机压测进行链路问题排查问题,通常需要把单机打到CPU到100%,如果CPU到不了100%且请求已经各种超时或RT高于目标值,就得排查系统中瓶颈。换句话说,单机一定要调优到CPU是瓶颈且占用CPU的QPS、代码是合理的,参考指标4核8g的虚拟机空跑tomcat在1200QPS左右。

线上环境进行全链路压测摸排水位及瓶颈,通常会摸排到redis、db的使用问题或上下游其他服务瓶颈,如redis value过大等

链路mock

影子表:写场景避免压测数据干扰线上数据,在线上库1比1生成相同结构的表,表名增加下划线等方式区分,通过压测标路由到影子表写入或读取

登录态:压测需要模拟大量用户进行访问,登录态可采用提前生成或通过压测标mock

非调优目标下游:可通过长效缓存并进行预热的方式,或通过mock+等待下游平均耗时的方式

耗时统计

cat埋点,已封装注解CatTransaction,用于方法的耗时统计

调优方法,压测表象为RT高、超时多、异常多、QPS波动大,当CPU未满时可依次排查前几项(注:目的是压到CPU为瓶颈,当CPU不为瓶颈时一定存在某个资源点存在瓶颈,需要依次解决这个瓶颈问题)

线程池

jstack -l pid > 1.stack

确认runnable、blocked线程数(特殊情况也会是waiting),是否各worker线程池(如rpc、http)已打满

通常是需要有自己代码调用路径的栈信息才是有效的,除非引用了第三方包还没到自己代码就都阻塞了

在压测高峰区间多次连续dump stack,确认频繁出现的栈及对应的代码逻辑,通常来说就是问题卡口

可以通过top -Hp pid,查看当前进程下所有线程的占用CPU情况,如果有某个线程长期占用CPU高得重点关注,可以用线程pid号转到线程dump中的16进制对标找到栈信息

举例,如下是压权限链路线程dump的两个线程快照,且多次dump时有较多线程处于该位置waiting,再经代码逻辑发现是在等redis的response及反序列化执行结果,进一步排查redisson的线程发现较多堵在序列化,基本可以定位问题是redis存的单条数据过大

磁盘IO

# iostat -x 1 10 Linux 2.6.18-92.el5xen 02/03/2009 avg-cpu:   %user %nice %system %iowait   %steal %idle             1.10 0.00 4.82 39.54 0.07 54.46 Device:       rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await   svctm   %util    sda             0.00     3.50   0.40   2.50     5.60 48.00 18.48     0.00 0.97 0.97 0.28    sdb             0.00     0.00   0.00   0.00     0.00     0.00     0.00     0.00 0.00 0.00 0.00    sdc             0.00     0.00   0.00   0.00     0.00     0.00     0.00     0.00 0.00 0.00 0.00    sdd             0.00     0.00   0.00   0.00     0.00     0.00     0.00     0.00 0.00 0.00 0.00    sde             0.00     0.10   0.30   0.20     2.40     2.40     9.60     0.00 1.60 1.60 0.08    sdf              17.40     0.50 102.00   0.20 12095.20     5.60 118.40     0.70 6.81 2.09   21.36    sdg          232.40     1.90 379.70   0.50 76451.20 19.20 201.13     4.94 13.78 2.45   93.16    rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s    wrqm/s:   每秒进行 merge 的写操作数目。即 delta(wmerge)/s    r/s:           每秒完成的读 I/O 设备次数。即 delta(rio)/s    w/s:       每秒完成的写 I/O 设备次数。即 delta(wio)/s    rsec/s: 每秒读扇区数。即 delta(rsect)/s    wsec/s: 每秒写扇区数。即 delta(wsect)/s    rkB/s:   每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算)    wkB/s: 每秒写K字节数。是 wsect/s 的一半。(需要计算)    avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio)    avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。    await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)    svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)    %util:    一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)

 如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。idle小于70% IO压力就较大了,一般读取速度有较多的wait.

常规应用基本都是写日志过多导致,因为写日志会抢锁、大多数情况到不了IO压力这一步,特殊场景有写本地文件的也需要多注意下

内存

常规case就是老年代被打满,出现频繁FGC,但是容易混淆是因为老年代被打满导致RT高,还是因为RT高导致老年代被打满。

前者大概率是频繁生成较大对象或者全局变量中在持续添加对象,通过memory dump基本都可以定位到问题

后者需要关注外部依赖的耗时是不是太高,导致临时对象gc不掉进入老年代,然后在老年代的对象暴涨后由于栈引用在等外部依赖的结果依然无法gc

还有一种极端情况,memory dump出来的结果很正常,但是存在大量无根对象,这种需要关注下fgc的线程是不是被阻塞了(如某对象的finnalize方法中等锁)

可通过jstat轮询jvm内存和gc情况,快速确认瞬时机器jvm情况

jstat -gcutil pid 1000 1000

第一个1000是1000次,第二个1000是1s一次

重点关注Old区、FGC次数、FGC耗时

常规情况可以通过查看前20排名的对象快速定位,处理速度远超dump全量后导入到分析工具处理

jmap -histo pid | head -20

其中bytes是包含该对象所引用的所有对象大小总和,重点关注超过1G的

上述方法无法定位到内存问题点时,得全量dump并下载,成本高

jmap -J-XX:MaxHeapSize=512m -dump:format=b,file=xxx.bin pid

举例,通常内存问题是较好排查的,这里举个极端case,gc不掉的问题

下面的finalizer线程被block在jdbc释放锁,原因是proxool框架建立连接、获取连接、关闭连接都会占用锁,高流量进来后,finalizer线程因为无法抢到锁所以一直无法执行fgc,导致OOM

连接数

tcp连接层面的bug,一般不太会出现,有一例case是在centos6内核存在bug,导致tcp四次挥手时出现大量close_wait和time_waiting,会出现新的连接建连超时,如果压单机出现压测端大量超时且服务端负载极低可以查看下连接情况。正常情况下应该会有少量time_wait等待超时关闭。

netstat -anp pid

外部依赖,DB、redis

通过线程dump基本都可以定位到外部IO耗时较多的点位,不赘述

压测机器性能问题

上面资源都排查过依然出现CPU不满,QPS低且压测端RT高,要关注下压测机器本身是否存在问题

CPU

调优到CPU可以打满,基本看到希望了,下一步是要关注下当前占用CPU高的模块是否合理

如果是序列化占用较多,需要关注下技术方案上的让步,如何更合理设计数据结构,减少序列化成本,不要轻易考虑换序列化框架,通常用ali的fastjson足矣

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

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

相关文章

Voting_Averaging算法预测银行客户流失率

Voting_Averaging算法预测银行客户流失率 描述 为了防止银行的客户流失,通过数据分析,识别并可视化哪些因素导致了客户流失,并通过建立一个预测模型,识别客户是否会流失,流失的概率有多大。以便银行的客户服务部门更…

【大型互联网应用轻量级架构实战の一】轻量级架构概述

1、轻量级架构概述 1.1.1、前言 当下,互联网应用呈高速发展的趋势,要想不被市场淘汰,就必须与时间赛跑,故而,快 就成了所有互联网公司产品的特征,只有率先推出产品,才能获取主动权。 1.1.2、…

大模型时代下的paper生存= =

第一类:PEFT类论文 (我还挺喜欢的,不知道自己什么时候可以搞出这种工作 (为什么中英文穿插,利于自己写论文:) COMPOSITIONAL P ROMPT T UNING WITH M OTIONC UES FOR O PEN - VOCABULARY V ID…

构建数字时代下的必要防线 消除医疗行业数据安全建设“盲区”

4月7日,由厦门市卫生健康信息学会和厦门大学附属第一医院、厦门服云信息科技有限公司举办的医疗数据安全学术研讨会顺利开展。 作为国内云原生安全领导厂商,安全狗除了协助举办此次活动,还以数据安全治理专家的身份参与演讲分享。 厦门服云…

全网最详细,Jmeter性能测试-性能进阶, 无界面命令运行CLI模式(六)

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 如果使用jmeter.bat…

代码随想录算法训练营第四十一天-动态规划3|343. 整数拆分 ,96.不同的二叉搜索树

343整数拆分,有两种解法,一种是数学的方法,利用当f>4时,2*(f - 2)2f - 4 > f的性质,将所有的因子都拆成3,最后的余数再乘进去。另外一种是动态规划,把前面的数拆了…

算法---文件的最长绝对路径

题目 假设有一个同时存储文件和目录的文件系统。下图展示了文件系统的一个示例: 这里将 dir 作为根目录中的唯一目录。dir 包含两个子目录 subdir1 和 subdir2 。subdir1 包含文件 file1.ext 和子目录 subsubdir1;subdir2 包含子目录 subsubdir2&…

PHP快速入门11-文件操作,附写入文件、文件重命名等20个高频使用案例

文章目录前言一、文件操作介绍二、 20个文件操作的例子2.1 打开文件并写入数据2.2 读取文件中的一行数据2.3 读取文件中的一个字符2.4 读取整个文件内容2.5 向文件写入内容2.6 将整个文件读入一个数组中2.7 删除文件2.8 重命名文件2.9 复制文件2.10 判断是否为文件2.11 判断是否…

【致敬未来的攻城狮计划】RA2E1环境搭建点亮发光二极管

开启攻城狮的成长之旅!这是我参与的由 CSDN博客专家 架构师李肯和 瑞萨MCU (瑞萨电子 (Renesas Electronics Corporation) ) 联合发起的「 致敬未来的攻城狮计划 」的第 2 天,点击查看活动计划详情 ! 开发环境搭建 开…

React styled-components(三)—— 高级特性

styled-components 高级特性样式继承嵌套设置主题样式继承 新建 Demo.js 文件: import React, { Component } from react import styled from styled-components;const CustomStyle styled.divp { color: red;} const ContextBox styled(CustomStyle)width:…

Tableau-创建环状图:使用2个饼图

步骤 1:创建饼图 在“标记”下面,选择“饼图”标记类型。将分类拖到颜色。将任务总数拖到角度。再拖动一次任务总数,放到标签。根据需要调整饼图大小。 步骤 2:切换到双轴图表 右键点击任意一个字段,创建-->计算…

3年功能测试无情被裁,3个月学习自动化测试重新开始........

前言 不知不觉在软件测试行业工作了3年之久,虽然说我是主做的功能测试,但是我也一直是兢兢业业的呀,不曾想去年7月份无情被辞的消息让我感到一阵沉重。我曾经一直坚信自己的技能和经验足以支撑我在这个领域的未来,但现实却告诉我&…

考研数据结构——表达式的转换用栈实现表达式的概述

一、用表达式实现中缀表达式转后缀表达式 把括号里的符号移到括号外 二、用栈实现中缀表达式转后缀表达式 1、遇到字母写下来 2、遇到符号加入栈中 3、遇到成对括号才出栈 4、当前读取运算符要小于等于栈顶运算符优先级则出栈 从左向右扫描 三、表达式方法实现中缀表达式转…

Shader Graph9-世界空间、物体空间、相机空间、切线空间

一、World Space世界空间 在下用的Blender软件,新建了一个平面,中间的黄色小圆点表示的世界空间的原点,在世界空间的物体的位置,都是相对于这个原点来说的,红色箭头表示x轴,绿色箭头表示y轴,蓝…

算法 二叉树2 || 层序遍历 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111 二叉树的最小深度 222.完全二叉树的节点个数

102 二叉树的层序遍历 队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。 而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。 迭代法: /*** Definition for …

springboot和vue写个小项目

遵循“约定优于配置”的原则,只需要很少的配置或使用默认的配置。 能够使用内嵌的Tomcat、Jetty服务器,不需要部署war文件。 提供定制化的启动器Starters,简化Maveni配置,开箱即用。 纯)java配置,没有代码生成&#xf…

4月11日,每天30秒,昨夜今晨一览无余/我国首条“西氢东送”管道纳入国家规划/国际机构:中国经济蓬勃复苏,展现广阔投资

-> 昨天的世界(点击进入) <- http://mp.weixin.qq.com/s?__bizMzU4MzQ4Mzk0Nw&mid2247488724&idx1&snd19817d3c7fd9aeb521052090eb439e0&chksmfda90390cade8a864965c805b86acd253f5d74368ae8767b7f00b80d4af5bcc42feef7635641&scene21#wechat_redir…

Qt扫盲-Qt图表类综述

Qt支持图表类综述一、概述二、图表类型1. 折线图和柱状图2. 面积图和散点图3. 柱状图4. 饼图5. 盒须图6. 烛台图表7. 星座图图表三、坐标轴 Axes四、图例五、与图表交互1. 动态绘制数据2. 深入数据3. 缩放和滚动4. 鼠标悬停六、主题一、概述 Qt Charts支持创建时尚的、交互式的…

Jetpack Compose之对话框和进度条

概述 对话框和进度条其实并无多大联系&#xff0c;放在一起写是因为两者的内容都不多&#xff0c;所以凑到一起&#xff0c;对话框是我们平时开发使用得比较多的组件&#xff0c;像隐私授权&#xff0c;用户点击删除时给用户提示这是一个危险操作等&#xff0c;进度条的使用频…

一文吃透Elasticsearch

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址 如果访问不了Github&#xff0c…