压测结果不理想分析

91 阅读3分钟

分析

压测结果不理想,比如只有 十几TPS。该怎么调优
可从如下方面考虑:

  • 硬件
    • cpu
    • 内存
    • 网络
      查看应用容器(服务器)、数据库服务器、web服务器
  • 软件
    • nginx
    • 数据库连接
    • web容器tomcat
    • jvm堆
    • 微服务服务通信(openfeign、jsf)
  1. 服务器硬件配置
    • 数据库服务器 16c 32g
    • 应用服务器 4c 8g
  2. java应用堆内存设置
    • 80%物理内存
  3. 挑选慢sql,cpu高的sql
    • 数据量大,索引
  4. 连接数配置
    • 数据库连接数 db2
    • tomcat连接数、线程池
    • nginx连接数、线程数
    • 微服务连接数(JSF)
  5. 其他
    • 日志不要使用debug级别

压测过程中,监测 CPU、内存情况是什么样的,(数据库、应用)
适当增加日志,分析是哪个接口响应慢
排除其他系统的干扰。

db2top命令使用

db2 的监视工具,提供系统的动态即时视图
详见文档 db2top - Db2 監視工具 指令

查看动态sql视图,找出最耗时sql,最占cpu的sql步骤如下:

  1. 设置字符编码 export LANG=en_US.UTF-8
    中文模式下可能会出现乱码或者显示不全等问题。
  2. 执行命令 db2top -d [数据库名] -u [用户名] -p [密码] -i 1
    • -i 屏幕更新时间 1s
  3. 获取最耗时的sql语句
    1. 按D,进入动态sql监控
    2. 按z,倒序排序,会提示按第几列排序(从0开始),输入3,回车
    3. 按L,查看sql文本,会提示查看那个sql的hash,输入hashvalue,回车

jvm调优分析

  1. 查看java进程
    jps -l

    jps.png

    前面数字是java进程pid,后面是进程名,可加参数 -l 显示全称

  2. 查看jvm启动参数 jcmd <pid> VM.flags

    jcmd.png

    • -XX:InitialHeapSize=209715200 初始堆大小
    • -XX:MaxHeapSize=209715200 最大堆大小
    • -XX:MaxNewSize=104857600 最大年轻代大小
    • -XX:NewRatio=1 老年代与年轻代的比
    • -XX:+UseParallelGC 多线程gc
  3. 查看堆内存,使用占比
    jstat -gc [pid] [屏幕刷新间隔] [打印几次] jstat -gcutil [pid] [屏幕刷新间隔] [打印几次]

    jstat.png

    • 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:垃圾回收消耗总时间

    jstat1.png

    • S0:幸存1区当前使用比例
    • S1:幸存2区当前使用比例
    • E:伊甸园区使用比例
    • O:老年代使用比例
    • M:元数据区使用比例
    • CCS:压缩类使用比例
    • YGC:年轻代垃圾回收次数
    • YGCT:年轻代垃圾回收消耗时间
    • FGC:老年代垃圾回收次数
    • FGCT:老年代垃圾回收消耗时间
    • GCT:垃圾回收消耗总时间
  4. 调节堆大小

    • -Xms 初始堆大小,例:-Xms200M
    • -Xmx 最大堆大小,例:-Xmx200M
    • -Xmn 年轻代大小,例:
    • -XX:SurvivorRatio=N 伊甸区与生存区比例 N:1:1 默认8,例:-XX:SurvivorRatio=8
    • -XX:NewRatio=N 老年代与年轻代比例 N:1 默认2,例:-XX:NewRatio=1

如何判断内存是否需要调优?

  1. gc次数是否频繁
    哪个区频繁适当增加大小
  2. 回收率是否不高
    哪个区不高适当增加大小

参考文献

  1. JVM:利用jstat查看GC信息及堆内存设置(二)