Linux 系统为何产生大量的 core 文件?

news2024/11/16 23:45:50

image1-57

Author:rab


目录

    • 一、问题分析
    • 二、解决方案
    • 扩展


一、问题分析

上一篇刚讲到《Docker 配置基础优化》,这里再补充一下。就在中秋+国庆这段小长假里,接收到了线上服务器磁盘告警通知,线上服务器架构是一个 Docker Swarm 集群,该集群上运行了多个服务。于是就登录服务上去看个究竟,结果发现 Docker 业务日志数据量都是正常的,因此第一个想到的就是 Docker 的存储驱动目录 /<yourpath>/overlay2 占用大小,进去看结果发现有一个文件(目录)数据大小异常(这里忘记截图了 - 大概 140 多 G),然后就根据这个目录名称找到归属的具体容器,看看是哪个容器产生的数据。以下是查看命令:

docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' | grep "fe9eecfd2fc5f5c2289bd19194900c0c707d67e05e54ea55721c4d3c3ba8cc03"

image-20231006154139301

确定目标容器后,就进入容器去看一下,结果在运行程序(xxx.jar)主目录(即同级目录)下发现有大量的 core 文件,且每个文件的大小均为 105M,粗略统计了一下大概占用了 143G 左右的大小。

cip

那这些 Core 文件是什么文件?又是怎么产生的呢?

首先我们要知道 core file 是什么文件?在Linux系统中,“core file”(核心文件)是指在程序异常崩溃(如段错误、非法指令等)时生成的文件,它包含了程序在崩溃瞬间的内存状态信息,帮助开发人员进行调试和分析问题,我们一般使用调试器工具(如GDB)来分析核心文件,以便定位和解决问题。

核心文件的名称通常是 “core”,并且会与崩溃的进程相关联,因此它可能具有类似于 “core.<进程ID>” 的名称,其中 “<进程ID>” 是崩溃的进程的实际ID。核心文件通常会生成在程序崩溃的当前工作目录中,但也可以通过调整系统的核心转储设置来指定其他位置。

核心文件包含了程序的内存映像,包括堆栈、寄存器的状态以及其他与程序状态相关的信息。这些文件通常很大,因此在默认情况下,许多 Linux 系统都会禁用核心文件的生成,以节省磁盘空间。要启用核心文件生成,可以使用 ulimit 命令或 /proc/sys/kernel/core_pattern 文件进行配置。

默认情况下:Host 宿主机是限制生成 core 文件的(即禁用的),但是容器中却是无限制的(因其独立的 namespace),因此当容器中程序异常时就会生成 core 文件,而且是无限制的,这样一来就会耗尽我们 Host 宿主机的磁盘空间。

image-20231006152336223

接着查看该容器的资源利用情况:

image-20231007115436186

image-20231007115536670

可见容器的 CPU 波动非常大(非常不稳定),因为持续时间很短,所以并没有达到监控告警的条件,但是我没可以通过 core 文件来分析导致 CPU 浮动的原因。

二、解决方案

如果需要分析这些 Core 文件,可先下载到本地其他服务器进行分析,从运维角度来说,可进入容器直接删除这些 Core 文件即可。但为了避免后续的问题,应将这些 core 文件交给开发人员进行程序异常分析,并做后续优化。

1、进入容器内部

docker exec -it <容器名> bash

2、删除 core 文件

rm -rf core.*

切记!!!不要在/<yourpath>/overlay2目录下进行任何增删操作,否则可能会导致容器内部程序异常。

其实这只是临时解决的,如果要解决根源问题,需要开发人员优化代码(解决 CPU 波动问题)或把容器中“core dump(核心转存)”关闭,关闭步骤如下:只需在 Docker 服务的启动命令添加--default-ulimit core=0:0选项即可。

vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit core=0:0
systemctl daemon-reload
systemctl restart docker.service

运行一个测试容器再次验证,此时的容器已经限制了 core file 了。

docker run -it --rm centos:centos7.9.2009

image-20231007122511428

如果此时你想要启用 core dump,去掉 --default-ulimit core=0:0 选项即可。

扩展

1、overlay2 目录下的那些长目录说明

overlay2 目录下的那些长目录实际上对应 Docker 中运行的容器或镜像的文件系统层。每个子目录都包含容器或镜像的文件系统内容。这些子目录的名称是由一种称为 SHA256 散列的哈希函数生成的,用于唯一标识每个文件系统层。

image-20231006153616395

每个子目录中包含容器或镜像的文件系统内容,以及元数据和其他相关信息。这些文件系统层会根据需要叠加在一起,以创建容器的整体文件系统视图。

2、如何配置 Linux 系统的 core file

  • 启用

    # 法1:ulimit命令 - 临时生效(重启失效)
    ulimit -c unlimited  # 无限制大小
    ulimit -c 100000     # 限制大小为100MB
    
    # 法2:/etc/security/limits.conf文件 - 永久生效
    cat /etc/security/limits.conf
    * hard core unlimited
    * soft core unlimited
    

    如何自定义 core 文件名及存储目录?

    # 法1:/proc文件
    # 自定义core文件名及存储位置
    echo "/tmp/core-%e.%p" > /proc/sys/kernel/core_pattern
    # 或
    sysctl -w kernel.core_pattern="/tmp/core-%e.%p"
    # 这两条任意命令会将核心文件保存在/tmp目录中,文件名格式为core-<进程名称>.<进程ID>
    
    # 法2:/etc/sysctl.conf文件
    cat /etc/sysctl.conf
    kernel.core_pattern = /tmp/core-%e.%p
    kernel.core_uses_pid = 1
    
  • 禁用

    # 法1:ulimit命令 - 临时禁用
    ulimit -c 0
    
    # 法2:/etc/security/limits.conf文件 - 永久禁用
    cat /etc/security/limits.conf
    * hard core 0
    * soft core 0
    

—END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1065719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flutter开发实战-video_player插件播放抖音直播实现(仅限Android端)

flutter开发实战-video_player插件播放抖音直播实现&#xff08;仅限Android端&#xff09; 在之前的开发过程中&#xff0c;遇到video_player播放视频&#xff0c;通过查看video_player插件描述&#xff0c;可以看到video_player在Android端使用exoplayer&#xff0c;在iOS端…

一个例子帮您掌握python正则re.match、re.search和re.findall的区别

在使用python正则进行字符串匹配查询时&#xff0c;最常用的三个函数是re.match、re.search和re.findall&#xff0c;在这里我就用一个例子带大家了解这三者的使用区别&#xff0c;话不多说我们直接上代码&#xff01; import re txt"test,a:123,b:1234,c:12345,hello!&…

二叉树--翻转二叉树

文章前言&#xff1a;如果有小白同学还是对于二叉树不太清楚&#xff0c;作者推荐&#xff1a;二叉树的初步认识_加瓦不加班的博客-CSDN博客 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 如果思路不清楚&#xff0c;请看动态页面&am…

二叉树--对称二叉树

小白同学对于二叉树还是不太了解的&#xff0c;作者推荐&#xff1a;二叉树的初步认识_加瓦不加班的博客-CSDN博客 对称二叉树-力扣 101 题 作者给的图&#xff1a; 代码&#xff1a; public boolean isSymmetric(TreeNode root) {//刚刚开始&#xff0c;传入的是顶堆的左、右…

短视频矩阵源码开发部署---技术解析

一、短视频SEO源码搜索技术需要考虑以下几点&#xff1a; 1. 关键词优化&#xff1a;通过研究目标受众的搜索习惯&#xff0c;选择合适的关键词&#xff0c;并在标题、描述、标签等元素中进行优化&#xff0c;提高视频的搜索排名。 2. 内容质量&#xff1a;优质、有吸引力的内…

通透理解FlashAttention与FlashAttention2:大模型更长上下文的关键

前言 本文最初和第一代ChatGLM-6B的内容汇总在一块&#xff0c;但为了阐述清楚FlashAttention、FlashAttention2等相关的原理&#xff0c;导致之前那篇文章越写越长&#xff0c;故特把FlashAttention相关的内容独立抽取出来成本文 且本文会和本博客内其他大模型相关的文章一样…

MXProxyPool: 动态爬虫IP池(抓取、存储、测试)

在网络爬虫开发中&#xff0c;使用爬虫IP可以帮助我们绕过访问限制&#xff0c;隐藏真实IP地址&#xff0c;提高爬取效率等。MXProxyPool是一个功能强大的动态爬虫IP池&#xff0c;它能够实现爬虫IP的抓取、存储和测试功能。本文将详细介绍MXProxyPool的使用方法&#xff0c;帮…

给 Linux0.11 添加网络通信功能 (Day1: 确认 qemu-system-i386 提供了虚拟网卡)

感觉单纯读闪客的文章&#xff0c;以及读 Linux0.11 源码&#xff0c;而不亲自动手做点什么&#xff0c;很难学会&#xff0c;还是得写代码 定个大目标&#xff1a;给 Linux0.11 添加网络通信功能 今日的小目标&#xff1a;先确认 qemu-system-i386 提供了网卡功能 here we …

深度学习-了解

1.机器学习的分类 监督学习&#xff08;Supervised Learning&#xff09;是指从已标注的训练数据中学习判断数据特征&#xff0c;并将其用于对未标注数据的判断的一种方法。无监督学习&#xff08;Unsupervised Learning&#xff09;不同于监督学习&#xff0c;它的学习算法是…

java 将字符串转为Base64格式与将Base64内容解析出来

首先要引入依赖包 import java.nio.charset.StandardCharsets; import java.util.Base64;然后对应一下两个代码 将字符串转为Base64 Base64.getEncoder().encodeToString(需要转换的字符串.getBytes(StandardCharsets.UTF_8));将 Base64 字符串解析成原来的内容 byte[] deco…

备份网络架构Host-Based/Lan-Based/Lan-Free/Server-Free

前言 常见的数据备份系统主要有 Host-Based LAN-Based 基于 SAN 结构的 LAN-Free LAN Server-Free 等多种结构。 Host-Based Host-Based 是传统的数据备份结构 该结构中磁带库直接接在服务器上 而且只为该服务器提供数据备份服务。一般情况 这种备份大多采用服务器上自带的磁…

基于生物地理学优化的BP神经网络(分类应用) - 附代码

基于生物地理学优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于生物地理学优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.生物地理学优化BP神经网络3.1 BP神经网络参数设置3.2 生物地理学算法应用 4…

时序预测 | MATLAB实现ICEEMDAN-IMPA-GRU时间序列预测

时序预测 | MATLAB实现ICEEMDAN-IMPA-GRU时间序列预测 目录 时序预测 | MATLAB实现ICEEMDAN-IMPA-GRU时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 ICEEMDAN-IMPA-GRU功率/风速预测 基于改进的自适应经验模态分解改进海洋捕食者算法门控循环单元时间序列预…

AIGC革新,将文字或者LOGO融入AI视频基于PIKA-labs(Python3.10)

很多平台都会禁止用户使用带有网址或者二维码的头像以及文章配图&#xff0c;这样可以有效的防止用户的一些“导流”行为。当然&#xff0c;头像、文章或者视频现在都是AI来审&#xff0c;毕竟现在人工的成本实在太高&#xff0c;但是如果我们把文字元素直接融入图像或者视频之…

在微信公众号上怎么搭建付费课程功能

搭建付费课程功能是线上教育平台的重要组成部分&#xff0c;需要考虑到技术、用户体验、支付安全等多个方面。以下是搭建付费课程功能的几个关键步骤&#xff1a; 一、确定技术方案 搭建付费课程功能需要选择合适的技术方案&#xff0c;包括前端和后端的开发、数据库管理、服务…

编程每日一练(多语言实现)基础篇:求100~200之间的素数

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现3.4 JavaScript 语言实现3.5 Go 语言实现 一、实例描述 求素数表中 100~200 之间的全部素数。运行结果如下图所示&#xff1a; 二、技术要点 素数是大于1的整数&#xff…

Verilog HDL阻塞赋值和非阻塞赋值笔记

1. module test( input wire clk, input wire b, output reg a, output reg c ); always(posedge clk) begin ab; ca; end endmodule 上面的代码在vivado中综合后的电路为&#xff1a; 2. module test( input wire clk, input wire b, outp…

Java编程技巧:Excel导入、导出(支持EasyExcel和EasyPoi)

目录 1、EasyExcel&#xff1a;普通导出2、EasyExcel&#xff1a;普通导入3、EasyExcel&#xff1a;复杂导出4、EasyPoi&#xff1a;普通导出5、EasyPoi&#xff1a;普通导入6、EasyPoi&#xff1a;复杂导出7、EasyPoi&#xff1a;复杂导入8、代码 1、EasyExcel&#xff1a;普通…

使用chat-GPT接口提取合同中关键信息

1 业务需求 目前公司有几千份合同&#xff0c;而且还会不断的增长&#xff1b;现在需要将合同中的关键信息提取出来给业务使用&#xff0c;业务现在需要将这些关键字段信息录入存档到档案系统&#xff1b;人工去阅读整个合同去提取这些信息&#xff0c;是很浪费人力的&#xff…

数据库基础知识

数据库 什么是数据库, 数据库管理系统, 数据库系统, 数据库管理员? 数据库 : 数据库(DataBase 简称 DB)就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合。数据库管理系统 : 数据库管理系统(Database Management System 简称 DBMS)是一种操纵和管理数据库的大…