本文內容針對霸爺的博客《 產生crashdump的三種方法 》進行實驗驗證和總結。
-=-=-=-=- 我是<我是歌手 >的分隔線 -=-=-=-=-
(如下爲原文引用)
crashdump 對於 erlang 的系統來說如同 core 對於 c/c++ 程序同樣寶貴,對於系統問題的修復提供了最詳細的資料。固然 erlang 很貼心了提供了網頁版的 crashdump_view 幫助用戶解讀數據,使用方法以下:c++
crashdump_viewer:start().
由於 crashdump 文本文件裏面記錄了大量系統相關的信息,這些信息對於分析系統的性能,狀態,排除問題提供了不可替代的功能。因此很須要在系統正常運做的時候,獲得 crashdump 文件。
除了坐等系統在發生問題時,自動產生 crashdump 之外,另外還有三種方法來手動產生 crashdump 。 方法以下:shell
-=-=-=-=- 我是<我是歌手 >的分隔線 -=-=-=-=-
(如下爲實際驗證)
【實驗一】
某業務進程運行中cookie
[root@Betty upu]# ps aux|grep upu root 2185 0.0 0.0 12908 796 ? S 13:03 0:00 /opt/mcu/upu/erts-6.0/bin/run_erl -daemon /tmp//opt/mcu/upu/ /opt/mcu/upu/log exec /opt/mcu/upu/bin/upu console '' root 2186 12.3 1.1 507936 43688 pts/0 Ssl+ 13:03 0:00 /opt/mcu/upu/erts-6.0/bin/beam.smp -K true -- -root /opt/mcu/upu -progname upu -- -home /root -- -boot /opt/mcu/upu/releases/1/upu -mode embedded -config /opt/mcu/upu/etc/upu.config -mnesia dir '/opt/mcu/upu/data' -sname upu@Betty -setcookie upu -- console root 2237 0.0 0.0 103252 848 pts/6 S+ 13:03 0:00 grep upu root 2525 0.0 0.0 10956 396 ? S Feb01 0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon [root@Betty upu]#
經過 remsh 登陸,再經過 Ctrl+c,a 退出async
[root@Betty upu]# ./bin/upu remote_console Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] Eshell V6.0 (abort with ^G) (upu@Betty)1> (upu@Betty)1> (upu@Betty)1> BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded (v)ersion (k)ill (D)b-tables (d)istribution a [root@Betty upu]#
能夠看到,上述操做對業務進程無影響(不產生影響的緣由見後文)。性能
[root@Betty upu]# [root@Betty upu]# ps aux|grep upu root 2185 0.0 0.0 12908 796 ? S 13:03 0:00 /opt/mcu/upu/erts-6.0/bin/run_erl -daemon /tmp//opt/mcu/upu/ /opt/mcu/upu/log exec /opt/mcu/upu/bin/upu console '' root 2186 3.1 1.1 507348 43600 pts/0 Ssl+ 13:03 0:00 /opt/mcu/upu/erts-6.0/bin/beam.smp -K true -- -root /opt/mcu/upu -progname upu -- -home /root -- -boot /opt/mcu/upu/releases/1/upu -mode embedded -config /opt/mcu/upu/etc/upu.config -mnesia dir '/opt/mcu/upu/data' -sname upu@Betty -setcookie upu -- console root 2328 0.0 0.0 103252 848 pts/6 S+ 13:03 0:00 grep upu root 2525 0.0 0.0 10956 404 ? S Feb01 0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon [root@Betty upu]# [root@Betty upu]#
再次經過 remsh 登陸,並執行 Ctrl+c,Aspa
[root@Betty upu]# ./bin/upu remote_console Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] Eshell V6.0 (abort with ^G) (upu@Betty)1> BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded (v)ersion (k)ill (D)b-tables (d)istribution A Crash dump was written to: erl_crash.dump Crash dump requested by user已放棄 (core dumped) [root@Betty upu]#
能夠看到,上述操做對 upu 進程一樣無影響(不產生影響的緣由見後文),同時可以產生 erl_crash.dump 文件.net
[root@Betty upu]# [root@Betty upu]# ps aux|grep upu root 2185 0.0 0.0 12908 796 ? S 13:03 0:00 /opt/mcu/upu/erts-6.0/bin/run_erl -daemon /tmp//opt/mcu/upu/ /opt/mcu/upu/log exec /opt/mcu/upu/bin/upu console '' root 2186 0.6 1.1 507604 43864 pts/0 Ssl+ 13:03 0:00 /opt/mcu/upu/erts-6.0/bin/beam.smp -K true -- -root /opt/mcu/upu -progname upu -- -home /root -- -boot /opt/mcu/upu/releases/1/upu -mode embedded -config /opt/mcu/upu/etc/upu.config -mnesia dir '/opt/mcu/upu/data' -sname upu@Betty -setcookie upu -- console root 2463 0.0 0.0 103252 848 pts/6 S+ 13:05 0:00 grep upu root 2525 0.0 0.0 10956 408 ? S Feb01 0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon [root@Betty upu]# [root@Betty upu]# ll 總用量 360 drwxr-xr-x 2 root root 4096 2月 26 14:27 bin drwxr-xr-x 2 root root 4096 3月 1 16:53 data -rw-r----- 1 root root 334226 3月 4 13:05 erl_crash.dump drwxr-xr-x 3 root root 4096 2月 26 14:27 erts-6.0 drwxr-xr-x 2 root root 4096 3月 1 16:52 etc drwxr-xr-x 12 root root 4096 2月 26 14:27 lib drwxr-xr-x 2 root root 4096 3月 4 13:03 log drwxr-xr-x 3 root root 4096 2月 26 14:27 releases drwxr-xr-x 2 root root 4096 2月 26 14:28 system [root@Betty upu]#
此時就能夠基於該 erl_crash.dump 文件對 upu 進程的運行時狀態進行分析了(此結論已被我本身證明存在問題)。
【實驗二】
某業務進程運行中code
[root@Betty upu]# [root@Betty upu]# ps aux|grep upu root 2185 0.0 0.0 12908 796 ? S 13:03 0:00 /opt/mcu/upu/erts-6.0/bin/run_erl -daemon /tmp//opt/mcu/upu/ /opt/mcu/upu/log exec /opt/mcu/upu/bin/upu console '' root 2186 0.1 1.5 507936 58048 pts/0 Ssl+ 13:03 0:01 /opt/mcu/upu/erts-6.0/bin/beam.smp -K true -- -root /opt/mcu/upu -progname upu -- -home /root -- -boot /opt/mcu/upu/releases/1/upu -mode embedded -config /opt/mcu/upu/etc/upu.config -mnesia dir '/opt/mcu/upu/data' -sname upu@Betty -setcookie upu -- console root 2525 0.0 0.0 10956 412 ? S Feb01 0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon root 2928 0.0 0.0 103252 844 pts/6 S+ 13:21 0:00 grep upu [root@Betty upu]# [root@Betty upu]# ll 總用量 36 drwxr-xr-x 2 root root 4096 2月 26 14:27 bin drwxr-xr-x 2 root root 4096 3月 1 16:53 data drwxr-xr-x 3 root root 4096 2月 26 14:27 erts-6.0 drwxr-xr-x 2 root root 4096 3月 1 16:52 etc drwxr-xr-x 12 root root 4096 2月 26 14:27 lib drwxr-xr-x 2 root root 4096 3月 4 13:03 log drwxr-xr-x 3 root root 4096 2月 26 14:27 releases drwxr-xr-x 2 root root 4096 2月 26 14:28 system [root@Betty upu]#
經過 remsh 登陸,並執行 erlang:halt("abort").blog
[root@Betty upu]# [root@Betty upu]# ./bin/upu remote_console Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] Eshell V6.0 (abort with ^G) (upu@Betty)1> (upu@Betty)1> erlang:halt("abort"). *** ERROR: Shell process terminated! (^G to start new job) *** BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded (v)ersion (k)ill (D)b-tables (d)istribution ^C[root@Betty upu]# [root@Betty upu]#
退出後發現生成了 erl_crash.dump ,此文件大小比經過 Ctrl+c,A 生成的大(大的緣由見後文)。進程
[root@Betty upu]# ll 總用量 1404 drwxr-xr-x 2 root root 4096 2月 26 14:27 bin drwxr-xr-x 2 root root 4096 3月 1 16:53 data -rw-r----- 1 root root 1400355 3月 4 13:21 erl_crash.dump drwxr-xr-x 3 root root 4096 2月 26 14:27 erts-6.0 drwxr-xr-x 2 root root 4096 3月 1 16:52 etc drwxr-xr-x 12 root root 4096 2月 26 14:27 lib drwxr-xr-x 2 root root 4096 3月 4 13:03 log drwxr-xr-x 3 root root 4096 2月 26 14:27 releases drwxr-xr-x 2 root root 4096 2月 26 14:28 system [root@Betty upu]#
能夠看到,此時業務進程已經終止。
[root@Betty upu]# ps aux|grep upu root 2525 0.0 0.0 10956 416 ? S Feb01 0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon root 3053 0.0 0.0 103252 848 pts/6 S+ 13:24 0:00 grep upu [root@Betty upu]#
【實驗三】
某業務進程運行中
[root@Betty upu]# ./bin/upu start [root@Betty upu]# [root@Betty upu]# ps aux|grep upu root 2525 0.0 0.0 10956 424 ? S Feb01 0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon root 3365 0.0 0.0 12908 792 ? S 13:27 0:00 /opt/mcu/upu/erts-6.0/bin/run_erl -daemon /tmp//opt/mcu/upu/ /opt/mcu/upu/log exec /opt/mcu/upu/bin/upu console '' root 3366 27.3 1.0 511852 38788 pts/0 Ssl+ 13:27 0:00 /opt/mcu/upu/erts-6.0/bin/beam.smp -K true -- -root /opt/mcu/upu -progname upu -- -home /root -- -boot /opt/mcu/upu/releases/1/upu -mode embedded -config /opt/mcu/upu/etc/upu.config -mnesia dir '/opt/mcu/upu/data' -sname upu@Betty -setcookie upu -- console root 3415 0.0 0.0 103252 848 pts/6 S+ 13:27 0:00 grep upu [root@Betty upu]#
執行 kill 命令發送信號 SIGUSR1 到業務進程
[root@Betty upu]# [root@Betty upu]# kill -s SIGUSR1 3366 [root@Betty upu]# [root@Betty upu]# ps aux|grep upu root 2525 0.0 0.0 10956 424 ? S Feb01 0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon root 3429 0.0 0.0 103252 848 pts/6 S+ 13:28 0:00 grep upu [root@Betty upu]# [root@Betty upu]# ll 總用量 1400 drwxr-xr-x 2 root root 4096 2月 26 14:27 bin drwxr-xr-x 2 root root 4096 3月 1 16:53 data -rw-r----- 1 root root 1395568 3月 4 13:28 erl_crash.dump drwxr-xr-x 3 root root 4096 2月 26 14:27 erts-6.0 drwxr-xr-x 2 root root 4096 3月 1 16:52 etc drwxr-xr-x 12 root root 4096 2月 26 14:27 lib drwxr-xr-x 2 root root 4096 3月 4 13:03 log drwxr-xr-x 3 root root 4096 2月 26 14:27 releases drwxr-xr-x 2 root root 4096 2月 26 14:28 system
能夠看到,這種方式也可以產生 erl_crash.dump 文件,但業務進程會終止運行。
【實驗四】
某業務進程運行中
[root@Betty upu]# ./bin/upu start [root@Betty upu]# [root@Betty upu]# [root@Betty upu]# ps aux|grep upu root 2525 0.0 0.0 10956 428 ? S Feb01 0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon root 3645 0.0 0.0 12908 792 ? S 13:31 0:00 /opt/mcu/upu/erts-6.0/bin/run_erl -daemon /tmp//opt/mcu/upu/ /opt/mcu/upu/log exec /opt/mcu/upu/bin/upu console '' root 3646 43.5 1.1 512108 42036 pts/0 Ssl+ 13:31 0:00 /opt/mcu/upu/erts-6.0/bin/beam.smp -K true -- -root /opt/mcu/upu -progname upu -- -home /root -- -boot /opt/mcu/upu/releases/1/upu -mode embedded -config /opt/mcu/upu/etc/upu.config -mnesia dir '/opt/mcu/upu/data' -sname upu@Betty -setcookie upu -- console root 3693 0.0 0.0 103252 848 pts/6 S+ 13:31 0:00 grep upu [root@Betty upu]# [root@Betty upu]# ll 總用量 36 drwxr-xr-x 2 root root 4096 2月 26 14:27 bin drwxr-xr-x 2 root root 4096 3月 1 16:53 data drwxr-xr-x 3 root root 4096 2月 26 14:27 erts-6.0 drwxr-xr-x 2 root root 4096 3月 1 16:52 etc drwxr-xr-x 12 root root 4096 2月 26 14:27 lib drwxr-xr-x 2 root root 4096 3月 4 13:03 log drwxr-xr-x 3 root root 4096 2月 26 14:27 releases drwxr-xr-x 2 root root 4096 2月 26 14:28 system [root@Betty upu]#
執行 kill 命令發送信號 SIGUSR2 到業務進程
[root@Betty upu]# [root@Betty upu]# kill -s SIGUSR2 3646 [root@Betty upu]# ll 總用量 36 drwxr-xr-x 2 root root 4096 2月 26 14:27 bin drwxr-xr-x 2 root root 4096 3月 1 16:53 data drwxr-xr-x 3 root root 4096 2月 26 14:27 erts-6.0 drwxr-xr-x 2 root root 4096 3月 1 16:52 etc drwxr-xr-x 12 root root 4096 2月 26 14:27 lib drwxr-xr-x 2 root root 4096 3月 4 13:03 log drwxr-xr-x 3 root root 4096 2月 26 14:27 releases drwxr-xr-x 2 root root 4096 2月 26 14:28 system [root@Betty upu]# ps aux|grep upu root 2525 0.0 0.0 10956 428 ? S Feb01 0:12 /opt/mcu/upucore/erts-6.0/bin/epmd -daemon root 3706 0.0 0.0 103252 844 pts/6 S+ 13:31 0:00 grep upu [root@Betty upu]#
能夠看到,這種方式不會產生 erl_crash.dump 文件,但 upu 進程會終止運行。
結論: 只有經過 Ctrl+c,A 生成 erl_crash.dump 文件才無破壞性;
相關文章:《 【原創】Erlang 之 erl_crash.dump 文件分析 》
==============
重要的補充說明:
結論: