性能优化专题主要帮助大家解决日常碰到的访问速度慢问题

一、常见问题及原因

最常见的四个导致访问慢的问题表现及原因分别为

1.请求接口慢,请求时间长,常见于list接口

打开浏览器检查模式(开发者工具),在网络(Network)一栏中,如截图找到接口执行时间进行排序查看

现象:一般来说,单一接口请求时间过长,即为异常,需要处理

处理方式:参考性能优化处理方式第一部分接口速度慢。

2.网络速度慢

查看接口的Timing,可以查看到接口加载三个时间段(发送请求,等待服务端响应,下载内容)的时间分布,正常来说应该如下图,等待服务端请求占大部分时间

现象:接口加载时间分布在Content Download下载内容占用时间过长

处理方式:客户网络环境问题,联系部署老师与客户网络服务部门进行处理

3.接口都不慢,界面慢

现象:(在检查模式中查看,接口都加载完了,界面一直加载动画,页面内容就是出不来?)

问题原因:

页面元数据 hide 方法中使用了以下几种方法(常见于action的hide方法中),会进行变量拷贝,影响前端性能

禁止使用SCOPE.getAllFilterDict(),会进行变量拷贝,影响前端性能例如获取状态:  SCOPE.getAllFilterDict().status  

替换方案:使用 SCOPE.advance_query.query_model.data.status

4.sql太多循环调用

打开运营者模式,在sql_trace中,可以查看到当前接口执行的所有sql,例如每个sql前的中括号内是对应sql的执行时间(如下图第一个sql的执行时间是[41.96]),若单一sql执行时间占比长,则为第一点问题的典型现象,参考问题一的处理方式处理

现象:当同一接口内sql执行时间都差不多,执行时间都不算长,但是执行的sql条数特别多时,就很有可能发生了循环调用

处理方式:通过运营者模式定位到是sql循环调用问题后,一般来说都是二开接口或云函数问题,联系对应的二开老师处理(二开老师云函数中尽量参考ModelUtil 方式创建


二、需掌握的性能优化处理方式

1.接口速度慢

主要针对模型列表页或者报表数据源取数慢,导入数据速度慢也可参考2/3/4

以下为请求接口慢优化方式,按顺序操作,一般来说,到字段持久化就可以解决80%的问题

      1)关联优化:判断是否存在非必要关联,判断是否针对外关联配置添加ondemand

关联wiki:模型列表页或者报表数据源取数慢

      2)组织树根节点优化

         ① 左树右列表页面配置tree元数据

         ② 过滤条件中包含组织信息

      3)字段持久化:判断是否存在业务主键/常用过滤字段/关联字段使用了弹性字段,这种情况考虑字段持久化

关联wiki:优化方式一:映射实体字段

      4)模型持久化:弹性模型数据量达到几十万级别可以考虑使用模型持久化, 常用字段添加索引

关联wiki: 优化方式二:模型持久化

在做完模型持久化之后,可以针对具体业务专门给数据库字段添加索引

注意:

如果在做完上述优化之后,接口速度依然慢,通过运营者模式拿到接口sql日志+profile日志之后,将内容反馈给对应的开发老师,由开发协助处理,运营者模式wiki参考:07 开发者模式及运营者模式介绍#07%E5%BC%80%E5%8F%91%E8%80%85%E6%A8%A1%E5%BC%8F%E5%8F%8A%E8%BF%90%E8%90%A5%E8%80%85%E6%A8%A1%E5%BC%8F%E4%BB%8B%E7%BB%8D-%E8%BF%90%E8%90%A5%E8%80%85%E6%A8%A1%E5%BC%8F

2. 后台任务页面卡死(查看队列)

一些需要后台计算的任务始终不执行,例如报表页面,薪酬计算等,这种情况考虑后台任务堵死。这种时候排查分为两步:

   1)通过后台任务状态页面定位异常任务

后台任务状态查看地址:/#/common_model_list?model=TaskStatus

异常现象:等待任务多;当发现这种情况时,应关注执行中的任务,注意任务开始时间及执行时间是否过长,定位异常任务,联系开发老师排查异常原因

紧急处理时,可以勾选堵塞任务,通过页面上【结束】按钮,直接结束任务, 但建议要找到对应的任务后,联系开发老师对进行根源问题优化

   2)查看异步队列情况(计算任务一般是异步队列)

① 通过deploy.agent.celery.status接口,执行查看异步队列执行情况

② 通用异步任务队列为celery-slow,薪酬查看celery-salary, 考勤查看celery-time

异常现象:这些队列里面ActiveQueue和WaitQueue堵满了执行任务

处理方式:查看activequeue正在执行什么任务,需要每个队列都点开查看任务的name,找到出现频率最高的,判断任务归属负责模块,咨询模块负责任判断如何处理


3云函数速度优化

列表查询接口是否添加only_list/only_id/ignore_meta参数

讲一下原理

 1)薪酬考勤数据表取数据尽量不用list,因为数据量过大,在redis取数过多,直接用业务标准提供的包或者接口 

 2)创建数据时不要循环调用batch方法

详细处理参考wiki:List接口取数优化

4. 辅助工具

1)未提交sql页面

查看未提交事物页面:/#/common_model_list?model=DBUnCommitSql

紧急处理时,可以通过页面上的【杀进程】按钮,直接杀掉sql, 但建议要根据sql找到对应的功能页面,对模型进行优化,找出根本问题

2)运营者模式

Wiki:运营者模式

获取profile日志/sql日志/详细错误信息,协助排查

除运营者模式之外也可以在api调用页面获取上述信息

3)kibana查询日志

Wiki:kibana

查询日志

 


  • 无标签