HOME

IBM MQ 学习 03:资源限制修正、队列管理器状态与 FDC 边界

文章目录8 节

第二章安装完成后,QM1 能启动、Q1.LEARN 能完成 put/get,但启动时留下了一个问题:RLIMIT_NOFILE 偏低。这个问题不影响学习环境继续跑通,但它会影响我们对环境健康状态的判断,所以这一章先把它修正掉。

这一章的重点不是背参数,而是建立一个判断顺序:先看当前用户资源限制,再看队列管理器状态,再看队列状态和消息流,最后结合错误日志和 FDC 判断是否还有当前故障。

修正资源限制

本次实际写入了两类配置。

系统级内核参数:

/etc/sysctl.d/99-ibm-mq.conf

fs.file-max = 524288
kernel.threads-max = 32768

mqm 用户级限制:

/etc/security/limits.d/99-ibm-mq.conf

mqm soft nofile 10240
mqm hard nofile 10240
mqm soft nproc 4096
mqm hard nproc 4096

这里要注意一个边界:sysctl 处理系统级参数,limits.d 处理登录会话中的用户级限制。修改 limits.d 后,需要重新进入 su - mqm,新会话才会拿到新限制。

在 mqm 用户下验证

这一批命令的目的,是证明我们检查的是实际管理队列管理器的 mqm 用户,而不是 root 用户。

# 切换到 mqm 用户,使用 MQ 管理上下文
su - mqm

# 确认当前用户身份
id

# 检查当前会话的 soft nofile 限制
ulimit -Sn

# 检查当前会话的 hard nofile 限制
ulimit -Hn

# 用 IBM MQ 自带工具检查系统和当前用户限制
/opt/mqm/bin/mqconfig

实际验证结果:

mqm@IBM_MQ_01:~> id
uid=483(mqm) gid=1000(mqm) 组=1000(mqm)

mqm@IBM_MQ_01:~> ulimit -Sn
10240

mqm@IBM_MQ_01:~> ulimit -Hn
10240

mqconfig 的关键输出:

System Settings
  file-max            3328 of 524288 files       (0%)    IBM>=524288       PASS
  pid_max             342 of 32768 processids    (1%)    IBM>=32768        PASS
  threads-max         342 of 29558 threads       (1%)    IBM>=32768        WARN

Current User Limits (mqm)
  nofile       (-Hn)  10240 files                        IBM>=10240        PASS
  nofile       (-Sn)  10240 files                        IBM>=10240        PASS
  nproc        (-Hu)  128 of 4096 processes      (3%)    IBM>=4096         PASS
  nproc        (-Su)  128 of 4096 processes      (3%)    IBM>=4096         PASS

结论:mqm 用户的 nofilenproc 已达到当前 IBM MQ 检查脚本给出的建议值,系统级 file-max 也已经通过。threads-max 仍然是 WARN,学习环境可以继续;生产环境需要结合内存、内核和实际负载另做评估。

root 结果为什么不能替代 mqm

我一开始也看到了 root 下的 mqconfig 结果:

Current User Limits (root)
  nofile       (-Hn)  4096 files                         IBM>=10240        FAIL
  nofile       (-Sn)  1024 files                         IBM>=10240        FAIL

这个结果不代表 mqm 修正失败。mqconfig 会检查当前运行命令的用户限制;如果用 root 执行,它看到的就是 root 的限制。当前学习环境中,队列管理器由 mqm 管理,所以更关键的是 mqm 会话里的检查结果。

同样,root 下执行 MQSC 管理命令也可能失败:

AMQ8135E: Not authorized.

这说明后续做队列管理器管理、MQSC 查询和 mqconfig 验证时,默认应该先进入 su - mqm

检查 QM1 运行状态

资源限制修正后,先看队列管理器是否还在运行。

# 查看队列管理器列表和运行状态
dspmq

# 通过 MQSC 查看队列管理器运行状态
echo "DISPLAY QMSTATUS" | runmqsc QM1

实际输出:

mqm@IBM_MQ_01:~> dspmq
QMNAME(QM1)                                               STATUS(正在运行)
mqm@IBM_MQ_01:~> echo "DISPLAY QMSTATUS" | runmqsc QM1
AMQ8705I: 显示队列管理器状态详细信息。
   QMNAME(QM1)                             STATUS(RUNNING)

这里顺便修正一个容易混淆的点:DISPLAY QMGR 查询的是队列管理器配置属性,DISPLAY QMSTATUS 查询的是运行状态。STATUS 不是 DISPLAY QMGR 的有效属性。

检查学习队列状态

接着看 Q1.LEARN 这个本地队列是否有消息积压,是否还有样例程序挂着没有退出。

# 查看本地队列深度和当前打开队列的输入/输出进程数
echo "DISPLAY QLOCAL(Q1.LEARN) CURDEPTH IPPROCS OPPROCS" | runmqsc QM1

实际输出:

AMQ8409I: 显示队列细节。
   QUEUE(Q1.LEARN)                         TYPE(QLOCAL)
   CURDEPTH(0)                             IPPROCS(0)
   OPPROCS(0)

这三个字段的含义很直接:

  • CURDEPTH(0):当前没有积压消息。
  • IPPROCS(0):当前没有进程以输入方式打开队列。
  • OPPROCS(0):当前没有进程以输出方式打开队列。

这不能证明所有业务都正常,但它能证明当前学习队列是干净的,没有积压,也没有样例程序挂着。

修正后再跑一次消息流

资源限制修正后,我们又做了一次最小 put/get 健康检查。

# 放入一条健康检查消息
echo "health check after limits fix" | /opt/mqm/samp/bin/amqsput Q1.LEARN QM1

# 查看放入消息后的队列深度
echo "DISPLAY QLOCAL(Q1.LEARN) CURDEPTH" | runmqsc QM1

# 从队列取出消息
/opt/mqm/samp/bin/amqsget Q1.LEARN QM1

# 查看取出消息后的队列深度
echo "DISPLAY QLOCAL(Q1.LEARN) CURDEPTH" | runmqsc QM1

关键输出:

Sample AMQSPUT0 start
target queue is Q1.LEARN
Sample AMQSPUT0 end

CURDEPTH(1)
Sample AMQSGET0 start
message <health check after limits fix>

CURDEPTH(0)

结论:修正资源限制后,QM1 仍然可以完成本地消息放入和取出,队列最终回到空队列状态。

FDC 怎么看

本章中还发现过一个历史 FDC:

/var/mqm/errors/AMQ10554.0.FDC

关键字段:

Probe Id: ZX000065
Component: zxcExecutionController
Program: amqzxma0
QueueManager: QM1
Major Errorcode: xecL_W_PERFORMANCE_BOTTLENECK

错误日志里也能看到对应记录:

AMQ6125E: 发生了内部 IBM MQ 错误。
AMQ6184W: 在队列管理器 QM1 上发生了内部 IBM MQ 错误。

这类文件不能只按“有 FDC 就一定还有故障”来判断。我们这次的判断依据是:

  • FDC 产生在资源限制修正之前。
  • 修正后 QM1 正在运行。
  • DISPLAY QMSTATUS 返回 STATUS(RUNNING)
  • Q1.LEARN 队列状态正常。
  • 修正后消息 put/get 复测通过。
  • 没有新的同类 FDC 证据。

所以这份 FDC 当前按历史残留处理,不作为当前阻塞。以后排查 FDC,要同时看时间线、Probe Id、错误日志、队列管理器当前状态和复测结果。

本章小结

这一章把第 2 章遗留的资源限制问题补齐了,也顺手建立了更完整的 MQ 健康检查思路。

  • 已验证:mqm 用户下 nofilenproc 通过,系统级 file-max 通过;QM1 运行,Q1.LEARN 无积压,修正后消息流正常。
  • 环境改变:新增 IBM MQ 相关系统级和 mqm 用户级资源限制配置。
  • 关键概念:MQ 健康检查要分层看,用户上下文、队列管理器状态、队列状态、消息流和错误日志不能混在一起判断。
  • 要记住的坑:rootmqconfignofile FAIL 不等于 mqm 没修好;DISPLAY QMGRDISPLAY QMSTATUS 不是一回事;FDC 要结合时间线和复测结果判断。
  • 下一步:进入 listener、SVRCONN 通道和客户端连接,让第二台机器参与实验。
IBM MQ Linux 中间件 故障排查 技术分享