同事线上埋的这个坑,我整整找了3天3夜( 二 )


本文插图
2.redis请求超时
同事线上埋的这个坑,我整整找了3天3夜
本文插图
3.jdbc连接超时
同事线上埋的这个坑,我整整找了3天3夜
本文插图
4.通过gc查看 , 发现24小时内 , FullGC发生了152次
同事线上埋的这个坑,我整整找了3天3夜
本文插图
5.再看看堆栈 , 发现有一些线程阻塞和死锁
jstat -l pid , 也可以通过VisualVM分析
同事线上埋的这个坑,我整整找了3天3夜
本文插图
6.发现有2000多个线程请求无效资源
同事线上埋的这个坑,我整整找了3天3夜
本文插图
(三)造成本次系统异常主要因素分析
(1)在秒杀时 , 请求量过高 , 导致运用服务器负载过高;
(2)redis连接池满 , 获取不到连接 , connot get a connection from thread pool
(3)jdbc连接池满 , 获取不到连接和超时
(4)存在大对象代码 , 如向list集合中不停添加对象 , 不能及时回收对象导致内存增加 , 频繁发生Full GC
(5)tomcat并发参数 , jvm优化参数 , jedis配置参数 , jdbc配置参数不合理
(6)未对请求量进行削峰和限流
(7)资源连接未及时释放 , 如redis连接 , jdbc连接未及时释放
五、最终解决方案
1.增加运用服务 , 做流量削峰和分流
由于该项目未增加MQ , 因此只能采用硬负载 , 增加服务器水平扩展方式来实现流量削峰和流量分流
同事线上埋的这个坑,我整整找了3天3夜
本文插图
2.优化jvm参数 , 如下为本次优化后的参数
JAVA_OPTS=''-server -Xmx9g -Xms9g -Xmn3g -Xss500k -XX:+DisableExplicitGC -XX:MetaspaceSize=2048m -XX:MaxMetaspaceSize=2048m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Dfile.encoding=UTF8 -Duser.timezone=GMT+08''关于这个jvm参数的优化 , jvm理论是怎样的 , 官方建议是怎样的 , 实战是怎样的 , 将在下篇文章中分析 。
3.优化tomcat并发相关参数
主要是两方面:
(1)修改bio协议为nio2 (2)根据服务器配置 , 业务场景 , 业务流量等合理设置相关参数 , 尽量达到最优
同事线上埋的这个坑,我整整找了3天3夜
本文插图
关于tomcat相关参数优化 , 在接下来的文章中分析 。
4.redis 和jdbc参数优化
由于涉及到安全性问题 , 这里不列出
5.代码优化
(1)优化掉大对象
(2)优化未及时释放的对象和连接资源
6.解决000多个线程请求无效资源问题
在conf/context.xml增大缓存

六、最终优化结果
经过几天观察 , 系统平稳
1.基本监控
同事线上埋的这个坑,我整整找了3天3夜
本文插图
2.GC
同事线上埋的这个坑,我整整找了3天3夜
本文插图
3.抽样器cou和内存
cpu
同事线上埋的这个坑,我整整找了3天3夜
本文插图