相同环境,java运行速度慢几倍
问题描述
在本地环境中执行数据库查询的时间是1s左右,而在paas平台中执行相同操作时,需要消耗6秒左右。操作的数据是一样的。
问题分析过程
1、调整容日的基本参数和jvm的参数和本地一致,尽量排除环境参数的干扰。
本地环境:cpu 8核,内存16G。jvm配置参数:Xms\Xmx 8192m\8192m
docker容器:cpu 8核,内存16G。jvm配置参数:Xms\Xmx 8192m\8192m
调整之后重新部署服务,问题依旧存在。
2、查看容器的运行参数:cpu和内存利用率。
使用docker stats 容器id 查看。注意:paas平台的性能统计的最小时间粒度是分(因平台而异),不能实时反映容器的运行参数。–被这个性能参数误导了好久。
不进行操作的时候cpu利用率在20%左右,一旦执行查询操作,cpu利用率飙升,大于100%。
与本地对比,本地在执行操作的时候cpu利用率在40%左右。嘻嘻,出现点眉目。
3、增大cpu核数。问题仍未解决。查询是单线程操作,和cpu核数应该没有什么关系。
4、查看启动脚本,发现jvm开启了的debug模式。关闭debug模式,继续尝试。问题解决,查询速度和本地一致。操作时,cpu利用率在40%左右。
总结:jvm开启debug模式后,比较消耗cpu!!!
问题查询过程中的知识积累
1、查看docker容器运行状态:
docker stats 容器id
2、jvm参数
ms/mx:定义YOUNG+OLD段的总尺寸,ms为JVM启动时YOUNG+OLD的内存大小;mx为最大可占用的YOUNG+OLD内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
NewSize/MaxNewSize:定义YOUNG段的尺寸,NewSize为JVM启动时YOUNG的内存大小;MaxNewSize为最大可占用的YOUNG内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
PermSize/MaxPermSize:定义Perm段的尺寸,PermSize为JVM启动时Perm的内存大小;MaxPermSize为最大可占用的Perm内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
SurvivorRatio:设置Survivor空间和Eden空间的比例
参考出处