[Linux]

针对 Linux 上的资源问题的其他检查

如何确定和解决与 "IBM® MQ资源相关的问题,包括 "IBM MQ进程的资源使用情况、确定和解决与资源不足相关的问题,以及您的资源限制配置。

用于调查资源问题的有用命令和配置文件

用于显示系统上的当前值或对系统进行临时更改的有用命令:
ulimit -a
显示用户限制
ulimit -Ha
显示用户硬限制
ulimit -Sa
显示用户软限制
ulimit -<paramflag> <value>
其中,paramflag 是资源名称的标记,例如,s 表示堆栈。

要对系统上的资源限制进行永久更改,请使用 /etc/security/limits.conf/etc/security/limits

您可以从 Linux® 上的 proc 文件系统获取当前为进程设置的资源限制。 例如,cat /proc/<pid of MQ process>/limits

调整 IBM MQ 或内核参数之前的基本检查

您需要调查以下项:
  • 活动连接数是否在期望的限制范围内。

    例如,假设在用户进程数不超过 3000 时,您的系统调整为允许 2000 个连接。 如果连接数增加至超过 2000 个,那么用户进程数已增加至超过 3000(因为添加了新的应用程序),或者出现了连接泄漏。

    要检查这些问题,请使用以下命令:
    • IBM MQ 进程数:
      ps -eLf|egrep "amq|run"|wc -l
    • 连接数:
       echo "dis conn(*) all" | runmqsc <qmgr name>|grep EXTCONN|wc -l
    • 共享内存使用量:
      ipcs -ma
  • 如果连接数超出期望的限制,请检查连接源。
  • 如果共享内存使用量非常高,请检查以下项的数量:
    • 主题
    • 打开的队列句柄
  • IBM MQ 角度来看,需要检查和调整以下资源:
    • 指定的用户进程数所允许的最大线程数。
    • 数据段
    • 堆栈段
    • 文件大小
    • 打开的文件句柄
    • 共享内存限制
    • 线程限制,例如, threads-max on Linux
  • 使用 mqconfig 命令可检查当前资源使用情况。
注:
  1. 上文中列出的某些资源需要在用户级别进行调整,而某些资源则需要在操作系统级别进行调整。
  2. 上述列表不是完整的列表,但足以解决 IBM MQ报告的大多数常见资源问题。
  3. 由于每个线程都是一个轻量级进程 (LWP),因此需要在线程级别进行调整。

IBM MQ 或应用程序创建线程或进程时发生问题

xcsExecProgramxcsCreateThread 中的故障
探测器标识、错误消息和组成部分
来自IBM MQ进程(例如amqzlaa0)或应用程序的xtmStartTimerThread的XY348010
XC037008来自xcsExecProgram,错误代码为xecP_E_PROC_LIMITfromamqzxma0
XC035040 xcsCreateThread
xcsExecProgram 返回 XC037007,并附带 xecP_E_NO_RESOURCE
xcsCreateThread 会失败,并返回 xecP_E_NO_RESOURCE,后跟故障数据捕获,例如,来自 zlaMain 的 ZL000066
探测器标识可能会有所不同。 请检查错误代码 xecP_E_PROC_LIMITxecP_E_NO_RESOURCE
从 pthead_create 报告 errno 11 的错误消息,例如:AMQ6119S: An internal IBM MQ error has occurred ('11 - Resource temporarily unavailable'从 pthread_create。)
解决 Linux 上的问题
IBM MQ 设置错误代码 xecP_E_PROC_LIMITpthread_create 或 fork 使用 EAGAIN 时失败。
EAGAIN
检查并提高最大用户进程数和堆栈大小用户进程资源限制。
Linux 上需要其他配置
复查并增大 kernel.pid_max(/proc/sys/kernel/kernel.pid_maxkernel.threads-max (/proc/sys/kernel/threads-max)内核参数的限制。
您需要增加 mqm 用户和用于启动队列管理器和 IBM MQ 应用程序的任何其他任何用户的最大用户进程数 (nproc) 和堆栈大小资源限制。
ENOMEM
IBM MQ 设置错误代码 xecP_E_NO_RESOURCEpthread_create 或 fork 使用 ENOMEM 时失败。
检查并提高堆栈大小和数据资源限制。
注:
  • 您可以使用 ulimit 命令或者通过更改资源限制配置文件来增加用户进程资源限制。
  • 使用 ulimit 命令所做的更改都是临时更改。 修改 /etc/security/limits/etc/security/limits.conf,使更改成为永久性更改。 操作系统上的实际配置可能有所不同,因此必须检查该配置。
  • 您还应该查看操作系统手册(例如,pthread_create 的联机帮助页)以获取有关资源问题和调整资源限制的更多详细信息,并确保对资源限制进行相应配置。
  • 您还应该检查系统的资源(包括内存和 CPU)是否不足。

创建共享内存时出现的问题

错误:shmget 失败,错误编号为 28(ENOSPC)
| Probe Id          :- XY132002                                               |
| Component         :- xstCreateExtent                                        |
| ProjectID         :- 0                                                      |
| Probe Description :- AMQ6119: An internal IBM MQ error has occurred         |
|   (Failed to get memory segment: shmget(0x00000000, 2547712) [rc=-1         |
|   errno=28] No space left on device)                                        |
| FDCSequenceNumber :- 0                                                      |
| Arith1            :- 18446744073709551615 (0xffffffffffffffff)              |
| Arith2            :- 28 (0x1c)                                              |
| Comment1          :- Failed to get memory segment: shmget(0x00000000,       |
|   2547712) [rc=-1 errno=28] No space left on device                         |
| Comment2          :- No space left on device                                |
+-----------------------------------------------------------------------------+
MQM Function Stack
ExecCtrlrMain?
xcsAllocateMemBlock
xstExtendSet
xstCreateExtent
xcsFFST

shmget 失败,错误编号为 22(EINVAL)
| Operating System  :- SunOS 5.10                                             |
| Probe Id          :- XY132002                                               |
| Application Name  :- MQM                                                    |
| Component         :- xstCreateExtent                                        |
| Program Name      :- amqzxma0                                               |
| Major Errorcode   :- xecP_E_NO_RESOURCE                                     |
| Probe Description :- AMQ6024: Insufficient resources are available to       |
|   complete a system request.                                                |
| FDCSequenceNumber :- 0                                                      |
| Arith1            :- 18446744073709551615 (0xffffffffffffffff)              |
| Arith2            :- 22 (0x16)                                              |
| Comment1          :- Failed to get memory segment: shmget(0x00000000,       |
|   9904128) [rc=-1 errno=22] Invalid argument                                |
| Comment2          :- Invalid argument                                       |
| Comment3          :- Configure kernel (for example, shmmax) to allow a      |
|   shared memory segment of at least 9904128 bytes                                                   |
+-----------------------------------------------------------------------------+
MQM Function Stack
ExecCtrlrMain
zxcCreateECResources
zutCreateConfig
xcsInitialize
xcsCreateSharedSubpool
xcsCreateSharedMemSet
xstCreateExtent
xcsFFST

意外的进程终止和队列管理器崩溃,或者队列管理器崩溃

进程意外结束,后跟来自 amqzxma0的 FDC
示例 FDC:
Date/Time         :- Mon May 02 2016 01:00:58 CEST
Host Name         :- test.ibm.com
LVLS              :- 8.0.0.4
Product Long Name :- IBM MQ for Linux (x86-64 platform)
Probe Id          :- XC723010
Component         :- xprChildTermHandler
Build Date        :- Oct 17 2015
Build Level       :- p800-004-151017
Program Name      :- amqzxma0
Addressing mode   :- 64-bit
Major Errorcode   :- xecP_E_USER_TERM
Minor Errorcode   :- OK
Probe Description :- AMQ6125: An internal IBM MQ error has occurred.

可能的原因和解决方案
  • 检查用户是否已终止任何进程。
  • 检查 IBM MQ 进程是否由于内存异常而结束:
    • 通过 FDC Component :- xehExceptionHandler 终止了进程?
    • 应用这方面已更正的已知问题的修订。
  • 检查操作系统是否因为进程的内存使用量较高而终止了进程:
    • IBM MQ 进程是否耗用了大量内存?
    • 操作系统是否终止了进程?
      请查看操作系统日志。 例如, Linux上的 OOM 杀手:
      Jan 2 01:00:57 ibmtest kernel: 
      amqrmppa invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0)
    • 对已知的内存泄漏问题应用修订。

进程使用的用户限制与已配置的限制的差别

进程使用的用户限制可能与已配置的限制不同。 如果进程由不同用户或用户脚本(例如,高可用性脚本)启动,那么可能发生此情况。 请务必检查正在启动队列管理器的用户并为此用户设置相应的资源限制。