今年5月下旬到8月初一直在做教育云的性能测试工作,时间很短,但是测试过程中发现了一些比较典型的性能问题,现在把这些性能问题做一些总结:
测试过程中发现某些工程总是首先CPU使用率先达到瓶颈,导致tps一直压不上去,那么久需要找到CPU热点,到底在哪里了,方能解决问题。下面就祭出一个 神器,其实也就是一个工具了,JProfiler,使用JProfiler来抓取CPU热点。
这里重点介绍JProfiler分析热点过程,JProfiler的使用就不做介绍了,给个链接自己吧 https://wenku.baidu.com/view/15ed48d0376baf1ffd4fad0f.html
戳这个链接可以下载 安装包 http://www.cnblogs.com/andyj2ee/p/5731765.html
下图是JProfiler抓到的CPU热点:
- 可以看到 CPU 98.2%的时间在处理 worker.run 线程
- 展开之后发现 /my 接口占用了57.5%的CPU时间
- 进一步展开,发现基本上都是freemarker(一种前端的渲染技术)在占用CPU,看到这里基本上就可以断定,freemarker为CPU热点
- 到了这里CPU热点找到了,但应该怎么办?怎么优化?这是个难题。
- 首先freemarker是一个第三方的框架,修改框架源码在技术上和时间上都是问题。首先想到了看看是不是现在用的freemarker的版本比较老,性能比较差,于是上网搜最新版本和现在的版本比较,发现版本还算比较新,最新的稳定版只是比当前用的版本高了一个小版本而已(类似3.8.1 和3.8.3 的区别),看官方文档,版本之间的差异并没有什么大的改变,只是修复了一些bug而已,于是这一步路没有再走下去。
- 和开发沟通freemarker到底做了什么事情,会有哪些事情是比较耗CPU的,后来发现freemarker会做json解析,这一步是很耗CPU的,json解析现在比较流行的框架很多,但是以fastjson的性能表现最好,但是freemarker默认用的是Jackson解析的,改用fastjson之后CPU使用率降低了20%左右。
数据库长事物(此问题会导致MRT超长,长事物多了也会拖垮数据库,所以此问题还是要重视的):
- 这一类问题比较好发现,主要用到的是我们公司运维的哨兵系统,就可以直接发现。
发现长事物,此时可以和dba一起抓取到长事物的sql语句,根据具体问题,再分析。比如事物太大了,一次性处理的操作太多,导致长事物的出现,这时可以选择拆分事物。
穿透到数据库
- 此问题是造成企业云性能一直提升不上去的最大问题,很多需要走缓存的地方,并没有走缓存而是去直接查库,导致方法响应耗时很长,甚至响应时间会达到几秒钟。导致TPS上不去,同时也会给数据库造成巨大的压力,数据库的QPS、CPU等都会飙高,从而使数据库成为瓶颈,导致系统处理能力上不去。
- 这个问题的解决办法,就是把可以走缓存的地方,都走缓存。
- 考试系统为例:
场景1:某企业职工,会在学习完课程之后,统一安排考试,考试的试卷为同一份试卷,考试开始时拉取试卷。
原始处理方式:每个用户都去直接查库读取考试试卷
缓存优化处理方式:将试卷题目缓存到NCR中,由于考试的试卷为同一个,所以只需要缓存一份试卷
场景2:考试结束后,提交考试,试卷题相同,试卷答案不同
原始处理方式:每个用户将答案提交给数据库,或者将答案塞到MQ队列
缓存优化处理方式:将答案缓存到NCR中,后台系统从缓存读取数据到MQ队列处理,处理之后将需要的数据写到数据库里,尽量减少读数据库的操作
本文来自网易实践者社区,经作者张子铎授权发布。