高手的存在,就是让服务10亿人的时候,你感觉只是为你一个人服务......

记一次session对象太多导致gc频繁问题

目录
  1. 1. 解决方案

同事最近在压测一个请求,逻辑处理很简单(从DB取信息,返回页面)。

压了大概15分钟,发现tps开始剧烈波动。

我看了一下cpu、io,都不高。监控了gc情况,发现ygc和fgc很频繁,而且时间较长。

Alt text


项目组新切换wildfly8作为web容器,

把jvm堆栈dump下来,用mat分析。发现undertow session对象占用大部分内存。

Alt text

Alt text

与项目组沟通,确定业务逻辑中没有session的处理,因为之前使用的jboss6,内置tomcat容器,怀疑是升级到wildfly,undertow容器导致的问题。项目组要求切换到tomcat容器,再压测试试。

切换至tomcat7,继续压测,问题如旧。dump如下:

Alt text

Alt text


分析一波session timeout,业务应用web.xm中都没有配置,jboss和tomcat默认是30分钟。修改tomcat的session timeout为1分钟,压测后没出现问题;切换回wildfly,在业务应用的web.xml中增加session timeout配置为1分钟,压测后也没问题。确认是session对象太多引起。

这边压测单机tps 3000,也就是说每分钟会创建18w个session对象,就算是空的session(其实就是hashmap),每个也有几k大小。


解决方案

项目中使用sitemesh-freemarker

1
2
3
4
5
6
7
8
<filter> 
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>*.htm</url-pattern>
</filter-mapping>

发现sitemesh会设置session,由于整个项目不需要session设置,将sitemesh session相关逻辑重写,解决了问题。

去掉以下:

Alt text

sitemesh参考:http://www.xuebuyuan.com/3243237.html