MongoDB管理: 如何让mongod产生core文件?

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 3.0+版本的mongod捕获了SIGSEGV信号,打印当前的执行堆栈,然后退出。 // src/mongo/util/signal_handlers_synchronous.cpp struct sigaction addrSignals; memset(&addrSignals, 0, s

3.0+版本的mongod捕获了SIGSEGV信号,打印当前的执行堆栈,然后退出。


// src/mongo/util/signal_handlers_synchronous.cpp
struct sigaction addrSignals;
memset(&addrSignals, 0, sizeof(addrSignals));
addrSignals.sa_sigaction = abruptQuitWithAddrSignal;
sigemptyset(&addrSignals.sa_mask);
addrSignals.sa_flags = SA_SIGINFO;

invariant(sigaction(SIGSEGV, &addrSignals, nullptr) == 0);
invariant(sigaction(SIGBUS, &addrSignals, nullptr) == 0);
invariant(sigaction(SIGILL, &addrSignals, nullptr) == 0);
invariant(sigaction(SIGFPE, &addrSignals, nullptr) == 0);

当mongod因为段错误退出时,查问题信息太少,非常不方便,故尝试让mongod在段错误时coredump,将给SIGSEGV设置处理函数的代码去掉。

+ //invariant(sigaction(SIGSEGV, &addrSignals, nullptr) == 0);

在进程启动后,增加如下代码,以产生SIGSEGV信号

 char *p = 0;
 *p = 100;
 

然而,进程启动后,进程的确异常退出了,但并没有产生core文件

[7330651.261707] mongod-9552[34304]: segfault at 0 ip 0000000000b24f27 sp 00007f2e6e718ae0 error 6 in mongod-9552[400000+1b52000]

查看core文件相关配置,都正常

  ulimit -c
  unlimited

  $cat /proc/sys/kernel/core_pattern
  core

mongod是后台启动的(processManagement.fork参数设置为true),而且代码里也没有再setrlimit来修改core file size。

将processManagement.fork参数设置为false后启动mongod,mongod能产生出core文件。可以确定processManagement.fork设置为true时不产生core文件的原因。


细看fork相关代码,发现fork()后,mongod调用chdir("/")将进程工作目录修改为了根目录,而根据 /proc/sys/kernel/core_pattern的配置,core文件要存储到工作目录,而mongod以普通用户启动,并没有根目录的写权限,故而没有产生core文件。

echo /tmp/corefiles/core > /proc/sys/kernel/core_pattern

修改core存储路径后,mongod能正常产生core文件。很多daemon模式启动的进程都会将工作目录改到根目录,故如果需要产生core文件,建议要正确设置好/proc/sys/kernel/core_pattern。


故要想mongod能在SIGSEGV信号时产生core文件,需要

  1. 让SIGSEGV的处理函数保持不变
  2. ulimit -c 设置好core文件大小限制
  3. 设置好/proc/sys/kernel/core_pattern,保证进程有权限存储core文件
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
8月前
|
开发框架 NoSQL .NET
.NET Core MongoDB的简单使用
.NET Core MongoDB的简单使用
71 0
|
1月前
|
JSON NoSQL MongoDB
Rockmongo详解:高效管理MongoDB的图形化利器
Rockmongo详解:高效管理MongoDB的图形化利器
|
2月前
|
存储 NoSQL MongoDB
MongoDB数据库转换为表格文件的Python实现
MongoDB数据库转换为表格文件的Python实现
178 0
|
2月前
|
存储 监控 NoSQL
【MongoDB 专栏】MongoDB 分片策略与最佳实践
【5月更文挑战第10天】MongoDB 分片是应对大数据量的扩展策略,涉及哈希和范围分片两种策略。分片架构包含分片服务器、配置服务器和路由服务器。最佳实践包括选择合适分片键、监控调整、避免热点数据等。注意数据分布不均和跨分片查询的挑战。通过实例展示了如何在电商场景中应用分片。文章旨在帮助理解并优化 MongoDB 分片使用。
【MongoDB 专栏】MongoDB 分片策略与最佳实践
|
2月前
|
存储 NoSQL MongoDB
【MongoDB 专栏】MongoDB 的 GridFS:存储与检索大文件
【5月更文挑战第10天】MongoDB's GridFS 是用于大规模数据和大文件存储的解决方案,它将文件分割成小块存储在不同文档中,以提升管理效率和避免性能问题。文件上传时记录元数据,通过唯一标识符实现快速检索。GridFS 提供高效存储、便捷检索和扩展性,适用于大文件管理。然而,应注意文件大小限制、数据一致性和性能优化。通过案例分析,展示了 GridFS 在实际应用中的优势和适用场景,为构建强大应用提供支持。
【MongoDB 专栏】MongoDB 的 GridFS:存储与检索大文件
|
NoSQL MongoDB 数据安全/隐私保护
Docker 安装MongoDB 以及 相关配置文件、数据文件映射
本文是博主使用docker安装mongodb的方法记录,希望对大家有所帮助。
1891 0
|
1月前
|
存储 JSON NoSQL
MongoDB 插入文档:轻松管理数据录入与批量导入
MongoDB 插入文档:轻松管理数据录入与批量导入
|
2月前
|
NoSQL MongoDB 数据库
MongoDB数据恢复—MongoDB数据库文件被破坏的数据恢复案例
服务器数据恢复环境: 一台Windows Server操作系统服务器,服务器上部署MongoDB数据库。 MongoDB数据库故障&检测: 工作人员在未关闭MongoDB数据库服务的情况下,将数据库文件拷贝到其他分区。拷贝完成后将原MongoDB数据库所在分区进行了格式化操作,然后将数据库文件拷回原分区,重新启动MongoDB服务,服务无法启动。
|
2月前
|
存储 NoSQL 大数据
MongoDB 在内容管理场景的应用
MongoDB 在内容管理场景的应用
170 0
|
8月前
|
存储 NoSQL Shell
如何将阿里云WiredTiger引擎的MongoDB物理备份文件恢复至自建数据库
数据库操作一直是一个比较敏感的话题,动不动“删库跑路”,可见数据库操作对于一个项目而言是非常重要的,我们有时候会因为一个游戏的严重bug或者运营故障要回档数据库,而你们刚好使用的是阿里云的Mongodb,那么这篇文章将给你提供一个思路(或许你按照阿里云官网的文档一顿操作下来,并不是那么顺利,有一些报错,无法登录...)

相关产品

  • 云数据库 MongoDB 版