Tomcat 7中的Web应用程序非常缓慢

11

我实现了一个启动Tomcat服务非常快的Web应用程序,但是当更多用户进入时,花费几个小时并且变得越来越慢(大约15个用户)。

检查内存使用率统计数据(20%),CPU(25%)

服务器特性:

  • 内存8GB
  • 处理器i7
  • Windows Server 2008 64位
  • Tomcat 7
  • MySql 5.0
  • Struts2
  • -Xms1024m
  • -Xmx1024m
  • PermGen = 1024
  • MaxPernGen = 1024

我没有使用Web服务器,我们直接发布在Tomcat上。

进入午夜之后,速度仍然很慢(只有1个在线用户)

我目前的解决方案是重新启动Tomcat服务,响应时间会再次变得很好。

是否有人遇到过这个问题?任何线索都将不胜感激。


没有更多的输入很难说什么。你需要检查应用程序为什么变得如此缓慢,是否有任何线程阻塞或类似的情况?我希望你已经通过了Struts2优化过程。 - Umesh Awasthi
3
会话膨胀。从您的描述中,似乎您的用户会话没有过期。请查看Tomcat管理界面,您可以在其中查看每个已部署的Web应用程序并查看活动会话数。您可能会发现有不合理数量的活动会话。还要查看确保您没有将过多内容存储到会话中。 - kolossus
5个回答

4
不提供足够详细的细节。需要更多信息 :(
使用htop或top查找每个进程和每个线程的内存和CPU使用情况。
CPU
4核系统中持续的25% CPU使用率可能表明单核应用程序/线程在其唯一能够使用的核心上运行100% CPU。
哪个应用程序正在占用CPU?
内存
20%的内存约为1.6GB。这比我期望的一个仅运行tomcat + mysql的空闲服务器要多一些。-Xms1024告诉tomcat预先分配1GB内存,这就解释了它。
更改tomcat设置为-Xms512-Xmx2048。在向其抛出一些用户时观察tomcat内存使用情况。如果它不断增长直到达到2GB ...然后冻结,那可能表明有内存泄漏。
磁盘
使用df -h检查磁盘使用情况。完整的分区可能会导致您遇到的问题。
Filesystem    Size  Used Avail Usage% Mounted on
/cygdrive/c     149G  149G  414M 100%   /

如果你在这个例子中发现我的笔记本电脑空间不足,那么你做对了 :D

日志

日志很棒。但是它们有一个坏习惯,就是占满磁盘。检查日志磁盘使用情况。当新用户连接时,是否适当地编写/删除/轮换日志?擦除日志是否可以解决问题?(在擦除之前将其复制到其他位置以进行将来的分析)

如果没有。日志仍然很棒。它们具有帮助您跟踪错误的好习惯。检查tomcat日志。您可能需要将日志记录级别设置为调试。网站崩溃时会发生什么?是否有有用的错误消息?是否仍然接收并接受Tomcat的用户连接?

应用程序

我假设25%的CPU时间用于tomcat(而不是mysql)。Tomcat本身不会失败。运行在其上的应用程序必须失败。尝试从tomcat中移除应用程序(最终可以放置一个hello world)。没有应用程序的情况下,tomcat能否在过夜的情况下继续工作?很可能可以,如果是这样,则故障在应用程序上。

在应用程序中启用完整的调试日志并尝试跟踪问题。在调试模式下直接从eclipse运行它,并将用户投放到其中。它是否以相同的方式一致地失败?

如果是,则在eclipse调试器中点击“暂停”并检查应用程序正在执行的内容。查看每个线程当前正在运行的代码片段及其调用堆栈。重复几次。如果出现死锁、无限循环或类似情况,可以通过这种方式找到它。

如果你幸运的话,现在已经找到了问题。如果没有,那么你不幸,并且这是一个可能深藏在应用程序内部的棘手bug。这会变得棘手而难以跟踪。毅力会带来成功。祝你好运 =)


2
我在一台干净的Centos7安装中遇到了Tomcat仪表板非常缓慢的问题,并找到了以下原因和解决方法:

Slow start up times for Tomcat are often related to Java's SecureRandom implementation. By default, it uses /dev/random as an entropy source. This can be slow as it uses system events to gather entropy (e.g. disk reads, key presses, etc). As the urandom manpage states:

When the entropy pool is empty, reads from /dev/random will block until additional environmental noise is gathered.
来源:https://www.digitalocean.com/community/questions/tomcat-8-5-9-restart-is-really-slow-on-my-centos-7-2-droplet 通过将以下配置选项添加到您的tomcat.conf或(首选)自定义文件中,可以修复此问题,并将其放入/tomcat/conf/conf.d/
JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"

2

针对性能问题,我们需要遵循以下规则:

  1. 为了提高效率,您可以将xms和xmx的大小设置成相等或接近。
  -Xms2048m
  -Xmx2048m
  1. 您还可以启用PermGen进行垃圾回收。

-XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled

  1. 如果页面更改太频繁而无法使用此选项,请尝试临时缓存动态内容,以便不需要一遍又一遍地重新生成。应使用任何可用于缓存已完成工作而不是再次执行的技术-这是实现最佳Tomcat性能的关键。

  2. 如果存在任何与数据库相关的问题,则可以按照sql查询性能调优

  3. 在不重启Tomcat的情况下,旋转Catalina.out日志文件。

具体来说,有两种方法。

第一种更直接,您可以通过向Catalina的启动shell脚本中添加简单的管道来将Catalina.out旋转到所选日志旋转工具。它看起来像这样:

"$CATALINA_BASE"/logs/catalina.out WeaponOfChoice 2>&1 &

只需将"WeaponOfChoice"替换为您喜欢的日志轮换工具即可。

第二种方法不太直接,但最终更好。处理Catalina.out的旋转的最佳方法是确保它永远不需要旋转。只需将所有上下文中的"swallowOutput"属性设置为true即可,在"server.xml"中实现。

这将路由System.errSystem.out到您配置的任何日志记录实现或JULI(如果您尚未配置)。


尝试使用JVM参数(结果相同),FYI我正在使用VM 8核,64GB RAM,数据库Hadoop Hbase。 - Mohammed Azharuddin Shaikh
@ShaikhAzhar:所以问题实际上与大小无关。因此,我认为数字5将是最好的方法。正如你所说,你需要重新启动,所以我们可以通过5来避免它。 - SkyWalker
@ShaikhAzhar:您能提供一些与数据库相关的信息吗?有多少张表格,每个表格中有多少数据?SQL语句是否书写正确?请检查一下。 - SkyWalker

1
我们遇到了一个类似的问题,原因是 "catalina.out"。它是“System.out”和“System.err”的标准目标日志文件。由于其大小不断增加,导致系统变慢,最终Tomcat崩溃。通过轮换"catalina.out"解决了这个问题。我们使用的是Redhat,因此编写了一个shell脚本来轮换"catalina.out"。
以下是一些链接:-
Mulesoft关于catalina的文章(还包含两种轮换方法): Tomcat Catalina Introduction 如果"catalina.out"不是问题所在,请尝试以下方法: -
Mulesoft优化tomcat的文章: Tuning Tomcat Performance For Optimum Speed

我们的 catalina.out 有时会增长到数百GB,但仍然一切正常。它只是在最后追加内容。 - Imaskar

0

我们曾经遇到过一个类似于你们的问题。Tomcat响应缓慢,但访问日志显示回答只用了毫秒级别的时间。问题在于流式响应。我们的某个服务返回实时数据,用户可以订阅。EPOLL变得过度膨胀。网络请求无法到达Tomcat。最有趣的是,CPU大部分时间都处于空闲状态(因为没有人可以要求服务器做任何事情),而接受器/轮询线程则停留在WAIT状态,而非RUNNINGIN_NATIVE状态。

当时我们仅限制了此类请求的数量,一切都恢复正常了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接