【Greenplum避坑指南4】如何收集coredump进行排错

析构星云
• 阅读 2525

在前两篇中, 我们介绍了如何排查长时间运行的query, 以及如何在服务器上启用core generation。今天,我们来介绍下,如何收集进程的coredump进行排错。

1. 关于coredump的介绍

当程序异常或崩溃时,操作系统会中止进程,并将进程此时的内存中的内容拷贝到磁盘的指定目录下存储,生成一个core文件(是一个内存映像,同时加上调试信息),它记录了程序挂掉时详细的状态描述,以方便编程人员调试。

Greenplum什么情况下会生成coredump

当发生以下情况之一时, 就会产生coredump

  1. 由于硬件故障导致程序内部无法访问特定内容, 在某些情况下, 程序会发送终止信号给进程, 强制程序退出重启。
  2. 由于一些程序错误导致进程访问了错误的内存地址。
  3. 用户主动控制进程dump core文件, 这种操作一般用于排查故障, 这个之后会提到。

Greenplum集群的coredump在哪里?

如果需要让系统允许程序dump core文件, 那么需要开启一些其他参数, 比如需要在ulimit里将core的大小设置为足够大(或者不限制)

$ ulimit -a | grep core
core file size          (blocks, -c) unlimited

一般情况下, 在linux系统中, 可以通过以下参数确认core file的路径:

# sysctl kernel.core_pattern
kernel.core_pattern = /<directory>/core-%e-%s-%u-%g-%p-%t

更多的配置细节请参考《如何在服务器上启用core generation》

另外, 在一些情况下(比如排查之前我们上几篇文章中提到的query慢等问题), 用户需要主动在运行中的进程上收集coredump。这时就可以用到gcore 这个命令。注意这个命令是包含在gdb程序组件中, 如果需要使用的话需要现在操作系统上安装gdb包。以下以centos 举例:

### 安装gdb ###
$ sudo yum -y install gdb
​
### 使用gcore收集seg0上的con8对应进程的coredump,对应的进程号为27705 ###
$ ps -ef | grep con[0-9] | grep con8 | grep seg0
gpadmin   27705  27589  0 16:19 ?        00:00:00 postgres: 20000, gpadmin gpadmin 192.168.6.198(39012) con8 seg0 cmd6 MPPEXEC UTILITY
​
$ gcore 27705
...
Saved corefile core.27705

之后, 就会在当前目录生成一个名为 core.[pid] 的文件, 这个即为进程27705的coredump

2. 如何收集coredump

如果需要针对core文件做离线排错(offline troubleshooting)。除了core文件本身之外, 我们还需收集所有对应进程调用的库文件(library)。如果库文件有缺失, 那么通过gdb打开core文件的话将会有信息确认, 导致排错困难。

查找和收集库文件相对比较繁琐, 所幸, 我们用于收集日志的GPMT工具已经支持自动收集打包coredump和库文件的指令。详细信息可以参考之前的文章

举例:

$ ./gpmt packcore -cmd collect -core ~/core/core.27705
Creating temp directory ./packcore-core.27705
...
Packcore generated:
  packcore-core.27705.tar.gz

3. 如何快速手动收集所有文件

有时候我们无法使用gpmt工具收集文件。比如core文件本身有问题(gpmt无法正确解析binary), 或者我们的环境里有安全要求不允许上传执行文件到服务器。在这种情况下, 我们就可以通过以下方法手工收集文件了。

简单来说, 步骤如下:

  1. 通过gdb命令info shared library 来获取所有进程调用的库文件
  2. 将所有库文件复制到对应的目录。 (注: 有很多库文件是以软连接的形式存在的, 因此我们需要复制其对应的目标文件。)

我们编写了如下脚本来帮助您快速实现上述步骤:

#!/bin/bash
​
### 执行core文件的路径 ###
coreFile='/home/gpadmin/core/core.27705'
### GPHOME的路径 ###
GOHOME="/opt/greenplum-db"
​
unset PYTHONHOME
unset PYTHONPATH
unset LD_LIBRARY_PATH
​
for i in `gdb -ex "info sharedlibrary" -ex "quit" $GPHOME/bin/postgres $coreFile | grep "^0x" | awk '{print $NF}'`; do dir=`dirname $i`; file=`basename $i`; mkdir -pv .$dir ; cp -Lrpv $dir/$file .$dir/$file ;done
​
cp -rp $coreFile ./
cp -rp $GPHOME/bin/postgres ./

示例如下:

$ bash collect_core.sh
mkdir: created directory ‘./lib64’
‘/lib64/libz.so.1’ -> ‘./lib64/libz.so.1’
mkdir: created directory ‘./opt’
mkdir: created directory ‘./opt/greenplum-db’
mkdir: created directory ‘./opt/greenplum-db/./lib’
‘/opt/greenplum-db/./lib/libgpopt.so.3’ -> 
…
​
### result ###
$ ll
total 405188
-rw-rw-r-- 1 gpadmin gpadmin 351986816 Mar 15 16:22 core.27705
drwxrwxr-x 2 gpadmin gpadmin       293 Mar 16 11:16 lib64
drwxrwxr-x 4 gpadmin gpadmin        50 Mar 16 11:16 opt
-rwxr-xr-x 1 gpadmin gpadmin  62921216 Sep 26 00:14 postgres

4. 参考资料

【Greenplum避坑指南4】如何收集coredump进行排错

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
3年前
Python Challenge Level 18
初学Python,挑战一下流行的PythonChallenge,很不幸,卡在了18关~~被字符字节码之间的转换搞得焦头烂额,不过终于搞定了还是很happy的~~~主要的问题就是16进制形式的字符如何转成字节码(注意:不是encoding)如:\'89','50','4e','47','0d','0a','1a','0a','00
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这