1.运行环境
Web服务器: Liberty(IBM J9 JDK) on K8S,base image : FROM websphere-liberty:20.0.0.3-kernel-java8-ibmjava
DB: DB2
WebApp 简介: 一个简单的Restful服务,从DB2 Select若干条数据
测试环境: 为防VPN及家里网络影响测试效果,在另外一个POD上装Jmeter,这样用POD调用POD,测试结果比较准确
2.调优前
2.1 环境设置
JVM: -Xms -Xmx : 2G Xmn:1G POD: memeory request: 3G, limit:4G, POD does not have CPU limitation
Liberty connector: <connectionManager minPoolSize=“50” maxPoolSize=“50" purgePolicy=“FailingConnectionOnly”/>
DB 最大连接数: 50
2.2 50个并发压测结果
3. 分析压测结果提出相应整改方案
3.1 结果
- Global GC 发生了11次,后面平均2分钟左右一次
- Local GC发生了558次,基本3-4秒一次
- Contrast 最多占了28%左右的工作线程,占了700M的内存
- 很多线程在执行new relic
- 很多线程park, 因为mybatis 在输出log (在这次压测之前,通过new relic分析调用栈发现占用时间最多的是打印log,原来通过AOP记录日志的代码已经关闭)
Park的线程数占到23%
调用Unsafe.park 的线程占到39%
第一次dump的内存使用率
Nursery Area Free : 767,422,912 bytes Total : 1,048,576,000 bytes 73 % free
Tenured Area Free : 951,384,856 bytes Total : 1,098,907,648 bytes 86% free
最后一次dump的内存使用率
Nursery Area Free : 791,680,088 bytes Total : 1,048,576,000 bytes 75 % free
Tenured Area Free : 671,331,936 bytes Total : 1,098,907,648 bytes 61% free
3.2 措施
- 调整Xms Xmx 为 4G, Xmn为2G
- 关闭Contrast 和 new relic
- 调整日志level为error,即很少有日志输出。
4.3 效果
1. Local GC每1-2s一次,反而更多(调整前是3-4s),因为Throughput 加大,每秒处理的请求从39变成了630,所以GC更频繁,但是每次回收效果不错, 所以尚可接受
2. Global GC 就没有发生,即压测的半个小时没有Global GC
3. Park 的进程数由23%左右变成11%左右
4. 平均响应时间由1260ms 变成 79.2ms, 原来的运行时间是现在的16倍,Trasactions/s由39变成630
5. 小tips
5.1. IBM Thread and Monitor Dump Analyzer for Java (TMDA) ---jca467.jar
利器,可以分析java core 文件, 查看GC做了多少次,每次的效果如何,以及有多少个线程在Park,wait, wait的资源是什么,当时线程执行的方法是什么
下载: https://www.ibm.com/support/pages/ibm-thread-and-monitor-dump-analyzer-java-tmda
下面两个视图是最爱,可以分别从Thread的角度、从方法的角度看Thread的情况,通过这个我们发现了很多线程在打印mybatis日志时part
5.2 IBM HeapAnalyzer--ha457.jar
利器2,可以分析heap dump. 看到内存泄露的地方,我们通过这个工具发现 contrast占用了600M左右的内存,是推荐第一的可能内存泄露的地方。--
下载:https://www.ibm.com/support/pages/ibm-thread-and-monitor-dump-analyzer-java-tmda
5.3. liberty生成dump 文件的方式
liberty 生成 dump 文件命令: ./server dump --include=thread,heap
--include=thread: 生成java core 文件, 开始压测生成一次,压测过程中2分钟生成一次,由IBM Thread and Monitor Dump Analyzer for Java打开
--include=heap: 生成heap dump ,由IBM HeapAnalyzer打开
https://www.ibm.com/support/pages/node/476701
一般先生成java core, 大致的看一下