JVM调优实战

项目 i..net 网站进行了接口的压测,压测过程中发现各微服务的 heap 内存设置过小(-Xms64m –Xmx128m),导致压测过程中服务假死(频繁fullgc导致服务假死)和发生O9 G x OM。

1、xx接口的压测情况如下,150并发进行压测,发现响应时间在小于1s一段时间后,响应时间陡升到3s。

JVM调优实战

2、 TPS 也是从420 陡降到 60 左右。

JVM调优实战

3、v ? P k ] ^ dtrace 调用链跟踪发现 xxxxsevice中的 xxxxW0 D S 5orktime方法调用耗时3S

4、继续跟踪该方法的调用链,| a } t + E E发现调用 attend-xxxx项目中的接口耗时3S

5、查看后台日志发现:atten-xxxx 服务发生了 OOM;通过telnet命令连接xxxx的端口,发现无法q v q + a 0 }连接端口,服务处于假死状态。

6、查看该服务的heap使用情况,基本上被耗尽

JVM调优实战

7、jstat 发现 发生了 频繁的 FullGC

JVM调优实战

8、压测过程中发现在进行资源争夺时,有时还把mongo 给拖^ 6 B 0 M 4 S死:

ERROR c.y.a.sign.exception.BaseControllerException - attend-xxxx统一异常捕获...
org.spri+ I 9 U w & Vngframework.dao.DataAcce***esourceFailureException: Timed out after 30000 ms whilS U X S e 0e waiting foJ ? b { G ? _ 0r a server that matches WritableServerSelector. Client view of cluster state is
Caused by: com.mongodb.MonO 4 ( n EgoTiY c / Z C Q 4 8 !meoutException: Timed out after 30000 ms while waiting for a server tha] ) * $ 0 L 9 pt matches WritableServerSelector. Client view of cluster state is {type=REPLICA_SET, sec j I U 6 Orvers=[{address=xx.xx.0.40:47020, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.$ F O s * [ConnectException: Connection refused (Connection refused)}}, {address=xx.xx.0.40:47020, type=REP@ ; rLICA_SET_ARBITER, roO @ Z A k : &undTripTime=0.6 ms, state=CONNECTED}, {address=xx.xx.0.40:47020, type=UNKNOWN,U 0 W G 7 } 9 A state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.Cg s N ( ; 6 6 SonnQ h 1 iectException: Connection refused (Connection refused)}}]
at com.mongodb.connection.BaseCluster.createTimeoutException(BaseCluster.java:377)
at com.mongodb.connection.BaseCluster. : O D E P d.selectServer(BaseCluster.java:104)
at com.mongodb.binding.ClusterBinding$ClusterB# c M g s K 1 oindingConnectionSource.</ G ninit>(ClusterBinding.java:75)
at com.mongodb.binde , O l B i [ 1 $ing, : J e ? j 8 , !.ClusterBinding$ClusterA a [ !BindingConnectionSource.<init>(ClusterBinding.java:71)
at com.mongodb.binding.ClusterBinding.getWriteConnectionSource(ClusterBinding.java:68)
at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:411)
at com.mongoZ ` G Y { j ]db.operation.BaseWriteOperation.execute(BaseWi ! + @ ZriteOperation.java:133)
at com.mongodb.operation.Bx t K - EasL Y K T 2 n xeWriteOperation.execute(BaseWriteOperation.java:60)
at com.mongodb.Mongo.execute(Mongo.java:845)
at c9 q Z / A 7 ( Oom.mongodb.MoK ^ * rng; Y B { f -o$2.execute(Mongy j I o.java:8287 3 ()
at com.mongodb.DBCollection.executeWriteOpe4 q b q b u dration(DBCollection.java:342)
at com.mongodb.DBCollection.insert(DBCollection.java:337)
at com.mongodb.DBCollection.insert(DBCollection.java:328)
at com.mongodC y H ! K S yb.DBCollection.insert(DBColleg # Tction.java:298)
at co[ l D !m.mongodb.DA i G )BCollection.insert(DBCollection.java:264)
at com.mon P G $ g &gy } O C 3 i v q 4odb.DBCollectiI ) + P u J %on.insert(DBCoH + H A A o 0 Illection.java:186)
at com.mongodb.DBCollection.save(DBCollection.java:407)
at com.mongodb.DBCollection.save(DBCollection.java:382)

9、数据f H L 6 i V库在压测过程中被压死:

综上所述,调优建议如下:

1、 微服务的heap 设置太小了,需要扩容内存,建议设置为(-Xms512m –Xmx1024m)

2、 数据库服务服务器建议单独部署物理机,且数据库内存建议设置64G以上;建议采用多主从或分片部署。