JAVA程序性能调优(一)
来源:互联网 发布:尼康失真控制数据 编辑:程序博客网 时间:2024/06/09 16:29
性能调优
官网理论:
https://docs.oracle.com/cd/E19900-01/819-4742/abeik/index.html
heap size xms=G1 eden space+G1 survivor space+ G1 old Gen space
newRatio=old gen/new gen
New gen= xmx/(1+newRatio)
The default NewRatio for the Server JVM is 2
故:New gen=xmx/3
配置推荐:
keep the eden size between one fourth and one third the maximum heap size.
each survivor space will be one eighth of the young generation.
keep heap size will be one half RAM memory
实验验证
背景,作为CI/CDteam ,为了解决性能测试环境部署复杂的问题,通过容器化思想一键部署环境,但基于k8s cluster部署的site 比搭建在物理ec2机器上的site,性能较差一些,压测时错误率更大些。分析探查原因。
1)物理site: url: https://clone-uconn-perf-test1.blackboard.com/
监控信息https://rpm.newrelic.com/accounts/672423/applications/61159309/instances
newrelic 关键字:cloud-learn-clone-uconn-perf-test1
由site url在captain上查找对应的aws的EC2机器ip信息,
然后ssh,查看进程、memory、disk等信息
emambp:learn ema$ ssh us+ipema@ip:~$ ps -ef|grep java bbuser 4110 2771 8 Nov20 ? 1-08:11:43 /usr/lib/jvm/java-8-oracle-amd64/bin/java -d64 -server -Dblackboard.wrapper.anchorfile=/usr/local/blackboard/apps/tomcat/work/tomcat.anchor -Dblackboard.wrapper.commandfile=/usr/local/blackboard/apps/tomcat/work/wrapper.command -Xss400k -Djava.io.tmpdir=/usr/local/blackboard/apps/tomcat/temp -Djava.security.manager -Djava.security.policy==/usr/local/blackboard/apps/tomcat/conf/catalina.policy -Djava.util.logging.config.file=/usr/local/blackboard/config/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dfile.encoding=UTF-8 -Dcatalina.home=/usr/local/blackboard/apps/tomcat -Dcatalina.base=/usr/local/blackboard/apps/tomcat -Dblackboard.home=/usr/local/blackboard -Dblackboard.shared.home=/usr/local/bbcontent -Dbbservices_config=/usr/local/blackboard/config/service-config.properties -Djava.awt.headless=true -Dcom.sun.management.jmxremote -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/blackboard/logs/tomcat -Xloggc:/usr/local/blackboard/logs/tomcat/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:ReservedCodeCacheSize=128m -XX:InitialCodeCacheSize=16m -javaagent:/usr/local/blackboard/apps/newrelic/lib/newrelic.jar -javaagent:/usr/local/blackboard/apps/jolokia/lib/jolokia.jar -Dcom.sun.management.jmxremote.port=8899 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Duser.timezone=US/Eastern -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1536m -Djava.util.prefs.userRoot=/home/bbuser -Djava.util.prefs.systemRoot=/home/bbuser/.java -XX:+CMSClassUnloadingEnabled -Dsun.net.inetaddr.ttl=60 -Djava.net.preferIPv4Stack=true -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 -XX:+UseStringDeduplication -Dsun.net.maxDatagramSockets=512 -XX:StringTableSize=200003 -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 -Djdk.tls.client.protocols=TLSv1,TLSv1.1,TLSv1.2 -Dsun.net.client.defaultConnectTimeout=30000 -Dsun.net.client.defaultReadTimeout=30000 -Dorg.apache.activemq.SERIALIZABLE_PACKAGES=java.lang,java.util,org.apache.activemq,org.fusesource.hawtbuf,com.thoughtworks.xstream.mapper,net.sf.ehcache.distribution -Xms8704M -Xmx8704M -Djava.library.path=/usr/local/blackboard/apps/service-wrapper/lib:/usr/local/blackboard/apps/tomcat/lib:/usr/local/blackboard/apps/exec/lib:/usr/local/blackboard/apps/oracle-client/lib64:/usr/local/blackboard/apps/sigar/lib -classpath /usr/local/blackboard/apps/service-wrapper/lib/wrapper.jar:/usr/lib/jvm/java-8-oracle-amd64/lib/tools.jar:/usr/local/blackboard/apps/tomcat/lib/bb-tomcat-bootstrap.jar:/usr/local/blackboard/apps/tomcat/bin/bootstrap.jar:/usr/local/blackboard/apps/tomcat/bin/tomcat-juli.jar -Dwrapper.key=7k9Tv6HXEC33LKVV -Dwrapper.port=32001 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=2771 -Dwrapper.version=3.2.3 -Dwrapper.native_library=wrapper.64 -Dwrapper.service=TRUE -Dwrapper.disable_shutdown_hook=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=2 org.tanukisoftware.wrapper.WrapperStartStopApp blackboard.tomcat.startup.ThreadDumpWrapper 1 start blackboard.tomcat.startup.ThreadDumpWrapper true 1 stop
配置如下:
tomcat配置参数heapsize:-Xms8704M -Xmx8704M 8G
登录物理机器看到top:
KiB Mem : 16431212 total, 900800 free, 11743668 used, 3786744 buff/cache
实验操作:5/24 开始导数据 10月23-25压测
10.23 下午10:30-11:30 NewRelic收集数据(1)
committed: old Gen:new Gen =6.25
used: old Gen:new Gen =4.7
压测期间gc峰值,
G1 young generation garbage collection 4%
G1 old generation garbage collection 23%
调优:通过NewRatio控制新生代老生代比例
2)
https://rpm.newrelic.com/accounts/672423/applications/71461475?tw%5Bend%5D=1508884995&tw%5Bstart%5D=1508861104
3)为了解决测试环境部署复杂的问题,通过容器化思想一键部署环境site on k8s
监控信息https://rpm.newrelic.com/accounts/672423/applications/107275816/instances
配置如下:
tomcat 启动参数配置-Xms 2048M -Xmx 2048M
yml文件部署deployment的时候,request memory参数 10240M= 10G
12.5 下午4:00-6:00 压测,前面一段时间导数据
15:30-15:31 导数据阶段 数据(2)
committed: old Gen:new Gen =1.7
17:34-17:35 压测末期 数据(3)
committed: old Gen:new Gen =13.6
used: old Gen:new Gen =23.6
三组数据,验证发现如下结论:
- heap size xms=G1 eden space+G1 survivor space+ G1 old Gen space
- 对比数据(2)(3),发现压测时,gc 从2.31%飙到31.5% 对比正常的物理site,只有4%左右的gc,明显不正常。
分析–
为什么会耗费大量cpu时间做gc 说明heapsize设置的较小,压测的case会大量创建object or function等等,heapsize马上被耗费完,则需要gc。所以查看对比 真实site的 heapsize的设置,发现确实比较小(2048M 对比 8704M) 。因为压测是同一批case。
调优实例1:
调整物理memory :16G
-xms 8792M xmx 8792M - 对比数据(1)(3),发现committed/used的old Gen heap usage与Eden space heap usage+G1 Survivor Space heap usage=G1 New Gen heap usage 的比例不等于 官网推荐的默认值2,都远远大于2。说明分配的比例不太合适。但奇怪的是查找源代码中没有发现关于
-XX:NewRatio=ratio-XX:NewSize=size-XX:MaxNewSize=size
的相关配置。疑问点???
调优实例2:
新老生代的比例 这个直接影响 minor gc 和full gc占用cpu的时间。且理论上,full gc比minor gc会更slow ,更耗时些。性能测试时,full gc 不能过高,否则影响溪能测试的效果。JVM参数NewRatio 可能需要调整。
题外话:
监控工具newrelic 中,apm -jvm 页面的数据信息(关于GC / Old space /eden space等信息)个人猜测应该来源于jstat。实时采集然后实时绘制。
Jstat是JDK自带的一个轻量级小工具。
命令格式
jstat命令命令格式:
jstat [Options] vmid [interval] [count]
参数说明:
Options,选项,我们一般使用 -gcutil 查看gc情况
vmid,VM的进程号,即当前运行的java进程号
interval,间隔时间,单位为秒或者毫秒
count,打印次数,如果缺省则打印无数次
示例说明
示例
通常运行命令如下:
jstat -gc 4110 5000即会每5秒一次显示进程号为4110的java进成的GC情况也可 输出到log文件,jstat -gc 4110 5000 >gc.log
ema@ip:~$ sudo jstat -gc 4110 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 0.0 65536.0 0.0 65536.0 667648.0 139264.0 8179712.0 2813164.3 641080.0 622188.4 84112.0 80447.9 21688 4787.188 0 0.000 4787.188
参考:
http://www.cnblogs.com/zhguang/p/Java-JVM-GC.html
https://www.journaldev.com/2856/java-jvm-memory-model-memory-management-in-java
https://docs.oracle.com/cd/E19900-01/819-4742/abeik/index.html
https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/memman.html
- JAVA程序性能调优(一)
- java 程序性能调优(总结一:概述)
- Java程序性能优化读书笔记(一):Java性能调优概述
- Java程序性能优化读书笔记(一):Java性能调优概述
- Java程序性能优化 读书笔记(一)Java性能调优概述
- Java程序性能优化(一)
- JVM虚拟机调优过程总结--来自java程序性能优化一书
- Linux系统Java程序性能调优
- Java程序性能调优步骤
- Java程序性能调优步骤
- Java程序性能优化-调优层次
- Java程序性能优化——性能调优层次
- Java 程序性能优化《第一章》Java性能调优概述 1.2性能调优的层次
- Java 程序性能优化《第一章》Java性能调优概述 1.1性能概述
- JAVA程序性能调优读书笔记 (1)-Java技巧
- Java性能调优_深入Java程序性能调优(并行开发、JVM调优)
- 笔记:Java程序性能优化 第七章 Java性能调优工具
- 《JAVA 程序性能优化》笔记:性能调优工具之Java VisualVM配置
- 信息增益-香农熵
- Ubuntu16.04安装wps并解决系统缺失字体问题
- Two Sum
- Spring Cloud (14) | 微服务不能从git/github/gitlab中获取数据库信息 can't load properties from git/github/gitlab
- Python基础篇之迭代
- JAVA程序性能调优(一)
- Lintcode:字符串查找
- SQL中关于EXISTS谓词的理解
- LeetCode-006 ZigZag Conversion
- 如何自学python
- 总结这7年前端UI框架的总结与发展
- TensorFlow中tf.train.exponential_decay的用法
- LXC:Linux 容器工具
- 未来工业智能峰会|看中船、中车的数据智能化之路