内容


AIX 上的 Java 故障诊断:AIX 核心转储

Comments

重要说明

提供本文是为了方便客户。本文包含的信息按“原样”提供,不提供任何保证或支持。本文内容将在时间允许的情况下在“尽力”的基础上进行更新。

如果您需要,可以使用以下参考资料来获得有关受支持的文档和工具的详细信息:

引言

本文提供有关如何收集数据来调试核心转储问题的说明。如果您在联系支持中心之前完成本文中的步骤,则会提高解决问题的速度,因为您已经拥有了相关数据。那些步骤包括设置 AIX 环境变量以启用 fullcore 转储、设置 Java 以禁用 JVM 信号处理以及收集核心文件和关联的相关库。

拥有正确的预期

Java 进程中止的原因可能有多种,包括:

  • 内存访问问题
  • 不正确编译的本机代码
  • 无效的配置
  • 错误代码
  • 内存约束

这些原因可能是由 JVM 代码 (JIT)、AIX(库)或其他本机代码所引起的。

收集信息的过程可能要求多次重现问题来收集和排除数据,以确定和解决问题。仅一个 Javacore 文件可能就足够了,它可能涉及收集 AIX 核心文件和其他信息。如果问题无法在测试实验室或开发环境中重现,您可能需要从生产系统中收集数据。如果无法从演示该问题的系统中收集数据,支持团队就可能无法解决该问题。

在生产环境中收集数据会导致应用程序停止运行,从而会影响收入、稳定性和客户感受。然而,支持团队会尽全力将收集信息的迭代次数减至最少,并设法尽快解决问题。

服务通知

务必 阅读 IBM Developer kits for AIX, Java technology edition 中的 AIX Java 服务页面,以了解 AIX 上的 Java 的重要支持信息。明确地说,要注意主下载页面上的“End of Service”日期,并仔细阅读下载表下面有关 AIX 上的 Java 支持的条件和条款。

Javacore 与 AIX 核心

Javacore 文件是 Java 应用程序在某一时间的文本表示形式。Javacore 文件由 Java 进程在以下时刻创建:

  • 用户在 Java 进程上运行命令 kill -3
  • 进程由于致命错误/异常而中止或终止。

有关 Javacore 文件的特定信息,请参见 IBM JVM Diagnostic Guide

对于某些情况,提供同一进程所产生的 Javacore 文件集合可帮助了解应用程序的行为。当进程挂起或达到不稳定条件时,进程可能无法创建 Javacore 文件。

AIX 核心 是进程某一时间在内存中的二进制表示形式。从该核心中,您可以获得比 Javacore 中所报告的更多的信息,再加上 Javacore 文件所没有报告的其他进程信息。因此,在大多数情况下,支持团队会请求 AIX 核心文件而不是 Javacore 文件。

设置操作系统

缺省情况下,核心文件是在进行核心转储的进程的工作目录中创建的。但是该缺省核心文件存储库可以由用户更改。若要显示当前核心文件存储库,可以运行命令:

syscorepath -g

如果您不熟悉本文中的命令,请参见 AIX Documentation library 以了解相关信息和语法。

在运行命令时,您需要将斜体表示的文本替换为相应的值,否则就会获得错误和意外结果。

为了使 AIX 操作系统能够生成完整或全面的核心文件,请按照以下步骤操作:

  1. 通过以 root 用户身份运行以下命令,从而将用户进程限制设置为无限制:
    chuser fsize=-1 data=-1 core=-1 user_id_running_application

    在本例中,user_id_running_application 是运行 Java 应用程序的用户名称。例如:
    chuser fsize=-1 data=-1 core=-1 root

    这将把该用户的文件大小 (fsize)、核心文件大小 (core) 和内存大小 (data) 限制更改为无限制。使用这些设置时,可能存在相关的风险,因此一旦收集了信息,就应立即重新启用原始设置。完成更改之后,删除登录、用户配置文件或任何启动脚本中对 ulimit 命令的引用。在启动应用程序以使更改在新进程中生效之前,您必须作为该用户重新登录。如果用户不重新登录,那么即使该进程已重新启动,它也可能不会读取 ulimit 更改。而且,从 /etc/inittab 文件或从 cron 守护进程启动的任何应用程序也可能无法读取 ulimit 更改——您可能必须使用 ulimit 命令来更改进程启动脚本中的 ulimit,例如使用 ulimit -d unlimited 来将数据限制更改为无限制。做出这些更改将消除该用户 ID 的某些系统资源消耗约束。请确保在解决问题之后恢复旧的 unlimit 设置。

    在启动 Java 应用程序之前,通过运行 ulimit -a 命令来验证更改。

  2. 以 root 用户身份运行以下命令来启用系统的完全核心转储:
    chdev -l sys0 -a fullcore=true

    此更改不需要重新启动系统。如果熟悉 SMIT 实用程序,您可以运行 smitty chgsys 命令,然后将 Enable full CORE dumps 的值设置为 true,从而更改该设置。

  3. AIX 5.2 或更高版本提供的 syscorepath 实用程序可用于指定单个系统范围的目录,其中将保存任何进程的所有核心文件。系统上的所有用户都应拥有该目录的读写权限。如果某个用户在该目录中没有写权限,则不会创建核心文件。在这个系统范围的目录中生成的核心文件将具有基于进程 ID 和时间的唯一名称,例如 core.pid.MMddhhmmss,其中 pid 是进程 ID、MM 是月份、dd 是该月的日期、hh 是 24 小时格式的小时、mm 是分钟、ss 是秒。但是我们并不推荐使用此方法。该命令的语法为:
    syscorepath -p alternate_directory
  4. 使用以下命令来验证核心文件的目录、文件所有权和权限:
    aclget directory_or_file

    此命令验证运行应用程序的用户有权对目标目录执行写操作。如果有任何疑问,可作为运行应用程序的用户登录并运行以下命令:
    touch directory/core

    使用 chmodchown 命令来分别修改所有权或权限,或者运行 smitty user 来修改用户帐户的特征。对用户帐户的修改需要作为该用户重新登录。

  5. 确保有足够的磁盘空间来保存核心文件。核心文件最大可以与内存中的进程大小一样大。ps 命令输出中的 RSS(进程大小)字段可用于提供核心文件的近似大小。例如:
    ps avwwg java_pid

    如果需要额外空间,可通过删除不需要或较旧的文件来释放空间,或者增加目标文件系统的大小。

  6. 使用一组 AIX 命令或实用程序来收集信息。在继续之前,必须安装以下 AIX 文件集:
     File                               Fileset               
     --------------------------------------------------
    /usr/bin/uudecode            bos.net.uucp  
    /usr/bin/syscorepath         bos.rte.control 
    /usr/sbin/snapcore           bos.rte.serv_aid ( also /usr/bin/truss )

    若要确保所有文件集都已正确安装,可以运行命令:
    lslpp -l fileset_name

    任何缺少的文件集都应从 AIX 基础安装介质进行安装,然后使用 IBM Fix Central 来升级到最新级别。

禁用 Java 信号处理

正如在Javacore 与 AIX 核心部分中所讨论的,Javacore 文件并不总是用于调试挂起情况的最佳工具。二进制 AIX 核心文件可以提供更有用的信息。为了获得理想的 AIX 核心文件,必须对 JVM 进行设置,使其在收到发送给进程的信号时不创建 Javacore。

未禁用信号处理程序时,进程在“当前”状态中可能表现为正在进行信号处理,从而可能隐藏了真正问题。如果应用程序具有处理 SIGILL、SIGFPE、SIGBUS 和 SIGSEGV 的信号处理程序,则应该禁用那些信号处理程序。必须在启动应用程序之前在运行应用程序的环境中进行更改。

对于应用程序由另一个进程(例如 WebSphere®)启动的情况,设置该环境可能会影响所有 Java 进程。对于这些情况,您需要参考应用程序的文档来启用特定于该应用程序的环境设置。

  1. 禁用 JVM 信号处理。

    应该在重新启动应用程序之前设置以下环境变量。

    export DISABLE_JAVADUMP=true
    export IBM_NOSIGHANDLER=true

    必须重新启动应用程序才能使此更改生效。请注意,这会阻止在运行 kill -3 或引发其他任何导致进程终止的信号时创建 Javacore 和 Heapdump 文件。

  2. 禁用应用程序信号处理。

    如果应用程序要处理 SIGQUIT、SIGILL、SIGFPE、SIGBUS、SIGABRT、SIGSYS 和 SIGSEGV 等信号,则应用程序可能需要禁用其信号处理程序。

    例如,IBM MQ 在缺省情况下要处理 SIGILL、SIGFPE、SIGBUS 和 SIGSEGV 信号。为了获得理想的核心文件,可能需要通过设置环境变量来禁用 MQ 的那些信号处理程序。

    export MQS_NO_SYNC_SIGNAL_HANDLING=1

    注意:请咨询 MQ 支持部门以验证那些设置,因为 MQ 可能随时间而更改。

    您务必要知道自己的应用程序是否有信号处理以及如何禁用它们以生成核心文件。

  3. 弄清在何处设置那些环境变量。

    可以在许多位置配置环境,具体取决于需要:

    • /etc/profile
    • /etc/csh.login
    • $HOME/.profile
    • $HOME/.cshrc
    • $HOME/.kshrc
    • 应用程序启动和配置脚本

    然而,我们不推荐您将其添加到 /etc/environment 文件。应用程序启动和配置脚本会覆盖所有其他设置。

收集数据

当出现问题时,我们的目标是收集尽可能多的信息,或者用于确定问题原因,或者用于为了解问题原因提供指导。问题可能在于操作系统(内核/库)、JVM(或 JIT)、应用程序 Java 本机接口(Java Native Interface,JNI)本机代码或第三方 JNI 代码。本部分包括一些从每个方面收集数据的命令。其中大多数命令都必须以 root 用户身份执行。

收集操作系统设置:

  1. 创建核心之后,运行以下命令:
    errpt -a > errpt.out
    lslpp -lc > lslpp.out
    instfix -i > instfix.out
    bootinfo -K > bootinfo.out
    lsattr -El sys0 > lsattr.out
    lsps -s > lsps.out
  2. 通过运行以下命令来对输出文件打包:
    tar -cf - *.out | compress -c > sysinfo.tar.Z
  3. 收集核心文件和关联的库。

    如果不确定核心文件所在的位置,可以使用 errpt -a | pg 并查找以 LABEL: CORE_DUMP 开头的条目——名为 CORE FILE NAME 的部分可以告诉您核心文件的正确位置。

    mv core core.001
    javaLibsGrabber.sh core.001
    compress core.001

    下载 javaLibsGrabber.sh 实用程序。

    您可以使用以下命令来检查 javaLibsGrabber.sh 是否收集了库:

    uncompress -c < core-libs.tar.Z | tar -tvf -

    如果 Java 版本为 Java 142 SR5 或者比 SR 5 for Java 142 更新的版本,您可以使用 snapcore 而不是 javaLibsGrabber.sh 来收集库,如下所示:

    snapcore -d save_directory core.001 fullpath_executable

    例如,

    snapcore -d /tmp/savedir core.001 /usr/java14/jre/bin/java

    此命令将在目录 /tmp/savedir 中创建一个存档 (snapcore_pid.pax.Z)。

对数据打包并将其发送到 IBM Support

使用下面的三个步骤来对数据打包并将其发送给 IBM 支持人员:

  1. 使用文件名 xxxxx.byyy.czzz.#.tar 来对文件执行 TAR 处理(存档)。例如:
    tar -cf xxxxx.byyy.czzz.#.tar sysinfo.tar.Z core.001.Z core-libs.tar.Z 
       optional-files

    tar -cf xxxxx.byyy.czzz.#.tar sysinfo.tar.Z snapcore_pid.pax.Z 
       optional-files

    请注意文件的大小,其中:
    • xxxxx 是 PMR 编号。
    • yyy 是分机号码。
    • zzz 是国家代码。
    • # 是确保放在 Testcase 服务器上的每个文件唯一性所需的序列号或日期。

    在发送文件之前,验证每个存档文件有效并包括以下文件:

    • sysinfo.tar.Z
    • core-libs.tar.Z 或 snapcore_pid.pax.Z
    • core.001.Z
  2. 对于上载的每个文件,都应该使用唯一文件名将这些文件发送到 IBM Testcase 服务器。为确保 AIX 支持团队的及时响应,您务必遵循下面的说明。如果您无法连接到 Testcase 服务器或无法向其发送数据,请检查网络中的防火墙和代理设置。
    ftp testcase.boulder.ibm.com
    login: anonymous
    password: user@host.com
    > cd /aix/toibm
    > bin
    > put xxxxx.byyy.czzz.#.tar
    > quit

您必须通过发送电子邮件或拨打 IBM 支持热线来联系 IBM,以获得 xxxxx.byyy.czzz 的 PMR 编号。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=188165
ArticleTitle=AIX 上的 Java 故障诊断:AIX 核心转储
publish-date=01112007