vlambda博客
学习文章列表

读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除

Chapter 7. Troubleshooting in Tomcat

每天,IT 管理员都面临着生产环境中服务器的新问题。管理员必须对这些问题进行故障排除,以确保应用程序完美运行。

故障排除是解决环境中关键问题的艺术。它伴随着你在职业生涯中遇到的经验和问题的数量。但是有一套规则可以解决这些问题。我们将讨论生产环境中可能发生的实时问题。我们还将讨论解决问题的提示和技巧。

在本章中,我们将讨论:

  • 常见问题

  • 用于线程转储分析的第三方工具

  • 与操作系统、JVM 和数据库相关的 Tomcat 特定问题

  • 如何解决问题

  • 生产环境的最佳实践

Common problem areas for web administrators

Web 管理员总是发现应用程序的问题,不是因为 Tomcat 服务器的服务器故障,而是因为应用程序也由于其他组件而开始出现故障。下图展示了典型中间件环境的不同组件:

读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除

下面简单讨论一下web管理员在实时生产支持中遇到的问题:

  • 应用程序: 当应用程序由于类加载器冲突、应用程序部署冲突、缺少配置参数以及以此类推。

  • 数据库:数据库问题对于网络管理员来说非常重要。很难找到与数据库相关的问题。他们之中有一些是;未找到 JNDI、管道错误等。

  • 用户访问权限:可能由于数据库或应用程序配置错误而出现访问问题。这些问题的一些例子是;用户无法访问应用程序、登录页面未出现、访问被拒绝等。

  • 网络: 这在 IT 基础架构中起着至关重要的作用。如果服务器之间的连接中断,那么服务器之间的通信也会中断,我们将面临服务中断。

  • 操作系统/硬件:操作系统/硬件创建应用层所在的较低层。如果操作系统/硬件有任何问题,都会影响到Tomcat服务器的服务。

Common problem areas for web administrators


Web 管理员总是发现应用程序的问题,不是因为 Tomcat 服务器的服务器故障,而是因为应用程序也由于其他组件而开始出现故障。下图展示了典型中间件环境的不同组件:

读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除

下面简单讨论一下web管理员在实时生产支持中遇到的问题:

  • 应用程序: 当应用程序由于类加载器冲突、应用程序部署冲突、缺少配置参数以及以此类推。

  • 数据库:数据库问题对于网络管理员来说非常重要。很难找到与数据库相关的问题。他们之中有一些是;未找到 JNDI、管道错误等。

  • 用户访问权限:可能由于数据库或应用程序配置错误而出现访问问题。这些问题的一些例子是;用户无法访问应用程序、登录页面未出现、访问被拒绝等。

  • 网络: 这在 IT 基础架构中起着至关重要的作用。如果服务器之间的连接中断,那么服务器之间的通信也会中断,我们将面临服务中断。

  • 操作系统/硬件:操作系统/硬件创建应用层所在的较低层。如果操作系统/硬件有任何问题,都会影响到Tomcat服务器的服务。

How to troubleshoot a problem


我们无法仅通过参考用户评论或问题陈述来解决任何问题。为了解决问题,我们必须将问题缩小到根本级别并修复问题。

许多网络管理员总是问这个问题;我们如何知道系统存在特定问题?

如果您在正确的路径中挖掘问题,就会找到这些问题的解决方案。其次,如果你在职业生涯中遇到了许多问题,那么你可以将它们关联起来并解决问题。如果您问我,实际上不可能教授故障排除,因为它来自您自己的经验和您解决问题的兴趣。在这里,我们讨论一个常见的问题,应用程序缓慢,在每个环境中都会出现,并且网络管理员必须在他/她的情况下面对这个问题职业。

Slowness issue in applications

让我们以用户抱怨应用程序性能的实时情况为例。该应用程序包含一个企业设置,它结合了 Apache HTTP 服务器作为前端、Tomcat 7 作为 servlet 容器以及作为后端数据库服务器运行的 Oracle 数据库。

问题:

让我们讨论一下中间件应用程序的常见问题之一,它使管理员很难解决。此问题称为应用程序缓慢,用户抱怨应用程序运行缓慢。从管理员的角度来看,这是一个非常关键的问题,因为 Web 应用程序的任何组件都可能导致缓慢,例如操作系统、数据库、Web 服务器、网络等。

除非我们找出导致问题的特定组件,否则缓慢将持续存在,并且从用户的角度来看,应用程序将无法以稳定的方式运行。下图显示了 Web 应用程序的典型 Web 基础架构请求流程:

读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除

How to solve slowness issues in Tomcat 7

任何组件都可能导致应用程序运行缓慢,因此最好从用户端开始进行故障排除。

User end troubleshooting

执行以下步骤进行故障排除:

  1. 1. 尝试从用户的浏览器访问应用程序并检查加载应用程序页面需要多少时间。

  2. 2. 从用户端查看服务器的ping响应,例如 abc.com,使用命令 ping。如果您得到适当的响应,则表示应用程序服务器和用户机器的连接工作正常。

    ping abc.com
    
读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除
  • 前面的屏幕截图显示了 abc.com ping 响应。在 ping 状态监控过程中,我们需要牢记一些重点,具体如下:

    • 发送和接收的数据包应该具有相同的计数。在前面的截图中我们可以看到它是 4。如果计数较少,则表示网络内部存在问题。

    • 应该没有丢包。此外,平均响应时间不应太长。

Note

许多外部站点禁用其节点的 ping 响应。这并不意味着系统已关闭。在这种情况下,请使用命令 telnet URL port 尝试telnet 端口。

Note

默认情况下,Windows 7 不附带 telnet,我们需要安装它。

前面的屏幕截图显示了服务器正常工作的 ping 响应。这意味着在系统和网络方面没有来自用户端的问题。

Web server troubleshooting

一旦我们知道用户端没有问题,我们将进入应用程序的下一个级别,即 Web 服务器。现在,我们必须深入服务器以检查是否有任何问题。

Web 服务器问题通常与服务器负载、用户线程或安装问题有关。让我们看看如何解决这个问题。

  1. 1、检查web服务器进程是否正在运行。如果它正在运行,请使用以下命令检查有多少进程正在运行。此命令将显示进程数及其状态。

    ps -aef |grep httpd
    
    • 前面的命令显示为 Apache httpd 服务器运行的进程数。如果进程数大于 50,则表示 Web 服务器存在问题,例如 CPU 利用率高、用户流量高、磁盘 I/O 高等。

  2. 2. 然后,检查系统的 CPU 使用率和内存状态,看看是否有 Apache 进程占用高 CPU 使用率,使用以下命令:

    top|head
    
    • 上一条命令将显示消耗最高 CPU 使用率和机器平均负载的进程。以下屏幕截图显示了上一个命令的输出。如果平均负载高或者 Apache 进程的 CPU 使用率高,那么这就是应用程序运行缓慢的原因之一,否则我们可以进行下一个级别。

    Note

    在这种情况下,如前所述,您必须杀死所有 Apache 进程,然后回收 Apache 实例。

    读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除
  3. 3.下一步是检查Apache日志并在错误和访问日志中搜索错误。以下屏幕截图显示系统已成功启动:

    读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除
    httpd.exe: Could not reliably determine the server's fully qualified domain name, using 10.0.0.3 for ServerName.
    
    • 上一条消息是 apache error_log 中的通知消息(信息)。上一个屏幕截图中的日志显示“Apache HTTP 服务器找不到完全合格的域”。这意味着在 httpd.conf 中,我们错过了使用完全限定域定义服务器名称,例如,我们将 localhost 定义为服务器名称;取而代之的是,我们必须定义 [email protected]

      此外,还有两个命令可用于在日志中搜索错误。它们如下:

      tail -f log file |grep ERROR
      
    • 当您要在日志中搜索错误时,使用上一个命令。

      grep " 500 " access_log
      
    • 上一条命令用于查找日志中的错误代码。

    Note

    如果没有为 Apache 生成日志,可能是由于硬盘驱动器空间不足。

  4. 4. 挂载应用程序日志的服务器挂载硬盘空间不足的主要原因之一是日志轮换不当。使用 df命令查看挂载空间,其中<​​code class="literal"> df = disk free and switch - h = 人类可读。 df 命令的语法如下,输出如下图所示:

    df -h
    
    读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除

    Note

    如果任何挂载运行超过 95%,则降低磁盘利用率,否则系统可能会导致服务中断。

如果我们在前面提到的组件中没有发现任何错误,那么我们可以断定 Web 服务器没有问题。

Tomcat 7 troubleshooting

在基于 Java 的应用程序中,由于许多问题导致缓慢。其中一些是由于 JVM 内存、不正确的应用程序部署、不正确的 DB 配置等造成的。让我们讨论 Tomcat 7 的一些基本故障排除步骤:

  1. 1. 检查 Tomcat 的 Java 进程和实例机器的平均负载:

    ps -ef |grep java
    
    读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除
    • 前面的屏幕截图显示了机器中运行的 Java 进程。前面的命令检查系统中运行的所有 Java 进程以及 Tomcat 实例的平均负载。平均负载为我们提供了一些重要线索。如果您发现平均负载非常高,请检查哪个进程的 CPU 使用率高,并找出使用高 CPU 的原因。此外,它还显示了 RAM 和交换的使用情况。

      以下屏幕截图显示了 head 命令在 Tomcat 服务器上的输出:

      top|head
      
      读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除
    • head 命令显示文件或输出第一行的内容。它经常与 -n 开关一起使用,其中 n= 显示的行数。默认情况下,如果不使用 -n,它会显示 10 行。

  2. 2.然后查看 TOMCAT_HOME/logs中的Tomcat日志,在日志文件中查找异常,主要在 catalina。出,localhost.yyyy-mm-dd.log 使用以下命令:

    grep INFO catalina.out
    
    读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除
    • 上一个屏幕截图显示了日志中的 Tomcat 启动。如果日志中有任何错误,可以使用以下命令进行检查:

      grep ERROR catalina.out
      

Troubleshooting at the database level

作为 Web 管理员,您无权访问数据库服务器。但是 Web 管理员可以在外部连接到数据库服务器,而无需登录物理机,因为管理员具有连接字符串(访问数据库的凭据)。例如,您可以在运行DB服务器的端口上进行telnet,并检查服务是否正在运行。

Telnet DB server IP port

如果telnet成功,那么可以验证以下流程:

  • 数据库连接数:我们可以随时要求我们的 DBA 检查数据库上的连接数。如果连接数很高,那么我们可以与 DBA 一起减少服务器上的连接。

  • SQL 查询优化: 我们可以与 DBA 核对,看看哪些查询在数据库中执行的时间更长,并要求我们的开发人员优化查询。这确实有助于提高应用程序的性能。

  • 跨多台服务器负载均衡数据库: 另一个可能导致应用程序缓慢的重要点是跨多台服务器的数据库负载均衡。如果负载均衡配置不正确,则可能会导致应用程序运行缓慢。如果两个数据库服务器之间的网络出现延迟,则同步可能无法正常进行。

JVM analysis in the Tomcat instance

有一些机会在应用程序中过度使用 JVM。要查看 JVM 实例的内存分配,您可以使用命令行实用程序 jmap。此命令随 JDK 1.6 提供。它是一个 Java 实用程序,它决定了 Tomcat 实例的整个内存分配。

[root@localhost logs]# jmap -heap "TOMCAT INSTANCE PID "

让我们讨论前面的命令是如何执行的。 jmap 命令在内部收集 JVM 内存详细信息, -heap 是告诉 jmap 收集并显示堆内存占用, TOMCAT INSTANCE PID 是进程所在的Tomcat实例的进程ID jmap< /code> 必须获取内存详细信息。

[root@localhost logs]# jmap -heap 10638

以下屏幕截图显示了前一个进程 ID 的 jmap 命令的输出:

Note

如何找到进程ID

我们可以使用以下命令找到进程 ID:

ps -ef |grep "tomcat instance name " |awk -F" " '{print $2}'|head -1

这条命令可以描述为, ps -ef |grep "tomcat instance name" 会查找该Tomcat实例运行的所有进程。 awk - F" " '{print $2}' awk 打印特定进程的进程 ID, head -1 将显示第一个进程 ID。

jmap 命令存在于 JAVA_HOME/bin 中,如果您设置 JAVA _HOME/bin 在路径中,然后您可以从任何地方执行命令。

读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除

前面的实用程序提供了 JVM 内存的整个占用空间及其对 Tomcat 实例的分配。 JVM 内存由以下组件组成:

  • 堆配置

  • 堆使用量

  • 来自太空

  • 到空间

  • 终身一代

  • 烫发一代

  • 伊甸园空间

内存不足问题,例如 perm generation 和 max heap 是生产环境中非常常见的问题。检查内存以查看以前的任何组件是否使用超过 95%。如果是这样,那么我们必须增加相应的参数。

现在到了我们可以确定哪个 JVM 组件正在为 Tomcat 实例创建问题的地方。如果内存工作正常,那么是时候生成线程转储来钻取应用程序级问题了。

How to obtain a thread dump in Tomcat 7


线程转储是我们可以确定任何 Java 进程的应用程序级线程状态的一种方式。 Tomcat中获取线程转储的方法有很多;在这里,我们将讨论在 IT 环境中广泛使用的两种不同方式。

Thread dump using Kill command

此命令生成并重定向 catalina.out 日志中的线程转储。但是,此命令的局限性在于它可以在 Linux、Unix 等非 DOS 环境中运行。

Kill -3 java process id

例如:

Kill -3 10638
读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除

上一个屏幕截图显示了 catalina.out 日志中的线程转储命令的输出。我们可以看到突出显示的部分显示了 http-bio-8080-Acceptor线程状态,该线程当前处于可运行状态,这意味着线程处于活动状态并正在执行其功能为应用程序。

读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除

一旦线程生成完成,它就会收集 Java 进程的内存转储。前面的截图显示了线程转储时的内存状态。此内存转储为我们提供了所用内存的完整足迹。

Thread dump using jstack

还有另一种生成线程转储的方法,即使用 Java 命令行实用程序 jstack,它随 JDK 1.5 或更高版本提供。 jstack 打印 Java 进程的 Java 堆栈线程。这个实用程序在生产环境中非常有用,我们没有重定向服务器日志中的线程输出。该实用程序的主要优点是它可以与任何 J2EE 服务器一起使用。 jstack 命令有一些常用的开关,如下表所示:

选项

描述

-f

强制生成 Java 堆栈。主要在进程处于挂起状态时使用

-l

长列表(显示锁的附加信息)

-m

混合模式 Java 堆栈生成

以下命令语法为 Java 进程生成 Java 堆栈并将输出重定向到文本文件中:

jstack -f Pid > threaddump.txt

例如:

jstack -f 10638 > threaddump.txt

Note

64 位操作系统上的 JStack: 如果您使用的是 64 位操作系统,那么您必须运行 jstack -J-d64 -m pid 命令生成线程转储。

JStack on Windows:在Windows系统上,只有一个开关会起作用,即 jstack [-l ] pid

How to analyze the thread dump for Tomcat instance

线程转储分析很难理解。它为 IT 管理员提供了对应用程序相关问题的深入了解。以下方法适用于进行线程转储分析。步骤如下:

  1. 1、获取Java进程ID的线程转储6次,间隔10秒,使用命令 kill -3 jstack

  2. 2.然后比较所有六个线程转储以找到长时间运行的线程。

  3. 3.查找所有处于卡住状态的线程,并尝试为应用程序和服务器级线程找出所有卡住线程的原因。

    Note

    如果卡住的线程在应用程序级别,则问题与应用程序代码有关,如果线程卡在服务器级别,则可能是服务器或应用程序级别的问题。

有两个开源工具被广泛用于线程转储分析; Java Thread Dump Analyzer (TDA)和武士

Note

对于线程转储分析器,请查看链接 http://java.net/projects/tda

对于武士,请查看链接 http://yusuke.homeip.net/武士/en/index.html

Thread dump analysis using Samurai

在上一节中,如何分析 Tomcat 实例的线程转储,我们已经讨论了线程转储分析的各个步骤。让我们使用 Samurai 工具进行实时分析。

它是一个基于 GUI 的工具,能够将线程转储和详细 GC 从日志文件中分离出来,并将其显示在用户友好的屏幕上。让我们开始分析过程:

  1. 1.使用链接 http://在线运行Samurai线程转储分析器yusuke.homeip.net/samurai/en/index.html

  2. 2. Samurai 控制台打开后,将日志上传到 Samurai 工具。

  3. 3. Samurai 工具内部分离日志并可视化线程转储和内存仪表板。以下屏幕截图显示了 Samurai 显示的 GC 详细利用率:

    读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除
  4. 4. 现在,点击 Thread Dumps 选项卡,它将显示线程转储的图形状态。以下屏幕截图显示了线程状态。此外,在左侧角落,我们可以找到用于线程转储的符号的描述:

    读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除
  5. 5. 信息齐全了,手动比较长线程,找到问题。

Thread dump analysis using the Thread Dump Analyzer

还有另一个非常强大的工具,并且被 Web 管理员非常常用,称为 Thread Dump Analyzer。该工具能够为线程转储生成摘要。以下是使用此分析器的优点:

  • 可以在多个线程转储之间比较长时间运行的线程

  • 它分别可视化每个线程

  • 它为每个线程转储生成摘要

让我们使用 Thread Dump Analyzer 开始分析过程:

  1. 1. 使用链接 http://java.net/projects/tda 并点击 TDA Webstart

  2. 2. 打开 TDA 控制台后,将日志上传到 TDA 控制台。它将隔离线程转储,按线程转储生成的升序显示线程转储,以及第一个线程转储的摘要。以下屏幕截图显示了上框的多个线程转储和第一个线程转储的摘要:

    读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除
  3. 3. 现在,通过在 TDA 控制台上选择多个线程转储来比较长时间运行的线程。单击控制台选项卡中的长线程检测图标,屏幕上将出现一个弹出窗口。点击开始检测。以下屏幕截图显示了在 TDA 控制台上选择了多个线程转储,并且弹出窗口显示了长线程检测按钮:

    读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除
  4. 4. 它生成长时间运行的线程摘要。根据摘要,您可以检测到问题。以下屏幕截图显示了长时间运行的线程的完整摘要。该表显示线程的名称、类型、进程ID、线程ID、本机ID、线程状态和地址范围:

    读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除

线程状态可以分为五种类型。下图展示了不同的线程状态:

读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除
  • Runnable:一旦调用 start()方法,线程就会进入可运行状态.

  • Waiting:线程在等待分配资源或等待另一个线程执行其功能时进入等待状态。

  • 阻塞:线程在等待监视器锁时进入阻塞状态。

  • Alive but not runnable: 处于此状态的线程仍处于活动状态但不可运行,如果该方法是再次调用。

  • Dead:线程一旦操作完成,或操作异常终止,就会进入dead状态。如果任何线程进入这种状态,它就永远无法再次运行。也称为死锁状态。

死线程是实例的关键线程,因为它们会导致应用程序运行缓慢。它们可以作为垃圾回收的一部分被释放,系统将生成新线程导致内存泄漏。

到目前为止,我们已经讨论了针对任何问题执行的故障排除步骤。如果您执行了这些操作,则问题有 99% 的可能性得到解决。

Errors and their solutions

生产环境中出现了很多问题,web管理员不得不去挖掘日志。管理员总是很难理解这些异常的含义以及它们在应用程序中生成的原因。了解异常的最佳方法是查看日志并检查第一个异常,这将为您提供问题的确切概念。

根据企业应用程序的不同组件,错误可分为三大类:

  • 应用

  • JVM(内存)

  • 数据库

让我们讨论一些有助于使环境稳定的异常及其解决方案。

JVM (memory) issues

如今,应用程序非常耗费资源。由于这些问题,Tomcat 实例内存不足。管理员必须非常努力地微调 Tomcat 7 实例并使环境非常稳定以在 Internet 上运行关键的 Web 应用程序。

Out of Memory exception

在企业环境中,由于应用程序的高内存需求,经常会遇到内存不足的问题,管理员必须调整 JVM。失败会导致 Tomcat 实例出现内存不足异常。

例外:

SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.OutOfMemoryError: Java heap space

原因:

运行应用程序时可能经常出现此错误,这需要大量内存密集型资源。因此,它会导致服务器上的内存不足异常并导致服务中断。

解决方案:

您必须增加 Tomcat 系统的最大堆大小。需要注意的是,您只能分配 70% 的物理内存作为 JVM 内存,而 30% 是为操作系统保留的。使用命令 jmap检查JVM配置,然后在配置中增加。

需要在Tomcat的启动脚本中添加如下Java参数,可以在 TOMCAT_HOME/bin中找到,根据内存需求增加JVM分配,回收Tomcat实例。

JAVA_OPTS="-Xms512m Xmx1048m
OutOfMemoryError: PermGen space

Tomcat 管理员经常面临应用程序永久对象生成的问题,因为每个应用程序对对象生成的要求不同。因此,应用程序缓慢也会导致在 catalina.out中产生 OutOfMemoryError: PermGen space异常。

例外:

MemoryError: PermGen space
java.lang.OutOfMemoryError: PermGen space

原因:

永久代是独一无二的,因为它包含描述用户类的元数据。具有大型代码库的应用程序可以快速填满导致 java.lang.OutOfMemoryError: PermGen 的这部分堆,无论您的 多高-Xmx 以及你在机器上有多少内存。

Note

Java 代码方法和类存储在永久代中。

解决方案:

在Tomcat 7的启动脚本中需要添加以下参数,该参数会在Tomcat 7启动时增加永久代空间。

-XX:MaxPermSize=(MemoryValue)m

例如:

-XX:MaxPermSize=128m
Stack over flow exception

我们在许多应用程序中都遇到过这个问题。这个异常主要是由于递归类加载(编码不当)引起的。此问题还会导致应用程序的性能下降:我们观察到应用程序在一小时前运行良好,但随后变得无响应。这是堆栈溢出异常的关键指示。以下屏幕截图显示了日志中的错误:

例外:

at java.lang.Thread.run(Thread.java:534)
----- Root Cause -----
java.lang.StackOverflowError
读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除

原因:

执行堆栈溢出时抛出的异常是因为它包含了太多的嵌套方法调用。

解决方案:

需要增加Tomcat启动文件中 -xss参数的值。

-Xss=(memory value in k)

例如:

-Xss=128k

默认情况下,堆栈溢出异常带有 64 k 的值,后跟循环。

Database-related issues

到目前为止,我们已经讨论了各种 JVM 级别的问题。现在是讨论常见数据库相关问题的时候了。

Broken pipe exception

管道损坏异常是生产环境中报告的最常见问题之一。这个例外是什么意思?这意味着来自 J2EE 容器的数据库连接被终止。此问题的可能原因是频繁的网络断开连接、数据库上的以太网故障或 J2EE 服务器级容器。

以下屏幕截图显示了日志中的错误:

例外:

at java.lang.Thread.run(Thread.java:619)
Caused by: ClientAbortException: java.net.SocketException: Broken pipe
读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除

原因:

此问题是由于 Tomcat 7 和数据库之间的连接丢失造成的。

解决方案:

回收 Tomcat 实例以恢复连接。

Timeout waiting for an idle object

很多时候,当我们点击应用程序进行任何交易时,应用程序会在一段时间后显示一个空白页面。看起来应用程序服务器没有响应,但事实可能不同。在许多情况下,真正的罪魁祸首是数据库。发生的情况是应用服务器向数据库发送请求并等待响应,但连接在服务器处异常终止,导致连接超时异常。以下屏幕截图显示了日志中的错误:

例外:

at org.apache.commons.dbcp.PoolingDataSource.getConnection (PoolingDataSource.java:104)
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除

原因:

此问题是由 Tomcat 的连接池引起的。

解决方案:

更改Tomcat的连接空闲值,这些设置在 server.xml,后面跟着recycle。

Database connectivity exception

此类问题通常在企业环境中报告,其中正在安装新应用程序或正在迁移应用程序。这是 Tomcat 7 中 JNDI 配置不正确的问题。

例外:

java.lang.RuntimeException: Error initializing application. Error Unable to load any specified brand or the default brand: net.project.persistence.PersistenceException: Unable to load brand from database.

前面的错误往往表示无法访问数据库。

Please check your database configuration or contact your system administrator: java.sql.SQLException: Error looking up data source for name: jdbc/abc

原因:

由于 JNDI 名称不正确或 JNDI 名称不存在,Tomcat 7 无法连接到数据库。

解决方案:

与数据库管理员一起获取正确的 JNDI 名称并正确配置,然后进行回收。

Web server benchmarking


现在我们知道如何解决问题并在系统中找到潜在的解决方案。还有一点要讨论,Web 服务器基准测试。如果不讨论这个主题,Tomcat 7 中的故障排除不能被标记为完成。这是我们衡量网络服务器性能的过程,也称为负载测试。在此过程中,我们以虚拟方式在重负载上运行服务器并估计实时性能。如果我们想为 Web 服务器做容量规划,这个过程非常有用。有许多工具可用于在服务器上执行负载测试,例如 ApacheBench (ab)、 JMeter、LoadRunner、OpenSTA 等。我们来讨论一下常用的开源工具,例如 ApacheBench 和 JMeter。如果我们在上线阶段之前对服务器进行基准测试,那么我们在生产支持方面将面临更少的问题。此外,它有助于提高性能和设计可扩展的环境架构。

ApacheBench

ApacheBench 是一个用于 Web 服务器基准测试的命令行工具。它位于 Apache HTTP 服务器下,当我们只想生成 HTTP 线程时非常有用。这是一个单线程进程。

JMeter

JMeter 是用于负载测试的广泛使用的开源工具之一。该工具是在 Apache Jakarta 项目下开发的。它能够为 JDBC、Web 服务、HTTP、HTTPS 和 JMS 服务生成流量。它是一个桌面软件,不支持浏览器的所有功能。以下是 JMeter 的优点:

  • 便携(可以在任何平台上运行)

  • 支持多任务处理,允许管理员测试多个进程

Note

有关 JMeter 和 ApacheBench 的更多信息,请访问 http://jmeter.apache.org/ http://httpd.apache.org/docs/2.0 /programs/ab.html 分别。

Summary


在本章中,我们讨论了应用程序和 Web 管理员在实时环境中面临的不同问题,如何在生产环境中使用不同的错误技术避免这些问题及其解决方案,线程转储分析和用于分析的工具,内存问题、解决实时问题的步骤以及 Web 服务器基准测试。

在本章结束时,读者将非常有信心解决实时环境中面临的问题,我相信,到现在为止,他们已经解决了他们环境中的一些主要问题。如果没有,那么他们正计划解决这些问题。在下一章中,我们将讨论管理和监控 Tomcat 7 的不同方法。