读书笔记《apache-tomcat-7-essentials》Tomcat中的故障排除
每天,IT 管理员都面临着生产环境中服务器的新问题。管理员必须对这些问题进行故障排除,以确保应用程序完美运行。
故障排除是解决环境中关键问题的艺术。它伴随着你在职业生涯中遇到的经验和问题的数量。但是有一套规则可以解决这些问题。我们将讨论生产环境中可能发生的实时问题。我们还将讨论解决问题的提示和技巧。
在本章中,我们将讨论:
常见问题
用于线程转储分析的第三方工具
与操作系统、JVM 和数据库相关的 Tomcat 特定问题
如何解决问题
生产环境的最佳实践
Web 管理员总是发现应用程序的问题,不是因为 Tomcat 服务器的服务器故障,而是因为应用程序也由于其他组件而开始出现故障。下图展示了典型中间件环境的不同组件:
Web 管理员总是发现应用程序的问题,不是因为 Tomcat 服务器的服务器故障,而是因为应用程序也由于其他组件而开始出现故障。下图展示了典型中间件环境的不同组件:
我们无法仅通过参考用户评论或问题陈述来解决任何问题。为了解决问题,我们必须将问题缩小到根本级别并修复问题。
许多网络管理员总是问这个问题;我们如何知道系统存在特定问题?
如果您在正确的路径中挖掘问题,就会找到这些问题的解决方案。其次,如果你在职业生涯中遇到了许多问题,那么你可以将它们关联起来并解决问题。如果您问我,实际上不可能教授故障排除,因为它来自您自己的经验和您解决问题的兴趣。在这里,我们讨论一个常见的问题,应用程序缓慢,在每个环境中都会出现,并且网络管理员必须在他/她的情况下面对这个问题职业。
让我们以用户抱怨应用程序性能的实时情况为例。该应用程序包含一个企业设置,它结合了 Apache HTTP 服务器作为前端、Tomcat 7 作为 servlet 容器以及作为后端数据库服务器运行的 Oracle 数据库。
问题:
让我们讨论一下中间件应用程序的常见问题之一,它使管理员很难解决。此问题称为应用程序缓慢,用户抱怨应用程序运行缓慢。从管理员的角度来看,这是一个非常关键的问题,因为 Web 应用程序的任何组件都可能导致缓慢,例如操作系统、数据库、Web 服务器、网络等。
除非我们找出导致问题的特定组件,否则缓慢将持续存在,并且从用户的角度来看,应用程序将无法以稳定的方式运行。下图显示了 Web 应用程序的典型 Web 基础架构请求流程:
任何组件都可能导致应用程序运行缓慢,因此最好从用户端开始进行故障排除。
1. 尝试从用户的浏览器访问应用程序并检查加载应用程序页面需要多少时间。
2. 从用户端查看服务器的ping响应,例如
abc.com
,使用命令ping
。如果您得到适当的响应,则表示应用程序服务器和用户机器的连接工作正常。
前面的屏幕截图显示了
abc.com
的ping
响应。在 ping 状态监控过程中,我们需要牢记一些重点,具体如下:发送和接收的数据包应该具有相同的计数。在前面的截图中我们可以看到它是
4
。如果计数较少,则表示网络内部存在问题。应该没有丢包。此外,平均响应时间不应太长。
前面的屏幕截图显示了服务器正常工作的 ping
响应。这意味着在系统和网络方面没有来自用户端的问题。
一旦我们知道用户端没有问题,我们将进入应用程序的下一个级别,即 Web 服务器。现在,我们必须深入服务器以检查是否有任何问题。
Web 服务器问题通常与服务器负载、用户线程或安装问题有关。让我们看看如何解决这个问题。
1、检查web服务器进程是否正在运行。如果它正在运行,请使用以下命令检查有多少进程正在运行。此命令将显示进程数及其状态。
前面的命令显示为 Apache httpd 服务器运行的进程数。如果进程数大于 50,则表示 Web 服务器存在问题,例如 CPU 利用率高、用户流量高、磁盘 I/O 高等。
2. 然后,检查系统的 CPU 使用率和内存状态,看看是否有 Apache 进程占用高 CPU 使用率,使用以下命令:
上一条命令将显示消耗最高 CPU 使用率和机器平均负载的进程。以下屏幕截图显示了上一个命令的输出。如果平均负载高或者 Apache 进程的 CPU 使用率高,那么这就是应用程序运行缓慢的原因之一,否则我们可以进行下一个级别。
3.下一步是检查Apache日志并在错误和访问日志中搜索错误。以下屏幕截图显示系统已成功启动:
上一条消息是
apache error_log
中的通知消息(信息)。上一个屏幕截图中的日志显示“Apache HTTP 服务器找不到完全合格的域”。这意味着在httpd.conf
中,我们错过了使用完全限定域定义服务器名称,例如,我们将 localhost 定义为服务器名称;取而代之的是,我们必须定义[email protected]
。此外,还有两个命令可用于在日志中搜索错误。它们如下:
当您要在日志中搜索错误时,使用上一个命令。
上一条命令用于查找日志中的错误代码。
4. 挂载应用程序日志的服务器挂载硬盘空间不足的主要原因之一是日志轮换不当。使用
df
命令查看挂载空间,其中<code class="literal"> df = disk free and switch- h
= 人类可读。df
命令的语法如下,输出如下图所示:
如果我们在前面提到的组件中没有发现任何错误,那么我们可以断定 Web 服务器没有问题。
作为 Web 管理员,您无权访问数据库服务器。但是 Web 管理员可以在外部连接到数据库服务器,而无需登录物理机,因为管理员具有连接字符串(访问数据库的凭据)。例如,您可以在运行DB服务器的端口上进行telnet,并检查服务是否正在运行。
有一些机会在应用程序中过度使用 JVM。要查看 JVM 实例的内存分配,您可以使用命令行实用程序 jmap
。此命令随 JDK 1.6 提供。它是一个 Java 实用程序,它决定了 Tomcat 实例的整个内存分配。
让我们讨论前面的命令是如何执行的。 jmap
命令在内部收集 JVM 内存详细信息, -heap
是告诉 jmap
收集并显示堆内存占用, TOMCAT INSTANCE PID
是进程所在的Tomcat实例的进程ID jmap< /code> 必须获取内存详细信息。
以下屏幕截图显示了前一个进程 ID 的 jmap
命令的输出:
Note
如何找到进程ID
我们可以使用以下命令找到进程 ID:
这条命令可以描述为, ps -ef |grep "tomcat instance name"
会查找该Tomcat实例运行的所有进程。 awk - F" " '{print $2}'
awk 打印特定进程的进程 ID, head -1
将显示第一个进程 ID。
jmap
命令存在于 JAVA_HOME/bin
中,如果您设置 JAVA _HOME/bin
在路径中,然后您可以从任何地方执行命令。
前面的实用程序提供了 JVM 内存的整个占用空间及其对 Tomcat 实例的分配。 JVM 内存由以下组件组成:
内存不足问题,例如 perm generation 和 max heap 是生产环境中非常常见的问题。检查内存以查看以前的任何组件是否使用超过 95%。如果是这样,那么我们必须增加相应的参数。
现在到了我们可以确定哪个 JVM 组件正在为 Tomcat 实例创建问题的地方。如果内存工作正常,那么是时候生成线程转储来钻取应用程序级问题了。
线程转储是我们可以确定任何 Java 进程的应用程序级线程状态的一种方式。 Tomcat中获取线程转储的方法有很多;在这里,我们将讨论在 IT 环境中广泛使用的两种不同方式。
此命令生成并重定向 catalina.out
日志中的线程转储。但是,此命令的局限性在于它可以在 Linux、Unix 等非 DOS 环境中运行。
例如:
上一个屏幕截图显示了 catalina.out
日志中的线程转储命令的输出。我们可以看到突出显示的部分显示了 http-bio-8080-Acceptor
线程状态,该线程当前处于可运行状态,这意味着线程处于活动状态并正在执行其功能为应用程序。
一旦线程生成完成,它就会收集 Java 进程的内存转储。前面的截图显示了线程转储时的内存状态。此内存转储为我们提供了所用内存的完整足迹。
还有另一种生成线程转储的方法,即使用 Java 命令行实用程序 jstack
,它随 JDK 1.5 或更高版本提供。 jstack
打印 Java 进程的 Java 堆栈线程。这个实用程序在生产环境中非常有用,我们没有重定向服务器日志中的线程输出。该实用程序的主要优点是它可以与任何 J2EE 服务器一起使用。 jstack
命令有一些常用的开关,如下表所示:
选项 |
描述 |
---|---|
|
强制生成 Java 堆栈。主要在进程处于挂起状态时使用 |
|
长列表(显示锁的附加信息) |
|
混合模式 Java 堆栈生成 |
以下命令语法为 Java 进程生成 Java 堆栈并将输出重定向到文本文件中:
例如:
Note
64 位操作系统上的 JStack: 如果您使用的是 64 位操作系统,那么您必须运行 jstack -J-d64 -m pid
命令生成线程转储。
JStack on Windows:在Windows系统上,只有一个开关会起作用,即 jstack [-l ] pid
。
线程转储分析很难理解。它为 IT 管理员提供了对应用程序相关问题的深入了解。以下方法适用于进行线程转储分析。步骤如下:
1、获取Java进程ID的线程转储6次,间隔10秒,使用命令
kill -3
或jstack 。
2.然后比较所有六个线程转储以找到长时间运行的线程。
3.查找所有处于卡住状态的线程,并尝试为应用程序和服务器级线程找出所有卡住线程的原因。
有两个开源工具被广泛用于线程转储分析; Java Thread Dump Analyzer (TDA)和武士。
Note
对于线程转储分析器,请查看链接 http://java.net/projects/tda 。
对于武士,请查看链接 http://yusuke.homeip.net/武士/en/index.html。
在上一节中,如何分析 Tomcat 实例的线程转储,我们已经讨论了线程转储分析的各个步骤。让我们使用 Samurai 工具进行实时分析。
它是一个基于 GUI 的工具,能够将线程转储和详细 GC 从日志文件中分离出来,并将其显示在用户友好的屏幕上。让我们开始分析过程:
1.使用链接 http://在线运行Samurai线程转储分析器yusuke.homeip.net/samurai/en/index.html。
2. Samurai 控制台打开后,将日志上传到 Samurai 工具。
3. Samurai 工具内部分离日志并可视化线程转储和内存仪表板。以下屏幕截图显示了 Samurai 显示的 GC 详细利用率:
4. 现在,点击 Thread Dumps 选项卡,它将显示线程转储的图形状态。以下屏幕截图显示了线程状态。此外,在左侧角落,我们可以找到用于线程转储的符号的描述:
还有另一个非常强大的工具,并且被 Web 管理员非常常用,称为 Thread Dump Analyzer。该工具能够为线程转储生成摘要。以下是使用此分析器的优点:
可以在多个线程转储之间比较长时间运行的线程
它分别可视化每个线程
它为每个线程转储生成摘要
让我们使用 Thread Dump Analyzer 开始分析过程:
2. 打开 TDA 控制台后,将日志上传到 TDA 控制台。它将隔离线程转储,按线程转储生成的升序显示线程转储,以及第一个线程转储的摘要。以下屏幕截图显示了上框的多个线程转储和第一个线程转储的摘要:
3. 现在,通过在 TDA 控制台上选择多个线程转储来比较长时间运行的线程。单击控制台选项卡中的长线程检测图标,屏幕上将出现一个弹出窗口。点击开始检测。以下屏幕截图显示了在 TDA 控制台上选择了多个线程转储,并且弹出窗口显示了长线程检测按钮:
4. 它生成长时间运行的线程摘要。根据摘要,您可以检测到问题。以下屏幕截图显示了长时间运行的线程的完整摘要。该表显示线程的名称、类型、进程ID、线程ID、本机ID、线程状态和地址范围:
死线程是实例的关键线程,因为它们会导致应用程序运行缓慢。它们可以作为垃圾回收的一部分被释放,系统将生成新线程导致内存泄漏。
到目前为止,我们已经讨论了针对任何问题执行的故障排除步骤。如果您执行了这些操作,则问题有 99% 的可能性得到解决。
生产环境中出现了很多问题,web管理员不得不去挖掘日志。管理员总是很难理解这些异常的含义以及它们在应用程序中生成的原因。了解异常的最佳方法是查看日志并检查第一个异常,这将为您提供问题的确切概念。
应用
JVM(内存)
数据库
让我们讨论一些有助于使环境稳定的异常及其解决方案。
如今,应用程序非常耗费资源。由于这些问题,Tomcat 实例内存不足。管理员必须非常努力地微调 Tomcat 7 实例并使环境非常稳定以在 Internet 上运行关键的 Web 应用程序。
在企业环境中,由于应用程序的高内存需求,经常会遇到内存不足的问题,管理员必须调整 JVM。失败会导致 Tomcat 实例出现内存不足异常。
例外:
原因:
运行应用程序时可能经常出现此错误,这需要大量内存密集型资源。因此,它会导致服务器上的内存不足异常并导致服务中断。
解决方案:
您必须增加 Tomcat 系统的最大堆大小。需要注意的是,您只能分配 70% 的物理内存作为 JVM 内存,而 30% 是为操作系统保留的。使用命令 jmap
检查JVM配置,然后在配置中增加。
需要在Tomcat的启动脚本中添加如下Java参数,可以在 TOMCAT_HOME/bin
中找到,根据内存需求增加JVM分配,回收Tomcat实例。
到目前为止,我们已经讨论了各种 JVM 级别的问题。现在是讨论常见数据库相关问题的时候了。
管道损坏异常是生产环境中报告的最常见问题之一。这个例外是什么意思?这意味着来自 J2EE 容器的数据库连接被终止。此问题的可能原因是频繁的网络断开连接、数据库上的以太网故障或 J2EE 服务器级容器。
以下屏幕截图显示了日志中的错误:
例外:
原因:
此问题是由于 Tomcat 7 和数据库之间的连接丢失造成的。
回收 Tomcat 实例以恢复连接。
现在我们知道如何解决问题并在系统中找到潜在的解决方案。还有一点要讨论,Web 服务器基准测试。如果不讨论这个主题,Tomcat 7 中的故障排除不能被标记为完成。这是我们衡量网络服务器性能的过程,也称为负载测试。在此过程中,我们以虚拟方式在重负载上运行服务器并估计实时性能。如果我们想为 Web 服务器做容量规划,这个过程非常有用。有许多工具可用于在服务器上执行负载测试,例如 ApacheBench (ab)、 JMeter、LoadRunner、OpenSTA 等。我们来讨论一下常用的开源工具,例如 ApacheBench 和 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 分别。