压力测试7分钟后,开始报NullPointerException

按照jDon 最简单的例子重写了原Jsp+Bean开发的程序。 使用loadRunner 进行压力测试, 目标为100/s.

初期表现非常好, 曲线特别平稳, 可是到大约7分钟-10分钟后,开始大量的NullPointerException异常抛出, 不知何故?

搜到一个类似的帖子也有相同问题,但没有答复。 是因为tomcat的链接池的连接数耗尽了吗? 那我应该怎么改?

提前谢谢老大们的帮助。

>NullPointerException异常抛出
这是出错的结果,要找到出错的原因,是在哪个页面出错,测试客户端情况如何,这些你写出来我看看,Jdon框架是经过严格压力测试的,不过也可能存在bug,所以,要看你测试用例情况

2007-10-23 17:16:55,477 - 859422 ERROR [ajp-8009-15] dao.JokeJdbcDAO - JokeJdbcDAO getJokesnull
2007-10-23 17:16:55,477 - 859422 ERROR [ajp-8009-20] interceptor.CacheInterceptor - [JdonFramework]CacheInterceptor Exception error:java.lang.NullPointerException
2007-10-23 17:16:55,477 - 859422 ERROR [ajp-8009-10] interceptor.CacheInterceptor - [JdonFramework]CacheInterceptor Exception error:java.lang.NullPointerException
2007-10-23 17:16:55,477 - 859422 ERROR [ajp-8009-15] interceptor.CacheInterceptor - [JdonFramework]CacheInterceptor Exception error:java.lang.NullPointerException

按照一个帖子提供的思路,大概是tomcat连接池里的连接耗尽了,所以在tomcat 连接池配置中设置了:
removeAbandoned="true"
removeAbandonedTimeout="60"
logAbandoned="true"

情况有所改观。第一次压耗时15分钟, Pass 16378, Fail 44. 但是第二次再压15分钟,10分钟后, 大量错误仍然出现,性能也显著下降, 最后不得不停止继续加压测试。

而这时, 在用ie浏览也不行了。必须重起tomcat服务。

基本上都是7分钟,10分钟后,开始出错。 Log报上帖的信息

DB Connection找不到了?



[该贴被little1234于2007-10-23 17:45修改过]

将所有的东西重置清空,又试了一遍,

也是差不多在Pass了17475个Transaction后, 开始第一个错:
interceptor.CacheInterceptor - [JdonFramework]CacheInterceptor Exception error:java.lang.NullPointerException

后面的所有Request基本上就都是错了。 服务需要重启才能恢复。

Banq, 紧急求助! 谢谢

又跟踪测了一次, 随着时间的增长, cpu的繁忙程度显著增长, 从一开始的15%到8分钟以后的68%, 而同期memory却没增长多少。测试结束后, 用IE一访问: 报java.lang.OutOfMemoryError: Java heap space

是因为memory的原因?

使用最新JdonFramework5.1试验一下,老版本在缓存并发上是有些BUG

将jvm的memory加大到了80%的物理memory。 压力测试到通过15377个transaction时,cpu突然猛增到100%。

请教老大, 性能调优该怎么进行?

banq, 急需你的指引。 谢谢!

>cpu突然猛增到100%。
这是正常的,因为垃圾回收机制开始起作用,非常占据CPU,所以,我们一般尽量不要让垃圾回收机制起作用,就要通过POOL和Cache控制资源,把你的主要功能测试的Service implements Poolable,这样就套上POOL,Model套上Cache。

还有下载最新的JdonFramework 5.1

今天早上刚重下了jDonFrameWork重新部署了一下

我的系统是win2003 server, apache2.0.49, mod_jk2 2.0.4 tomcat6.0.14

tomcat的原始参数只改了:
Initial memory pool 1024M, Maximum memory pool 1024M, Thread stack size 2000KB (我物理内存2G)

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
maxThreads="500" minSpareThreads="50" maxSpareThreads="350"
enableLookups="false" acceptCount="100" debug="0"
connectionTimeout="30000" disableUploadTimeout="true" />

apache 从原始配置上加了:
MaxKeepAliveRequests 10000

<IfModule mpm_winnt.c>
ThreadsPerChild 1500
MaxRequestsPerChild 7000
</IfModule>

LoadModule cache_module modules/mod_cache.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so
<IfModule mod_cache.c>
CacheForceCompletion 100
CacheDefaultExpire 3600
CacheMaxExpire 86400
CacheLastModifiedFactor 0.1

# <IfModule mod_disk_cache.c>
# CacheEnable disk D:/httpcache/diskcache
# CacheRoot D:/httpcache/cacheroot
# CacheSize 647680
# CacheDirLength 4
# CacheDirLevels 5
# CacheGcInterval 4
# </IfModule>
<IfModule mod_mem_cache.c>
CacheEnable mem D:/httpcache/memcache
MCacheSize 8192
MCacheMaxObjectCount 10000
MCacheMinObjectSize 1
MCacheMaxObjectSize 51200
</IfModule>
</IfModule>

现在压力一段时间后,cpu100%。 哪错了?

> 把你的主要功能测试的Service implements Poolable,这样就套上POOL,Model套上Cache

我的ServicePOJOImp已经implements Poolable 了, Model是extends Model的。 我看Model是 implements ModelIF which extends Cacheable, Cloneable, Serializable. 所以这些我已经使用了jdon 框架,就不用自己考虑了吧??

是的,动态网页不必设置Apache的缓存,我给你httpd.conf参数:
Timeout 120
KeepAlive on
MaxKeepAliveRequests 1000
KeepAliveTimeout 2
<IfModule prefork.c>
StartServers 10
MinSpareServers 10
MaxSpareServers 20
ServerLimit 2000
MaxClients 1000
MaxRequestsPerChild 10000
</IfModule>
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 10
MaxSpareThreads 20
ThreadsPerChild 60
MaxRequestsPerChild 0
</IfModule>

资源要控制,不能太大,否则CPU当然要100%

太谢谢banq了。

我用了你的apache配置。另外,按照你指引的思路仔细检查了一遍我的code, 发现有两个util class没有搁在jDon框架下, 我把它们改写成singleton 了。

刚才又测了一遍, cpu一直使用很平稳, 30%-40%之间, memory也基本没动过。原来大量出现的CacheInterceptor Exception error:java.lang.NullPointerException 在passed transactions 为24743的情况下只出现了一次。

看来I am on the right track.

继续测试研究。 谢谢banq及时雨般的支持。 :)

太好了,我刚刚又更新了JdonFramework中UtilCache,15:50左右刚上线可以下载,你再下载一下,应该一次也不会出现java.lang.NullPointerException。