分析
压测结果不理想,比如只有 十几TPS。该怎么调优
可从如下方面考虑:
- 硬件
- cpu
- 内存
- 网络
查看应用容器(服务器)、数据库服务器、web服务器
- 软件
- nginx
- 数据库连接
- web容器tomcat
- jvm堆
- 微服务服务通信(openfeign、jsf)
- 服务器硬件配置
- 数据库服务器 16c 32g
- 应用服务器 4c 8g
- java应用堆内存设置
- 80%物理内存
- 挑选慢sql,cpu高的sql
- 数据量大,索引
- 连接数配置
- 数据库连接数 db2
- tomcat连接数、线程池
- nginx连接数、线程数
- 微服务连接数(JSF)
- 其他
- 日志不要使用debug级别
压测过程中,监测 CPU、内存情况是什么样的,(数据库、应用)
适当增加日志,分析是哪个接口响应慢
排除其他系统的干扰。
db2top命令使用
db2 的监视工具,提供系统的动态即时视图
详见文档 db2top - Db2 監視工具 指令
查看动态sql视图,找出最耗时sql,最占cpu的sql步骤如下:
- 设置字符编码
export LANG=en_US.UTF-8
中文模式下可能会出现乱码或者显示不全等问题。 - 执行命令
db2top -d [数据库名] -u [用户名] -p [密码] -i 1- -i 屏幕更新时间 1s
- 获取最耗时的sql语句
- 按D,进入动态sql监控
- 按z,倒序排序,会提示按第几列排序(从0开始),输入3,回车
- 按L,查看sql文本,会提示查看那个sql的hash,输入hashvalue,回车
jvm调优分析
-
查看java进程
jps -l前面数字是java进程pid,后面是进程名,可加参数
-l显示全称 -
查看jvm启动参数
jcmd <pid> VM.flags-XX:InitialHeapSize=209715200初始堆大小-XX:MaxHeapSize=209715200最大堆大小-XX:MaxNewSize=104857600最大年轻代大小-XX:NewRatio=1老年代与年轻代的比-XX:+UseParallelGC多线程gc
-
查看堆内存,使用占比
jstat -gc [pid] [屏幕刷新间隔] [打印几次]jstat -gcutil [pid] [屏幕刷新间隔] [打印几次]- S0C:第一个幸存区的大小,单位KB,C:capacity
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小,U:used
- S1U:第二个幸存区的使用大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法区大小,1.8后元空间,使用物理内存
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间,单位s
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间,单位s
- GCT:垃圾回收消耗总时间
- S0:幸存1区当前使用比例
- S1:幸存2区当前使用比例
- E:伊甸园区使用比例
- O:老年代使用比例
- M:元数据区使用比例
- CCS:压缩类使用比例
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
-
调节堆大小
-Xms初始堆大小,例:-Xms200M-Xmx最大堆大小,例:-Xmx200M-Xmn年轻代大小,例:-XX:SurvivorRatio=N伊甸区与生存区比例 N:1:1 默认8,例:-XX:SurvivorRatio=8-XX:NewRatio=N老年代与年轻代比例 N:1 默认2,例:-XX:NewRatio=1
如何判断内存是否需要调优?
- gc次数是否频繁
哪个区频繁适当增加大小 - 回收率是否不高
哪个区不高适当增加大小