诊断工具和日志

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

本主题讨论了可用于在 Apigee Edge 上排查网络和 JVM 相关问题的网络工具、JVM 工具和诊断日志。

TCP/IP 数据包嗅探器 (tcpdump) 实用程序

tcpdump 工具是一种命令行数据包嗅探器工具,可用于捕获或过滤通过网络接收或传输的 TCP/IP 数据包。它适用于基于 Linux/Unix 的操作系统。您可以使用 yum 安装此实用程序,如下所示:

yum install tcpdump

tcpdump 工具对于排查网络或 SSL 相关问题非常有用。例如:

  • 502 错误网关错误(由于 EOF 异常导致)
  • 503“服务不可用”错误
  • SSL 握手失败

如需排查任何此类问题,您必须先确定发生错误的那对组件。对于 Edge,可以是以下键值对之一:

  • 客户端应用和路由器
  • 路由器和消息处理器
  • 消息处理器和后端服务器

确定存在问题的一对组件后,您可以在其中一个组件或两个组件上使用 tcpdump 捕获网络数据包。

使用 tcpdump 捕获发送到特定主机/从特定主机接收的数据包

使用以下 tcpdump 命令捕获发送到指定主机(IP 地址)或从指定主机(IP 地址)接收的所有数据包,并将信息保存在指定的文件中:

tcpdump -i any -s 0 host <IP address> -w <File name>

其中:

参数 说明
-i (接口)指定应从哪个接口捕获数据包。使用“any”的值可捕获所有接口的数据包。
-s (snarf/snaplen) 指定要捕获的每个数据包的数量。使用值 0(零)可让您捕获整个数据包。
IP 地址 是我们想要捕获其数据包的主机的 IP 地址
文件名 是 tcpdump 必须写入到的文件的名称

示例

假设您想要捕获消息处理器和后端服务器之间的数据包:

  1. 登录 Message Processor 计算机。
  2. 确定后端服务器的 IP 地址(假设 IP 地址为 22.22.22.22),我们想要为其捕获数据包。

使用以下命令捕获具有特定 IP 地址的主机的网络数据包:

tcpdump -i any -s 0 host 22.22.22.22 -w rmp-123.pcap

如果后端服务器解析为多个 IP 地址,请在 tcpdump 命令中使用后端服务器的主机名,如下所示:

tcpdump -i any -s 0 host <Hostname> -w rmp-123.pcap

如果有多个具有不同 IP 地址(22.22.22.22、33.33.33.33 和 44.44.44.44)的后端服务器,请使用以下 tcpdump 命令:

tcpdump -i any -s 0 host 22.22.22.22 or host 33.33.33.33 or host 44.44.44.44 -w rmp-123.pcap

分析 tcpdump

您可以使用 tcpdump 命令或基于 GUI 的工具 Wireshark 查看或分析 tcpdump。

参考

堆转储

堆转储是 Java 进程内存的快照。它们包含在收集堆转储时有关堆中的 Java 对象和类的信息。它们通常非常大,介于几个 100 MB 到几 GB 之间。

当消息处理器等 Java 进程显示以下内容时,堆转储非常有用:

  • 高内存用量
  • OutofMemoryError

为 Java 进程生成堆转储

Java 提供了一个名为 jmap 的实用程序,可用于生成正在运行的 Java 进程的内存统计信息或堆转储。

使用以下 jmap 命令生成 Java 进程的堆转储:

sudo -u apigee <JAVA_HOME>/bin/jmap -dump:live,format=b,file=<filename> <pid>

其中:

参数 说明
JAVA_HOME 是 Java 的安装目录
filename 是将堆转储写入到的文件名
pid 是必须捕获其头转储的 Java 应用的进程 ID

示例

假设消息处理器 mp-east 的内存用量较高或抛出 OutOfMemory 错误。在 Unix 操作系统上使用 ps 命令,确定消息处理器的进程 ID。假设代码为 24569。

按如下方式运行 jmap 实用程序以生成堆转储:

sudo -u apigee <JAVA_HOME>/bin/jmap -dump:live,format=b,file=mp-east-heapdump.bin 24569

分析堆转储

您可以使用 Eclipse MAT(内存分析器工具)分析堆转储,以确定潜在的内存泄漏或哪些 Java 对象导致内存用量较高。

参考

如何收集堆转储

jmap 实用程序

jmap 手册页面

内存分析器工具 (MAT)


线程转储

线程转储是正在运行的 Java 进程的所有线程的状态快照。每个线程的状态都会与其堆栈的内容一起显示,称为堆栈轨迹。 其中一些线程属于正在运行的 Java 应用的一部分,而另一些线程则属于 JVM 内部线程。

线程转储会显示应用的每个线程活动的相关信息。此信息非常有助于:

  • 诊断诸如 CPU 高峰、响应时间过长或 Java 应用无响应等问题
  • 优化应用和 JVM 性能

生成线程转储

您可以使用 jstack 实用程序生成 Java 进程的线程转储,如下所示:

sudo -u apigee <JAVA_HOME>/bin/jstack -l <pid> > <filename>

其中:

参数 说明
JAVA_HOME 是 Java 的安装目录。
pid 要捕获其线程转储的 Java 应用的进程 ID。
filename 是写入线程转储的文件名。

示例

如需在消息处理器 mp-east 上为进程 ID 37320 生成线程转储,请使用以下命令:

sudo -u apigee <JAVA_HOME>/bin/jstack -l 37320 > /opt/apigee/edge-message-processor/mp-east-threadDump.txt

根据上面的示例,进程的线程转储将保存到 /opt/apigee/edge-message-processor/mp-east-threadDump.txt 文件中。

分析线程转储

您可以在任何文本编辑器(例如 vi (Linux)、记事本 (Windows))中查看线程转储。 如需详细了解线程转储的不同部分以及如何解读这些信息,请参阅 线程转储

参考