对JSP进行压力测试的问题
创建了一个WEB工程,WEB工程只有一个JSP页面,JSP不进行任何的操作。我压了8分钟后,tomcat就崩溃掉。
站点环境:
在AMD双核、串口7200转硬盘、金士顿内存2G
站点情况:
站点WEB服务器
tomcat6.0
WEB服务器的JVM
1024M
站点宽带情况
网通2M
测试内容
对test.jsp页面进行压力测试
测试计划
50个用户并发。刚开始只有20个用户,每30秒增加20个。测试持续30分钟,30分钟后,每1分钟减少10用户。
测试结果:
压8分钟后,就会出现
java.lang.OutOfMemoryError: Java heap space
在我看。不可能那么快就崩溃掉才对啊。
[quote]现在的问题是同时50个人,就出现OutOfMemory啦。照你的说法,50个人,也只创建50个session才对呀。 [/quote]
我之前已经说过,你的测试方式有问题,你测试中的一个人操作一次,就会新增一个Session。
如果测试中50个人,每个人1秒钟访问一次,则1分钟生成的Session的个数是: 50*1*60 = 3000,如果是在局域网中进行测试,访问一个网页所需要的时间可能只有0.1秒左右,所以1秒内一个用户可以点击页面10次,则每分钟生成的Session数就更多。
而真正的浏览器在访问某个网站时,网站会给其返回相应的Session-ID,浏览器会自动地将Session-ID保存在Cookie中,你刷新页面之后,浏览器会自动将Session-ID传送给服务器。
你模拟测试时,用户在收到服务器响应后,应该不会将Session-ID保存下来吧?
如果保存下来,用户有没有将Session-ID又传送给服务器?
如果没有这样做,你模拟的用户每点击一次,则Tomcat会其分配一个新的Session。
如果还不能理解,建议你去网上查查JSP Session机制,了解一下原理。然后这个问题就可以解决了。
这个问题和我之前遇到的一个问题有点类似,个人感觉和你的测试方法有关。
你的一个用户是不是相当于一个IE打开一个页面?
如果是,那么在30分钟的测试过程中,Tomcat会生成N多的Session,导致了OutOfMemory,你可以把Session的超时时间改小再试一下,
在%tomcat%/webapps/某个应用/WEB-INF/web.xml 中,有如下配置:
[code="java"]
30
[/code]
你把session-timeout的值改成1,再进行测试,应该不会出现OutOfMemory了。
[quote]zhao3546 写道
这个问题和我之前遇到的一个问题有点类似,个人感觉和你的测试方法有关。
你的一个用户是不是相当于一个IE打开一个页面?
如果是,那么在30分钟的测试过程中,Tomcat会生成N多的Session,导致了OutOfMemory,你可以把Session的超时时间改小再试一下,
在%tomcat%/webapps/某个应用/WEB-INF/web.xml 中,有如下配置:
Java代码
30
<session-config>
<session-timeout>30</session-timeout>
</session-config>
你把session-timeout的值改成1,再进行测试,应该不会出现OutOfMemory了。
一般Session是什么时候创建一次呢? [/quote]
刚开始只有20个用户,每30秒增加20个
你一共创建了20个+40个/分*8分钟=340个 session后出现OutOfMemory了,340个不多吧!
请 lzj0470 尝试将 Session 超时时间改成 1 再试一下,还会不会出现OutOfMemory的问题。
一般Session是什么时候创建一次呢?
如果是IE,IE第一次打开页面的时候,Tomcat会创建Session;
对应你的模拟测试,一个用户的一次操作就会创建一个Session。
下面我来回答一下 elf8848 的疑问:
[quote]刚开始只有20个用户,每30秒增加20个
你一共创建了20个+40个/分*8分钟=340个 session后出现OutOfMemory了,340个不多吧![/quote]
实际不是这么算的,这里的用户和“我们用IE访问某页面对应的用户”概念不一样。
如果用同一个IE访问同一个页面,不论你访问多少次,只要Session不超时,都只对应一个用户,而lzj0470 模拟的用户的一次操作就对应一个Session。
所以要管用户数的话,请算30分钟内,所有的用户点击页面的总次数。
[quote]我把它修改成1,是没有这个问题了。那么我是不是自己创建的服务端Session.也是在一分钟之内超时了。也是不能用了? [/quote]
一般Session的超时时间设为半小时。
你考虑一下,你的网站的实际可能的最大在线人数是多少?
如果你的网站流量不大的话,实际上不会有大的影响。
即使有1000人同时在线,Tomcat才创建1000个Session,这个占用的内存是比较小的。
一个人在访问你的网站后,把浏览器关闭了,则Tomcat会自动将该用户对应的Session给释放掉。
所以,一般情况下,不需要考虑这个问题,
如果访问量非常大,根据我之前的经验,可能会先出现其它问题,比如,页面响应慢,服务器负荷过大等,因Session过多引起OutOfMemory在实际应用过程中我还真没有遇到过,之前因Session引起的OutOfMemory也是在自己做性能测试时出现的。