最近项目遇到一个问题,很让人头痛,服务器上面部署的应用,经常性的挂,cup和内存飙高,还被客户投诉,再次分享排查的过程
1、截取了这几次挂的日志,发现mybaits报错了,这个错误大致是,使用方法不对,用selectone查多条数据就会报错,然后频繁操作,开始以为,抛异常会导致链接池不会收回,所以连接数不够,导致的,所以修改了这个bug
2、改了这个bug但是情况并没有变好,然后去看了free -m
服务器是8G内存,但是有3G缓存没有使用,当开始以为是这个问题,和阿里云人员了解后,也排除了这个问题。
3、用top看了服务器上面占用的内存和cpu使用率发现链接数据库的应用和数据库占的内存最多,然后看了下tomcat的配置内存配置了1024M,但实际内存使用率是远大于1024M的
4、用服务器监控工具jstat看了下
1、jstat命令
1.1参数:-gcutil
[root@VM_210_36_centos mysql] # jstat -gcutil 23183 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 39.72 65.03
11.54 91.78 87.99 473
10.556 6 2.129 12.686 |
说明:
S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
发现收内存回收率太频繁,具体你们自己去了解,然后了解了相应的知识和参考jvm的配置文档,配置S0、S1、E、Old内存区,并调高内存
JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:-UseGCOverheadLimit"
5、看是监控sql看起了慢查询,但是对性能有很大的影响,关掉了慢查询
6、重新配置数据库的参数
read_buffer_size=128M
read_rnd_buffer_size=128M
sort_buffer_size=128M
innodb_additional_mem_pool_size=256M
innodb_log_buffer_size=128M
tmp_table_size = 32M
经过这些操作现在项目可以平稳运行,而且没有数据操作时,cup立马降下来