我有一个新启动的工作,它偶尔会因为分段错误而崩溃,我对核心转储有一些疑问。
首先,我应该添加一节:
limit core unlimited unlimited
允许无限制的核心大小是否有弊端?有限的限制会更好吗?
第二,核心文件将存放在哪里?如果默认位置不是标准或合乎逻辑的位置,我该如何让它显示在其他地方?
答案1
在大多数情况下,不建议无限地进行核心转储,但从技术上讲这是可以的。核心转储只包含当前进程的“所有内存”。因此,它最多只能包含 RAM + 交换空间。希望您有比这更多的可用空间。
在现实生活中,与总内存 + 交换空间相比,它们应该“较小”。
文件“应该”最终位于“当前目录”中。对于不更改目录的 upstart 任务,该目录通常是 /。如果它们确实更改了目录,那么您需要自行查找它们。但是,您可以为它们硬编码路径。
您应该能够检查/proc/sys/kernel/core_pattern
“模式”。如果您将模式设置为类似以下内容echo "/var/log/core" > /proc/sys/kernel/core_pattern
,那么您的所有核心最终都会出现在 /var/log 中
答案2
核心文件是进程意外终止时操作系统创建的进程映像。当程序因错误或违反 CPU 或内存保护机制而出现错误时,就会创建核心文件。操作系统会终止程序并创建核心文件。
此文件对于确定进程出错的位置非常有用。默认情况下,可以启用核心文件的生成,具体取决于您拥有的 Linux 的发行版和版本。
如果您根本不需要核心文件,请在启动文件中设置“ulimit -c 0”。这是许多系统的默认设置;/etc/profile
您可能会发现
由于截断的文件没有实际用途,因此将 Linux 核心文件的大小设置为“无限制”。
Usage of ulimit Action
ulimit -c # check the current corefile limit
ulimit -c 0 # turn off corefiles
ulimit -c x # set the maximum corefile size to x number of 1024bytes
ulimit -c unlimited # turn on corefiles with unlimited size
ulimit -n unlimited # allows an unlimited number of open file descriptors
ulimit -p # size of pipes
ulimit -s # maximum native stack size for a process
ulimit -u # number of user processes
help ulimit #list of other options
核心文件被放置到进程的当前工作目录中,但须遵守 JVM 进程的写权限和可用磁盘空间。
根据内核级别,可以使用一个有用的内核选项来为核心文件提供更有意义的名称。作为 root 用户,选项 sysctl -w kernel.core_users_pid=1 可确保核心文件的名称格式为“Core.PID”。
ulimit -S -c 0 > /dev/null 2>&1
如果您确实想要核心文件,则需要在自己的 .bash_profile 中重置它:
ulimit -c 50000
将允许核心文件但将其限制为 50,000 字节。
您可以更好地控制核心文件/proc/sys/kernel/
例如,您可以通过以下方式消除 pid 上的标记
echo "0" > /proc/sys/kernel/core_uses_pid
核心文件将只命名为“core”。人们这样做是为了让用户可以选择将名为“core”的不可写文件放在他们不想生成核心转储的目录中。这可能是一个目录(mkdir core)或一个文件(touch core;chmod 000 core)。
但也许更有趣的是你可以这样做:
mkdir /tmp/corefiles
chmod 777 /tmp/corefiles
echo "/tmp/corefiles/core" > /proc/sys/kernel/core_pattern
然后所有核心文件都会被抛出/tmp/corefiles
(如果这样做,请不要更改 core_uses_pid)。
使用一个简单的脚本来测试一下:
# script that dumps core
kill -s SIGSEGV $$
在 Ubuntu 下,核心文件的创建通过文件控制/etc/default/collectd
。您可以通过设置来启用核心转储的创建:
ENABLE_COREFILES=1
找到核心文件
一旦守护进程崩溃,将在其当前工作目录中创建一个文件。默认情况下,该文件为pkglocalstatedir
,即prefix/var/lib/collectd
。如果您安装了软件包,则此目录很可能为/var/lib/collectd
。
资料来源:AP Lawrence 和 IBM