性能优化专题主要帮助大家解决日常碰到的访问速度慢问题,
一、常见问题
最常见的四个问题表现分别为
1.请求接口慢,请求时间长,常见于list接口
现象:打开浏览器检查模式(开发者工具),在网络(Network)一栏中,如截图找到接口执行时间,一般来说,单一接口请求时间过长,即为异常,需要处理
处理方法参考第一部分页面加载速度慢。
2.网络速度慢
查看接口Timing
3.接口都不慢,界面慢
现象:(在检查模式中查看,接口都加载完了,界面一直加载动画,页面内容就是出不来?)
(前端调用了大量负担方法),找个配置示例
页面元数据 hide 方法中使用了以下几种方法(常见于action的hide方法中),会进行变量拷贝,影响前端性能
禁止使用SCOPE.getAllFilterDict(),会进行变量拷贝,影响前端性能例如获取状态: SCOPE.getAllFilterDict().status
替换方案:使用 SCOPE.advance_query.query_model.data.status
4.sql太多循环调用
举个例子啥现象?
二、需掌握的对应处理方式
1.页面加载速度慢
主要针对模型列表页或者报表数据源取数慢,导入数据速度慢也可参考2/3/4
以下为请求接口慢优化方式,按顺序操作,一般来说,到字段持久化就可以解决80%的问题:
1)关联优化:判断是否存在非必要关联,判断是否针对外关联配置添加ondemand
关联wiki:0507.性能优化排查专题
1)组织树根节点优化:界面带有组织过滤器的,可以配置ignore_root_filter,用于优化当权限为根节点时,打开list界面取数很慢的问题
2)字段持久化:判断是否存在业务主键/常用过滤字段/关联字段使用了弹性字段,这种情况考虑字段持久化
关联wiki:优化方式一:映射实体字段
1)模型持久化:弹性模型数据量达到几十万级别可以考虑使用模型持久化, 常用字段添加索引
关联wiki: 优化方式二:模型持久化
1)索引:在以上情况优化后均无效果的情况下,可以针对具体业务专门给数据库字段添加索引(持久化表后)
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方法)
list数据获取原理,sql查询时仅作id查询(主模型+relation关联模型 的数据ID),获取所有id后通过super_mget_dict缓存方式获取id对应的数据对象,如果id不命中,还是会继续穿透查询数据库,当查询大量数据时,对redis和数据库造成的压力较大,一般来讲大量数据获取时,可以仅获取需要的fields,特殊情况下,仅获取id关键属性,加参数only_id控制。
4. 辅助工具
1)未提交sql页面
数据库页面:/#/common_model_list?model=DBUnCommitSql
紧急处理时,可以通过页面上的【杀进程】按钮,直接杀掉sql, 但建议要根据sql找到对应的功能页面,对模型进行优化,找出根本问题
2)运营者模式
Wiki:运营者模式
获取profile日志/sql日志/详细错误信息,协助排查
除运营者模式之外也可以在api调用页面获取上述信息
3)kibana查询日志
Wiki:kibana
查询日志