lisongqing
作者lisongqing联盟成员·2021-03-15 13:59
软件架构设计师·IPS

DB2数据库hang时如何收集数据

字数 6737阅读 4538评论 0赞 5

前些天一个银行客户的核心系统因为服务器连接存储 IO 卡发生故障,存储多路径驱动未能及时将 LUN 故障链路 PATH 置为 Failled ,从 IO 卡故障后尝试开始进行自我恢复到恢复失败有 5 分多钟,部分 IO 请求也 pending 了 5 分多钟,才返回失败,然后才转由正常 Path 重发处理。 核心系统上数据库却不能响应新的连接和 SQL 请求了。客户运维人员经过 2 个多小时努力仍没有改进,不得不将数据库切换到 HA 备机运行。但在切换备机前,没有做预案收集当时系统和数据库的故障状态数据, AIX 系统还有相关 errlog 错误日志用于查找故障时问题的蛛丝马迹,但系统到存储层面有 2*8=16 条 IO PATH ,故障引起 8 条 PATH 故障,还有 8 条可以正常工作。但数据库系统因为当时没有产生任何错误日志,后面再收集 db2support 数据已经于事无补了,已无法准确分析、判断当时数据库运行异常的根因了。


DBA 在日常运维的过程中,或多或少会经历数据库 hang 住不能影响的问题。本文描述 DB2 数据库几种不同类型的 hang 住现象,及如何收集相应数据供后台专家分析问题根因。本文档仅适用于 Unix 或 Linux 或 Windows 上的单分区数据库,如果是 DB2 PureScale 或者 DB2 DPF 集群环境,还需要收集集群相关数据。本文数据收集会尽量涵盖故障分析所需的完整的数据集,包括数据库 lock 、 latch 、 thread stack 和内存等状态,但有时也需要从 OS 命令 /API 获取更多进行分析。

DB2 数据库 hang 一般分以下情形:

i. Hard Hang: 此时 DB2 不能响应任何 CLP 命令(如: db2 "list applications" 不返回任何信息或提示)。 DB2 通常会发出许多 OS 级别调用,这些调用需要在 kernel space 中执行,并且可能因各种故障原因卡住。从 DB2 用户角度来看,此时:发起新的 DB2 连接请求 或者 在现有 DB2 连接会话中执行任何 SELECT 或 DML SQL 都会被挂起。 db2pd 命令有些情况下也会 hang 住并报 timeout 超时错误;有些情况下 db2pd 能工作,但别的命令如: db2 snapshot 命令或 db2mon 监控不工作。**

ii. Passive Hang: DB2 引擎有响应,但速度非常缓慢。而 OS 命令则运行良好,没有任何延迟。如: db2 "list applications" 需要几分钟才能返回值。系统相关命令 vmstat/iostat/top/topas 命令显示没有任何问题。


数据收集 :在 DB2 hang 住状态下,分析问题的最基本数据是 db2sysc 进程所有 edus 的 stack traces 。我们以两种方式收集 stack 数据,一种从 DB2 进程用户空间,另一种 OS 内核空间。在某些情况下,若 stack dump 信号位于内核代码路径中, signal handers 可能会错过它。

因此第一要务是分清数据库 hang 属于哪一种情况,然后决定用哪个最常见的数据收集命令: db2fodc -hang full 或 db2fodc -hang basic 。

A. db2fodc -hang full :它使用 db2cos ( data collection script )收集数据,包括: stack 、 trace 、 snapshot 和 OS 信息。它适合于 Passive Hang的情况

B. db2fodc -hang basic: 顾名思义,它是 full option 收集数据信息子集。它适合尝试新连接会 hang 住,但现有的连接还能处理查询和 DML 请求的情况。

C. Hard Hang时数据收集:

C.1 当所有 DB2 CLP 命令包括 db2pd 都 hang 住的情况下,假如 OS 系统资源(特别是内存)并未耗尽,按下列方式进行数据收集:

a) AIX系统:

vmstat -Iwt 1 30 > vmstat_Iwt.issue.\`date '+%Y-%m-%d-%H.%M.%S'\`

iostat -RDTVl 2 15 > iostat_RDTVl.issue.\`date '+%Y-%m-%d-%H.%M.%S'\`

ps -kelf >ps.kelf.\`date '+%Y-%m-%d-%H.%M.%S'\`

svmon -P \`db2pd -edus | grep "^db2sysc" | awk '{ print $3 }'\` > svmon.P.\`date '+%Y-%m-%d-%H.%M.%S'\`

svmon -G >svmon.G.\`date '+%Y-%m-%d-%H.%M.%S'\`

获取 db2sysc 进程 PID : ps -ef |grep db2sysc

ps -mo THREAD -p >db2sysc.thread.\`date '+%Y-%m-%d-%H.%M.%S'\`

procstack >pstack.\`date '+%Y-%m-%d-%H.%M.%S'\`

等待 30 秒

procstack >pstack.\`date '+%Y-%m-%d-%H.%M.%S'\`

等待 30 秒

procstack >pstack.\`date '+%Y-%m-%d-%H.%M.%S'\`

以root用户运行

下载 pdump.sh 工具 : https://www.ibm.com/support/pages/pdump-tool-overview 并运行

pdump.sh -l

sleep 60

pdump.sh -l

注意: db2sysc 可能有很多现成 , dump 可能会需要一些时间。

如果上述命令不工作,可尝试如下 kdb 命令或者所有 threads 信息:

echo 'th *' | kdb -script >thread.list

egrep -v "NONE|ZOMB" thread.list | egrep pvthr | tr '*!>' ' ' | awk '{print "f "$2}' | kdb -script > thread.stacks.\`date '+%Y-%m-%d-%H.%M.%S'\`

等待 30 秒

echo 'th *' | kdb -script >thread.list

egrep -v "NONE|ZOMB" thread.list | egrep pvthr | tr '*!>' ' ' | awk '{print "f "$2}' | kdb -script > thread.stacks.\`date '+%Y-%m-%d-%H.%M.%S'\`

b) LINUX :

vmstat 1 30 > vmstat.issue.\`date '+%Y-%m-%d-%H.%M.%S'\`

iostat -xt 2 15 > iostat_xt.issue.\`date '+%Y-%m-%d-%H.%M.%S'\`

ps -eLf >ps_eLf.\`date '+%Y-%m-%d-%H.%M.%S'\`

top -b -n 2 -d 10 >top.\`date '+%Y-%m-%d-%H.%M.%S'\`

获取 db2sysc 进程 PID: ps -ef |grep db2sysc

gstack should be installed on the machine.

以 db2 实例用户或 root用户运行:

gstack >gstack.\`date '+%Y-%m-%d-%H.%M.%S'\`

等待 30 秒

gstack >gstack.\`date '+%Y-%m-%d-%H.%M.%S'\`

等待 30 秒

gstack >gstack.\`date '+%Y-%m-%d-%H.%M.%S'\`

上面命令将获取用户态线程 stack 。

在 root 用户下用如下命令获取 kernel 态线程 stack:

echo “1” > /proc/sys/kernel/sysrq

echo “t” > /proc/sysrq-trigger # 它将 dump 所有线程 stack

dmesg > kernel.stack.\`date '+%Y-%m-%d-%H.%M.%S'\`

等待 30 秒

echo “1” > /proc/sys/kernel/sysrq

echo “t” > /proc/sysrq-trigger # 它将 dump 所有线程 stack

dmesg > kernel.stack.\`date '+%Y-%m-%d-%H.%M.%S'\`

echo “0” > /proc/sys/kernel/sysrq


c) Windows:

db2bddbg -d db2ntDumpTid -1 stack.1

等待 30 秒

db2bddbg -d db2ntDumpTid -1 stack.2

Once it is done try to format the stacks using

db2xprt stack.1 stack.fmt.1

db2xprt stack.2 stack.fmt.2

C.2 当所有 DB2 CLP 命令 hang 住的情况下,但 db2pd 正常工作情况下,,按下列方式进行数据收集:

a) AIX系统:

OS命令:

vmstat -Iwt 1 30 > vmstat_Iwt.issue.\`date '+%Y-%m-%d-%H.%M.%S'\`

iostat -RDTVl 2 15 > iostat_RDTVl.issue.\`date '+%Y-%m-%d-%H.%M.%S'\`

ps -kelf >ps.kelf.\`date '+%Y-%m-%d-%H.%M.%S'\`

svmon -P \`db2pd -edus | grep "^db2sysc" | awk '{ print $3 }'\` > svmon.P.\`date '+%Y-%m-%d-%H.%M.%S'\`

svmon -G >svmon.G.\`date '+%Y-%m-%d-%H.%M.%S'\`

DB2命令:

db2pd -alldbs -mempool -memset -dbptnmem -inst >db2pd.mempool.\`date '+%Y-%m-%d-%H.%M.%S'\`

db2pd -alldbs -active -apinfo -agent >db2pd_age.\`date '+%Y-%m-%d-%H.%M.%S'\`

db2pd -edus -rep 30 3 >db2pd.edus.\`date '+%Y-%m-%d-%H.%M.%S'\`

db2pd -stack all dumpdir=pwd -rep 30 3>stack.\`date '+%Y-%m-%d-%H.%M.%S'\`

b) Linux:

OS命令:

vmstat 1 30 > vmstat.issue.\`date '+%Y-%m-%d-%H.%M.%S'\`

iostat -xt 2 15 > iostat_xt.issue.\`date '+%Y-%m-%d-%H.%M.%S'\`

ps -eLf >ps_eLf.\`date '+%Y-%m-%d-%H.%M.%S'\`

top -b -n 2 -d 10 >top.\`date '+%Y-%m-%d-%H.%M.%S'\`

cat /proc/meminfo > meminfo.txt.\`date '+%Y-%m-%d-%H.%M.%S'\`

mpstat -P ALL 1 15 > mpstat.txt.\`date '+%Y-%m-%d-%H.%M.%S'\`

pidstat -t -u -T TASK 1 15 > pidstat.txt.\`date '+%Y-%m-%d-%H.%M.%S'\`

pidstat -r 1 15 > pidstat_mem.txt.\`date '+%Y-%m-%d-%H.%M.%S'\`

pidstat -d 1 15 > pidstat_disk.txt.\`date '+%Y-%m-%d-%H.%M.%S'\`

DB2命令:

db2pd -alldbs -mempool -memset -dbptnmem -inst >db2pd.mempool.\`date '+%Y-%m-%d-%H.%M.%S'\`

db2pd -alldbs -active -apinfo -agent >db2pd_age.\`date '+%Y-%m-%d-%H.%M.%S'\`

db2pd -edus -rep 30 3 >db2pd.edus.\`date '+%Y-%m-%d-%H.%M.%S'\`

db2pd -stack all dumpdir=\`pwd\` -rep 30 3>stack.\`date '+%Y-%m-%d-%H.%M.%S'\`

c) Windows:

DB2/OS命令:

db2pd -winx >winx.out

db2pd -vmstat 1 10>vmstat.out

db2pd -alldbs -mempool -memset -dbptnmem >db2pd.mempool

db2pd -alldbs -active -apinfo -agent >db2pd_age

db2pd -edus -rep 30 3 >db2pd.edus

db2pd -stack all dumpdir=\`pwd\` -rep 30 3>stack.out

将在当前目录生成 db2pd Stacks 数据,通过 db2xprt 格式化它:

db2xprt >stack.fmt.1

d) 针对所有平台收集:

db2trc on -l 512m -t

等待 1 分钟

db2trc dump trace.dmp.\`date '+%Y-%m-%d-%H.%M.%S'\`

db2trc flw \`ls trace.dmp.* |tail -1\` trace.flw.\`date '+%Y-%m-%d-%H.%M.%S'\` -t

db2trc fmt \`ls trace.dmp.* |tail -1\` trace.fmt.\`date '+%Y-%m-%d-%H.%M.%S'\`

参考链接 : https://www.ibm.com/support/pages/db2-hang-data-collection

发布文章时, 命令中‘\`’符号有问题, 您可以参考:
https://github.com/DBres4Power/DB2_Doc4Power/blob/main/Administration/DB2%E6%95%B0%E6%8D%AE%E5%BA%93hang%E6%97%B6%E5%A6%82%E4%BD%95%E6%94%B6%E9%9B%86%E6%95%B0%E6%8D%AE.md

运维人员都不希望生产系统尤其是核心数据库 发生 hang 故障,一旦故障可能将影响企业很多业务。为预防故障发生,需要在数据库系统整个生命周期里 重视数据库高可用方案设计、谨按最佳实践规划和部署、完善监控和告警机制,筑好 IT 系统安全可靠运行的长城。我们还得有完善的预案,应对万一出现的故障,在首先确保生产运行的连续性的前提下,最好也能兼顾故障现场数据收集,方便后续故障分析和诊断,并积攒宝贵经验。


浪潮商用机器有限公司 —— 技术支持部

2021 年 3 月

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

5

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广