位置: IT常识 - 正文

山东项目系统慢问题分析和解决(山东省项目)

编辑:rootadmin
山东项目系统慢问题分析和解决 山东项目系统慢问题分析和解决前言:

推荐整理分享山东项目系统慢问题分析和解决(山东省项目),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:山东省项目备案暂行办法,山东项目审批监管平台,山东项目审批,山东项目审批监管平台,山东项目备案平台,山东项目审批监管平台,山东项目在线审批,山东项目查询网站,内容如对您有帮助,希望把文章链接给更多的朋友!

排查此类问题最重要的是要弄清事情的问题的原因表象以及根本原因是什么, 只要弄清楚是什么原因导致的我们才能解决此类问题,这也是一个过程,每个人的理解不同,所以说结果也是不同的. 这边文章就从技术的角度从 问题分析>问题猜想>问题处理>验证结果 四个过程进行 排查我们的系统如何慢. ps:我这里是从后端的角度进行分析,关于前端分析这块可能会有描述差异

优化结果:

整体系统响应比之前有较大提升,一些卡顿的页面性能得到明显提升,以下是详细信息,也可以进到我们系统里体验下是否有提升.

问题列表和优化过程记录1 大屏页面 - 领导驾驶舱1.1 问题分析问题描述分类问题描述原因初步分析原因分类领导驾驶舱矿山信息加载所有数据统计各自关联表数量1 数据稍多有计算矿山预警报警预警数据量比较大,实时统计就很慢1 数据量大矿山报警类型报警数据量比较大,实时统计就很慢1 数据量大安全评估分时统计了所有时间段的数据,实际只需要统计最近7天的数据1 查询条件有误地图加载

即有明确的界面展示,能够直观看到加载或响应时间 我们首先看一下这个图 前台dom加载共2秒 加载时间2.2秒 一共完成用了1.8分钟 另外有接口超时 在浏览器开发者面板里 这里主要分析一点 : 加载时间长的地方在哪 根据问题进行响应处理

我们统计出需要优化的接口

序号接口地址说明1企业领导驾驶舱-监测预警-今日报警(超时) EntCockpitControllerhttp://117.73.255.68:28080/sdmine/ent/cockpit/getTodayNetWarnStatistics?_t=1672194979&baseid=148218326079138201760秒2企业驾驶舱-监测月份报警统计EntCockpitControllerhttp://117.73.255.68:28080/sdmine/ent/cockpit/getMonthNetWarnStatistics?_t=1672194979&baseid=148218326079138201750秒3领导驾驶舱-应急资源统计CockpitControllerhttp://117.73.255.68:28080/sdmine/gov/cockpit/getTotalEmsStatistics?_t=1672194979&baseid=14821832607913820171.56秒4企业领导驾驶舱-月份隐患统计EntCockpitControllerhttp://117.73.255.68:28080/sdmine/ent/cockpit/getMonthHiddenStatistics?_t=1672194979&year=2022&baseid=14821832607913820171.51秒1.2 问题解决问题描述分类问题描述原因初步分析原因分类领导驾驶舱矿山信息加载所有数据统计各自关联表数量1 数据稍多有计算矿山预警报警预警数据量比较大,实时统计就很慢1 数据量大矿山报警类型报警数据量比较大,实时统计就很慢1 数据量大安全评估分时统计了所有时间段的数据,实际只需要统计最近7天的数据1 查询条件有误地图加载1.2.1 问题解决思路

这类问题都是需要在大屏或者统计图表中统计出某某信息的列表和数量,这类代码往往牵涉到计算,以及实时显示的问题 解决方法:

实时计算数量放在redis里,查询的时候查基础数据数量不在数据库中做计算最好单独起服务进行计算,将计算的结果存储在redis或者数据库中以供数据进行查询,计算的频率根据计算结果的快慢进行设置,计算频率至少>计算时间*2SQL 最小化查询条件SQL 减少不必要的查询SQL 优化<如何创建索引,以及命中索引>前端加载js较大的时候可以采取CDN加速或者js压缩等方式

根据实际结果领导驾驶舱3秒内刷新加载就可以完成. 优化过之后两秒内即可刷新完成. 第一次加载的时间也是3-4秒即可完成

1.2.2 关于SQL优化

另外有由于领导驾驶舱是处理的第一个页面,所以从整体考虑来讲我这边打开了druid的SQL监控面板进行进一步优化 设置刷新频率为20秒 多看一会 点击这个页面的时候 手动多刷几次有问题的页面,这里主要优化最慢且执行数量比较高的 ,将这些有问题的贴到Navicat里explain

关于索引命中的问题 参考下面这个连接

https://blog.csdn.net/qq_45566762/article/details/116200103 本次排查主要包含以下使用到地方 1 强制索引 2 类型转换 3 like处理

in处理

in范围小走索引,in范围大不走索引 这个需要根据实际情况处理,我测试的时候是将in替换为了关联查询 即 select a,b where a.x=b.x and b.xx like ‘a%’; 这个是处理其他慢sql处理的 在这里简单提一下,有的时候 网上的东西不一定对,可以根据实际情况进行测试看哪个快. https://blog.csdn.net/Miss_SquarePants/article/details/124236679 https://www.365jz.com/article/27003 网上也有说exists替换为in等说法 这个要看情况 有的情况可能并不适用

另外也有一些关于数据库方面的知识:

1 关联字段创建索引或者外键等 一定要将数据库的类型和字段长度一致 否则可能会导致索引失效 例如a表关联b表 a.id = b.fid 假设 类型不一致可能会导致索引失效 2 大表有order by 查询分页等数据 需要将order by 的字段增加索引 一般都是时间字段 3 大数据量插入一定要使用批量插入

1.2.3 高峰时mysql cpu高整体查询慢山东项目系统慢问题分析和解决(山东省项目)

另外也有可能是锁表,死锁,阻塞等情况 参考: https://blog.51cto.com/u_9625010/2486571 https://www.shuzhiduo.com/A/A2dmqOLAde/

详细步骤参考: https://blog.csdn.net/vipxiaowenbo/article/details/125302212

2系统管理2.1 问题分析问题描述分类问题描述原因初步分析原因分类系统管理企业填报缺少分页缺少分页物联网接入缺少分页 有计算缺少分页和有计算在线用户缺少分页 有计算缺少分页和有计算主页跳转加载js过大前端资源大2.2 问题解决

这个和前面的问题比较类似,多了一个前端加载js过大的问题 处理方式是一样的,

查询多的尽量改成分页有计算多的将计算结果的数据存redis,定时进行清算计算单独起服务尽量单独起服务进行计算

另外前端的问题本人不是很专业, 处理加载资源慢方法

CDN加速压缩去掉没用的引用3 隐患排查治理3.1 问题分析和解决问题描述分类问题描述原因初步分析原因分类隐患排查治理执法检查慢查询,没有命中索引慢查询报警预警处置大表 慢查询慢查询

执法检查检查处理比较简单,在查询字段上加索引explain就行了 报警预警处置就比较复杂了,大概花了我大半天的时间 大约从20秒优化到8秒左右 代码 这是一段分页查询代码,大概意思是先根据gov查询出一个id列表,在in到下面的另外一张表里面 这里有很多问题点

in的范围比较大查询的数据比较多有多表关联基表数量比较大,关联的也有大表public IPage<SafeCheckProblem> govPages(IPage<SafeCheckProblem> page,String gov,String mineName,String content) { List<String> mineIds=baseMapper.getMineIdsForGov(gov); if(mineIds==null || mineIds.size()==0) return new Page<>(); return baseMapper.govPage(page,gov,mineName,content);}

我修改过的sql

去掉无用的关联 意义不是很大将in 修改为关联查询 in大表索引会失效类型转换 匹配字段3 改为’3’ 数据库类型是字符 这里直接匹配数字会导致索引失效order by 增加索引 增加查询分页数据效率*这个符号没有去掉,担心去对业务有影响 【原则上不允许出现select * 】<select id="govPage" resultType="com.zwsafety.drh.entity.SafeCheckProblem"> select scp.* from safe_check_problem scp , ent_minebase em <if test="gov!=null"> LEFT JOIN sys_district sdt ON (em.districtid = sdt.id) </if> where source='3' and scp.baseid=em.id <if test="gov!=null"> and sdt.id LIKE '${gov}%' </if> <if test="content !=null "> and scp.content like '%${content}%' </if> <if test="mineName !=null "> and em.minename like '%${mineName}%' </if> order by scp.create_time desc</select>4 矿山首页

这个功能由于涉及业务复杂,由其他同事后续补充.

5 SQL和其他日志记录影响整体性能

由于我们系统后台采用是jeecg-boot框架开发的,生成代码上默认的控制层(controller层) 多了一个@Autolog这个注解,这个注解意思是记录日志,也就是前台发起一次请求,后台会记录是谁发起的请求,目前这个表已经到千万级别,所以每次请求都会有至少1条记录在这个里面, 我们的系统直接至少已经被点击了千万次以上

解决办法:

删除 【增改查】 记录日志修改插入为批量插入500多个controller层,说明我们的业务非常的多,删除无用的日志记录

批量插入 系统启动单线程启动执行检测有无数据需要数据需要批量入库 ,这块后期可以优化下,将数据存储在kafka或者redis里面,目前我放在了内存里面.

package org.jeecg.startup;import com.google.common.util.concurrent.ThreadFactoryBuilder;import lombok.extern.slf4j.Slf4j;import org.apache.commons.collections.CollectionUtils;import org.jeecg.common.api.dto.LogDTO;import org.jeecg.common.handler.JobDealHandler;import org.jeecg.modules.base.service.BaseCommonService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.CommandLineRunner;import org.springframework.stereotype.Component;import java.util.List;import java.util.concurrent.*;/*** 系统启动插入数据* @author Xiaowb*/@SuppressWarnings("unused") @Component @Slf4j public class SysLogStartup implements CommandLineRunner { @Autowired(required = false) private BaseCommonService baseCommonMapper; @SuppressWarnings({"squid:S2142","squid:S2189","squid:S112","squid:S1604"}) @Override public void run(String... args) throws Exception { if(baseCommonMapper == null){ log.error("baseCommonMapper init error!!! log can not be insert !!!"); } ExecutorService executorService = newSingleThreadExecutor("SysLogInsert", 1024); executorService.execute(new Runnable() { @Override public void run() { while(true){ List<LogDTO> li = JobDealHandler.getList(); if(CollectionUtils.isNotEmpty(li)){ log.info("已消费到日志数据"+li.size()); baseCommonMapper.saveLogBatch(li); } try { Thread.sleep(5000); } catch (InterruptedException ex) { throw new RuntimeException(ex); } } } }); } /**** 创建单线程池* @param maximumTaskSize 最大任务等待数* @return java.util.concurrent.ExecutorService* @author Xiaowb* @date 2022/12/29*/ public static ExecutorService newSingleThreadExecutor(String name, int maximumTaskSize) { ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(name + "-%d").build(); return new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(maximumTaskSize), threadFactory); } }SQL优化:

参考:1.2.2 和 1.2.3

服务器负载

mysql服务器

web服务器1

web服务器2

都没有太大问题 jvm之前分析过,优化过了。

本文链接地址:https://www.jiuchutong.com/zhishi/296132.html 转载请保留说明!

上一篇:ChatGPT 指令大全(ctu指令)

下一篇:flex布局优化(两端对齐,从左至右)(flex布局实战)

  • 华为手表闹钟与手机同步哪里设置(华为手表闹钟与小米手机同步哪里设置)

    华为手表闹钟与手机同步哪里设置(华为手表闹钟与小米手机同步哪里设置)

  • 微信如何查询孩子的核酸检测结果(微信如何查询孩子的医保缴费情况明细)

    微信如何查询孩子的核酸检测结果(微信如何查询孩子的医保缴费情况明细)

  • 拼多多退款怎么退到微信零钱(拼多多退款怎么撤销申请)

    拼多多退款怎么退到微信零钱(拼多多退款怎么撤销申请)

  •  qq拒绝加好友并拉黑怎么解除(qq拒绝加好友并拉黑怎么判断)

    qq拒绝加好友并拉黑怎么解除(qq拒绝加好友并拉黑怎么判断)

  • 第四代程序设计语言是什么的程序语言 (第四代程序设计语言4GL属于什么语言)

    第四代程序设计语言是什么的程序语言 (第四代程序设计语言4GL属于什么语言)

  • 打印机序列号(打印机序列号在哪里)

    打印机序列号(打印机序列号在哪里)

  • facebook账号停用和禁用区别(Facebook账号停用后可以换其他手机注册一个吗)

    facebook账号停用和禁用区别(Facebook账号停用后可以换其他手机注册一个吗)

  • 华为荣耀20Pro手机屏幕时间怎么添加(华为荣耀20pro手机长度)

    华为荣耀20Pro手机屏幕时间怎么添加(华为荣耀20pro手机长度)

  • wps怎么将一个单元格一分为二(wps怎么将一个单元格一分为三)

    wps怎么将一个单元格一分为二(wps怎么将一个单元格一分为三)

  • qq的分享屏幕可以一起看电影吗(qq的分享屏幕可以看到qq以外的界面吗)

    qq的分享屏幕可以一起看电影吗(qq的分享屏幕可以看到qq以外的界面吗)

  • 2g卡怎么升级4g(2g卡怎么升级4g网络)

    2g卡怎么升级4g(2g卡怎么升级4g网络)

  • 5g手机和4g手机在使用上有什么区别(5g手机和4g手机哪个好)

    5g手机和4g手机在使用上有什么区别(5g手机和4g手机哪个好)

  • vaio笔记本怎么买不到(vaio笔记本怎么调节亮度)

    vaio笔记本怎么买不到(vaio笔记本怎么调节亮度)

  • 表格双面打印怎么打(表格双面打印怎么弄)

    表格双面打印怎么打(表格双面打印怎么弄)

  • 苹果手机收藏夹在哪里(苹果手机收藏夹里的东西怎么删除)

    苹果手机收藏夹在哪里(苹果手机收藏夹里的东西怎么删除)

  • 乐视手机闪退怎么回事(乐视app闪退)

    乐视手机闪退怎么回事(乐视app闪退)

  • 服务器是不是电脑主机(服务器是网络吗)

    服务器是不是电脑主机(服务器是网络吗)

  • 拼多多的单号可以用到淘宝吗(拼多多的单号可以用在淘宝上吗)

    拼多多的单号可以用到淘宝吗(拼多多的单号可以用在淘宝上吗)

  • oppo reno2支持5g吗(reno2z支持5g)

    oppo reno2支持5g吗(reno2z支持5g)

  • oppoa7x怎样遥控空调(oppoa72遥控)

    oppoa7x怎样遥控空调(oppoa72遥控)

  • airpods怎么两个一起用(airpods怎么两个耳机连接两个手机)

    airpods怎么两个一起用(airpods怎么两个耳机连接两个手机)

  • win10怎么批量下载网页中图片(win10 批量安装软件)

    win10怎么批量下载网页中图片(win10 批量安装软件)

  • B/S架构(b/s架构的正确解释方式)

    B/S架构(b/s架构的正确解释方式)

  • 企业为自然人什么意思
  • 自产产品用于职工福利会计处理
  • 所得税汇算清缴捐赠支出扣除标准
  • 减半征收的印花税缴纳所得税吗
  • 顺风车公司可以开发票吗
  • 本期准予抵减税额怎么算
  • 固定资产净残值率是多少
  • 外币借款汇兑差额资本化额怎么计算
  • 利息收入为什么是负数
  • 员工缴纳的工会会费可以税前扣除吗
  • 跨年发票冲红重新开具购买方做账不
  • 抵税更正申报需要多久
  • 确认的投资收益
  • 法人代表借钱给公司可以做短期借款吗
  • 餐费适用税率
  • 公允价值变动损益属于损益类的
  • 计提缴纳社保的会计分录
  • 小规模免税增值税申报表怎么填
  • 店面转让出去收到的钱如何做账?
  • 应征增值税不含税销售额和免税销售额
  • 房地产商铺增值税税率是多少
  • 清理血管垃圾最有效的食物
  • 苹果6splus怎么操作技巧
  • 公司个人股份转让需要缴税吗
  • php提高性能
  • 惠普2600打印机故障排除
  • 合作客户合同
  • 固定资产核销是资产损失吗
  • 冰雪节上的冰雕图片
  • Android App中DrawerLayout抽屉效果的菜单编写实例
  • ValueError: The device should not be ‘gpu‘, since PaddlePaddle is not compiled with CUDA问题解决(Paddle)
  • vue自定义dialog
  • 承兑汇票无法兑付
  • 看了这篇文章感触很深的说说
  • 喰种小说在线阅读
  • 固定资产折旧四种方法公式
  • python 动态
  • 装修费摊销3年会计分录
  • 信息技术服务费税收编码
  • 勾选发票提交后如何
  • 销售房产收取预算费用
  • vue was assigned to but
  • 负债类科目有借贷方向吗
  • 库存现金的会计分录
  • 招标押金有规定吗
  • 哪些进项税额不能抵扣
  • 政府补助收入的会计处理
  • 先开销项发票
  • 车船税款
  • 会计学中管理费用是什么
  • 股东借款转为实收资本的说明
  • 充油卡未收发票怎么办
  • 实收资本可以做现金吗
  • 企业的培训费用
  • 利润总额与应纳税所得额的差异国内动态
  • 资产负债表日指的是什么
  • 海量数据的查询
  • win7激活失败提示错误代码0x80072F8F
  • 如何制作ubuntu系统盘
  • debian系统如何安装软件
  • linux 对比文件
  • 退休后归什么部门管
  • linux系统中常用的五种文件类型
  • Win7系统重装后鼠标键盘不能用怎么办
  • apache for mac
  • linux系统如何安装应用
  • opengl网格
  • AngularJS中controller控制器继承的使用方法
  • Android Fragment学习笔记(2) ----使用ListFragment显示列表(上)
  • 原生js实现ajax步骤
  • 手机截取电脑屏幕
  • python保存文件到指定文件夹
  • web 开发
  • jquery源码解析
  • python 分析
  • 以下关于android应用程序的目录结构描述中,不正确的是
  • 浙江省网上税务局app下载
  • 一般纳税人开劳务费税率是多少2023
  • 超市开发票每月额度,超了之后税率是多少
  • 智能财税是什么行业
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设