项目中用到spring+tomcat+hibernate,目前在压力测试一个servlet,该servlet实现的功能为保存数据进数据库,在用jmeter压力测试时发现个别的tomcat线程阻塞较久,用jprofiler监测发现为conn.preparedStatemenet延迟较久,以下为jprofiler监测情况,有人知道为什么会在这里延迟吗,该如何解决。。
上传不了图片,只好把图片放到博客里了
压力测试都做些什么,调用conn.preparedStatemenet的部分主要做些什么?
执行conn.preparedStatemenet里的SQL是什么,是查询还是添加或更新?
感觉是SQL执行时间太长。
造成SQL执行时间长的可能情况有:
1.SQL语句本身写得不好,得优化。
2.有人锁住了该SQL相关的表,造成该SQL一直在等待。
3.代码在并发时存在资源的竞争造成SQL等待。(在压测时,可查看连接池是否被占満了吗,如果点満可加大连接池的连接数)
你的代码里要是有配置C3P0等,可以在JCONSOLE里看当前使用的连接数(目前我用得最多的是这个),如果不行的话你可以先假设你允许开的最大连接数是30个,压测在30个以内线程并发测试时,看下结果。然后按部数增长,如果谁着压测线程的提高,而出线你那种情况,感觉就是在等待连接了。
你连到JCONSOLE时,能看到MBEAN选项卡吗,
MBEAN选项卡里应该有一个C3P0的类,找到他的ATTRIBUTE
看看
30个线程并发,只执行一次?
不要执行多次
永久链接: [url]http://suziwen.iteye.com/blog/619468[/url]
JCONSOLE图片
点击REFRESH里,如果有连接在使用,那个numbusyconnection就有相应的数字
可能你那边还得配置一下,主要是这个功能不是我配置的,一直也没怎么研究配置这个查看连接使用情况,。。。
Log4j性能调优
相关地址:
http://harrywu304.blog.163.com/blog/static/8456603200942873354876/
log4j配置操作
http://www.blogjava.net/toby/archive/2008/12/31/249331.html
log4j与JDK LOG的比较
http://www.iteye.com/topic/472832
其中
log4j.appender.monitorAppender.BufferedIO=true
log4j.appender.monitorAppender.BufferSize=8192
这个选项用于告诉log4j输出日志的时候采用缓冲的方式,而不是即时flush方式,并且设定了缓冲为8K,8K是默认值,可以根据日志输出的情况来修改。这个选项很重要,在测试中发现,当并发访问很高,例如每一秒100个并发以上,使用缓存跟不使用缓冲差距很大。具体数字我这里就不列出来了。
另外我想说的是,log4j输出缓冲日志是以8K为单位的,因为磁盘的一个block为8K,这样可以减少碎片,也就是说假设你设置缓存为18K,log4j在16K(8K*2)的时候就会输出),而不是18K。