跳到主要内容

管理核心文件

由Solace PubSub+软件事件代理生成的核心文件是Solace客户支持用于诊断和调试问题的重要工具。核心文件是Linux内核在进程被信号终止时捕获的进程状态记录。

核心文件可能非常大,从几个吉字节到容器的最小cgroup限制的大小。在确定为事件代理提供存储资源时,您必须特别注意和考虑。

容器镜像的核心文件管理

由于容器镜像不包括Linux内核,您必须手动配置您的运行时环境以管理可能生成的任何核心文件。为确保核心文件得到正确管理,您必须为它们分配足够的存储,并决定它们的命名方式和存储位置。

您可以通过以下方式管理核心文件的属性:

  • 设置核心文件大小的资源限制
  • 配置核心文件模式

设置核心文件大小的资源限制

核心文件大小的资源限制(rlimit)必须设置得足够高,以允许内核捕获完整的进程状态。Linux rlimit适用于shell进程及其所有子进程,因此其值必须在创建容器时设置。在一些容器环境(如Docker Desktop for Windows和Mac)中,默认的核心文件大小rlimit为0。在这种配置下,不会创建任何核心文件。

对于大多数容器运行时,您可以在创建容器时使用ulimit参数设置rlimit。只要磁盘空间允许,我们建议事件代理的核心文件大小rlimit为“无限制”。例如,在Docker Engine和Podman中,在创建容器时添加--ulimit core=-1命令行参数。

配置核心文件模式

某些Linux内核调优参数决定了在存储设备上如何创建核心文件。特别是,kernel.core_pattern参数通常包含以下三个值之一:

  • 一个文件名,例如core
  • 一个绝对路径,例如/tmp/cores
  • 以管道符号(|)开头的模式

当核心文件模式是一个文件名

kernel.core_pattern的值为一个文件名时,它被解释为核心转储进程在其工作目录中创建核心文件的模式。对于容器来说,这个工作目录存在于容器进程的挂载命名空间中。

最常见的核心文件模式是core,通常kernel.core_uses_pid设置为'1'。在这种情况下,核心文件生成在事件代理的工作目录(/usr/sw)中,该目录存在于容器的临时(可写)层,并消耗容器运行时后端存储的磁盘空间。无法将工作目录绑定挂载为一个卷。

由于core是许多版本的RHEL和Ubuntu的核心文件模式,默认情况下,事件代理管理这些核心文件,并在核心文件不再相关时自动释放磁盘空间。代理自动删除超过14天的旧核心文件,以及被Solace支持工具如gather-diagnostics捕获的核心文件。

当核心文件模式是一个绝对路径

kernel.core_pattern是一个绝对路径时,该值被解释为核心转储进程在其挂载命名空间中创建核心文件的模式。如果未在主机上绑定定义的路径,核心文件将写入容器的临时(可写)层,消耗容器运行时后端存储(通常为容器镜像预留)的磁盘空间。

当指定绝对路径时,事件代理无法管理核心文件——它尝试使用Solace支持工具以最佳努力的方式捕获它们。核心文件很大,容易超出分配给运行时后端存储的磁盘空间。如果没有管理,可能会导致后端存储损坏,导致在多租户主机上运行的容器崩溃并无法重新启动。因此,我们不推荐这种核心文件模式。

当核心文件模式以管道符号开头

从内核版本2.6.19开始,Linux支持kernel.core_pattern的另一种语法,其中第一个字符是管道符号(|)。当使用这种替代语法时,内核将模式的其余部分视为要运行的命令,该命令在初始命名空间中被调用(即不在容器的进程或挂载命名空间内)。核心转储被写入该程序的标准输入,而不是文件。当使用核心文件管理器,如apportsystemd-coredump时,这种模式很常见。

当使用核心文件管理器时,事件代理无法管理核心文件或使用Solace支持工具捕获它们。因此,我们不推荐这种核心文件模式。