core dump 路徑定義以及監(jiān)控
Core Dump 是什么?
Core Dump 是指進(jìn)程異常退出時(shí),操作系統(tǒng)將進(jìn)程的內(nèi)存狀態(tài)保存到文件中,這個(gè)文件就是 Core Dump 文件,中文一般翻譯為“核心轉(zhuǎn)儲(chǔ)”,哈,看起來(lái)還不如不翻譯。
我們可以認(rèn)為 Core Dump 是“內(nèi)存快照”,但實(shí)際上,除了內(nèi)存信息之外,還有些關(guān)鍵的程序運(yùn)行狀態(tài)也會(huì)同時(shí) dump 下來(lái),例如寄存器信息(包括程序指針、棧指針等)、內(nèi)存管理信息、其他處理器和操作系統(tǒng)狀態(tài)和信息。
Core Dump 有什么用?
一個(gè)是用于排查問(wèn)題,例如程序 crash 了,我們可以通過(guò) gdb 等工具來(lái)分析 core dump 文件,找到問(wèn)題的原因。另一個(gè)是監(jiān)控,我們可以通過(guò)監(jiān)控手段及時(shí)發(fā)現(xiàn)程序 crash 了,及時(shí)處理。
程序自身產(chǎn)生的 Core Dump 文件一般可以用來(lái)分析程序運(yùn)行到哪里出錯(cuò)了。
Linux 平臺(tái)常用的 coredump 文件分析工具是 gdb;Solaris 平臺(tái)用 pstack 和 pflags;Windows 平臺(tái)用 userdump 和 windbg。
測(cè)試生成 Core Dump 文件
這將會(huì)在你當(dāng)前的 shell 下觸發(fā)一個(gè)段錯(cuò)誤,進(jìn)而生成一個(gè) core dump 文件,文件名為 core 或 core.pid,pid 是當(dāng)前 shell 的進(jìn)程號(hào)。
注意,ulimit -c unlimited
?是告訴操作系統(tǒng),不要限制 core dump 文件的大小,如果你執(zhí)行?ulimit -c
?看到輸出 0,就表示 core dump 文件大小限制為 0 了,也就不會(huì)生成。比如我的機(jī)器環(huán)境:
注意 core file size 那一行,我的環(huán)境是 0,就表示限制了 core dump 文件的生成。
Core Dump 文件路徑定義
在 Linux 下,core dump 文件的路徑是由?/proc/sys/kernel/core_pattern
?定義的,如果這個(gè)文件不存在,或者內(nèi)容為空,那么 core dump 文件就會(huì)生成在當(dāng)前目錄下。
上面的輸出表示,core dump 文件會(huì)生成在當(dāng)前目錄下,文件名為 core。
我們可以通過(guò)修改?/proc/sys/kernel/core_pattern
?來(lái)定義 core dump 文件的路徑和文件名,例如:
然后,我們重新生成 core dump 文件:
此時(shí),我們會(huì)生成一個(gè)類似這樣的文件:/tmp/cores/core.bash.8539.VM-0-33-debian.1236975953。其中,bash 是進(jìn)程名,8539 是進(jìn)程號(hào),VM-0-33-debian 是主機(jī)名,1236975953 是時(shí)間戳。文件存儲(chǔ)在 /tmp/cores 目錄下。
對(duì)于 core_pattern 的定義,可以使用如下的占位符:
其中,%h
?hostname 最好加上,假如我們把 core dump 文件存放在 NFS 上,就可以用?%h
?來(lái)區(qū)分 core dump 文件來(lái)自哪個(gè)機(jī)器了。
echo "/tmp/cores/core.%e.%p.%h.%t" > /proc/sys/kernel/core_pattern
?這種設(shè)置方式,是臨時(shí)生效,如果機(jī)器重啟,就會(huì)失效。如果想要永久生效,可以修改?/etc/sysctl.conf
?文件,添加一行:
然后執(zhí)行?sysctl -p
?命令,使配置生效。
Core Dump 文件監(jiān)控
一般來(lái)講,對(duì)于規(guī)范化做的好的公司,core_pattern 是系統(tǒng)部交付機(jī)器的時(shí)候,統(tǒng)一設(shè)置好的,公司所有的機(jī)器的 core_pattern 都是一致的,會(huì)設(shè)置成一個(gè)統(tǒng)一的目錄,例如 /opt/cores,這樣就可以方便地對(duì) core dump 新文件進(jìn)行監(jiān)控了。
這里,推薦大家使用 catpaw(基本介紹參考這里:太卷了,史上最簡(jiǎn)單的監(jiān)控系統(tǒng) catpaw 簡(jiǎn)介),catpaw 從 v0.3.0 版本開始,引入了 mtime 監(jiān)控插件,可以監(jiān)控近期的文件變更,進(jìn)而監(jiān)控新的 core dump 文件的產(chǎn)生。
mtime 插件的配置如下:
上面的意思表示,每 30s 探測(cè)一次,每次探測(cè)最近 3 分鐘內(nèi)是否有文件變更或新文件產(chǎn)生。比如我隨便對(duì)某個(gè)目錄做了測(cè)試,最終輸出的內(nèi)容長(zhǎng)這個(gè)樣子:

總結(jié)
希望本文介紹的內(nèi)容對(duì)你有幫助,愿不吝點(diǎn)贊、在看。如果有其他這類事件監(jiān)控的場(chǎng)景需求,也可以聯(lián)系我,后面都會(huì)一并做到 catpaw 里。
雖然 FlashDuty 有免費(fèi)套餐,如果就是不想用,也可以模仿 FlashDuty 的事件接收接口自己搞個(gè) HTTP Server,接收 catpaw 的事件推送,然后自己處理,比如發(fā)送到釘釘、飛書、郵件等。
enjoy…make a better world :)