最近用loadruner测试一个即将上线的站点,WEB和数据库分别装在了两台SUSE服务器上。在测试过程中遇到了一些小麻烦,在几个同事的合作下解决了问题。
一开始就用loadruner创建200个线程对网站进行注册测试,每个线程注册1000次。麻烦的事情出现了,数据库服务器、web服务器、loadruner客户端负载都很小,既没有发现瓶颈这个问题。开始还以为是网络问题,后来把loadruner客户机和两台服务器都放到千兆交换机上了,结果还是一样。数据库记录插入很缓慢,在loadruner测试一段时间后,Tomcat停止响应了。我们只能把tomcat的线程dump出来分析,在linux下可以使用
#
kill -
3
tomcat_java_pid
这时候dump出来的数据$tomcat_home/logs/catalina.out文件中看到,结果发现很多线程都在等待一个资源锁,查看上下代码堆栈,发现这和国际化资源文件有关。这时候才想起来,为了方便开发,我们把参数struts.i18n.reload设置成true了,于是每个线程都要重新载入国际化资源文件。把该参数改成false后,我们还把struts.configuration.xml.reload和struts.devMode都设置成false了。
接着再启动loadruner,这时查看数据库记录插入速度,明显比以前快了很多,loadruner测试结果也高了不少。但高兴的还是太早了,我们加大了连接池的最大连接数后再进行测试,loadruner客户机的网络使用率基本到达了80%,这时终于看到点瓶颈了,100M的客户机网卡看来是无法满足我们的要求了,可是这样跑了一段时间后,又像上一次一样,tomcat基本上又停止了响应。我们又把线程给dump了出来,再对其进行了分析,这次看到大量线程读取Freemark的templet过程中,需要等待一个资源锁。这也意味着,每个线程过来的时候,都需要重新读取templet(我们定义了一套struts2的form模板)。在搜索引擎上找了好些时间,对于这个问题,我还是有一定方向的,因为之前对jforum进行了二次开发,知道jforum里面对于Freemark的templet有开发模式的选择,查了一下代码,freemarker.template.Configuration类有个setTemplateUpdateDelay方法,在dump出来的代码堆栈中有 org.apache.struts2.views.freemarker.FreemarkerManager类的createConfiguration()方法,读struts的API时发现该方法会读取classpath下的freemarker.properties文件,google中搜索freemarker.properties,发现有template_update_delay参数设置。
后记:后来发现struts2官方文档有也有性能调整说明: struts2性能调整
一开始就用loadruner创建200个线程对网站进行注册测试,每个线程注册1000次。麻烦的事情出现了,数据库服务器、web服务器、loadruner客户端负载都很小,既没有发现瓶颈这个问题。开始还以为是网络问题,后来把loadruner客户机和两台服务器都放到千兆交换机上了,结果还是一样。数据库记录插入很缓慢,在loadruner测试一段时间后,Tomcat停止响应了。我们只能把tomcat的线程dump出来分析,在linux下可以使用
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
接着再启动loadruner,这时查看数据库记录插入速度,明显比以前快了很多,loadruner测试结果也高了不少。但高兴的还是太早了,我们加大了连接池的最大连接数后再进行测试,loadruner客户机的网络使用率基本到达了80%,这时终于看到点瓶颈了,100M的客户机网卡看来是无法满足我们的要求了,可是这样跑了一段时间后,又像上一次一样,tomcat基本上又停止了响应。我们又把线程给dump了出来,再对其进行了分析,这次看到大量线程读取Freemark的templet过程中,需要等待一个资源锁。这也意味着,每个线程过来的时候,都需要重新读取templet(我们定义了一套struts2的form模板)。在搜索引擎上找了好些时间,对于这个问题,我还是有一定方向的,因为之前对jforum进行了二次开发,知道jforum里面对于Freemark的templet有开发模式的选择,查了一下代码,freemarker.template.Configuration类有个setTemplateUpdateDelay方法,在dump出来的代码堆栈中有 org.apache.struts2.views.freemarker.FreemarkerManager类的createConfiguration()方法,读struts的API时发现该方法会读取classpath下的freemarker.properties文件,google中搜索freemarker.properties,发现有template_update_delay参数设置。
后记:后来发现struts2官方文档有也有性能调整说明: struts2性能调整