為什么應(yīng)用運(yùn)行時(shí)進(jìn)程突然消失了?
這個(gè)問(wèn)題通常由操作系統(tǒng)物理內(nèi)存耗盡或應(yīng)用運(yùn)行的Java虛擬機(jī)進(jìn)程Crash導(dǎo)致,本文以Linux操作系統(tǒng)為例說(shuō)明如何解決。
操作系統(tǒng)物理內(nèi)存耗盡,觸發(fā)操作系統(tǒng)OOM Killer
當(dāng)操作系統(tǒng)物理內(nèi)存和交換空間不夠用時(shí),操作系統(tǒng)的OOM Killer機(jī)制(默認(rèn)打開(kāi))就會(huì)選擇性地殺死進(jìn)程,那么它是怎樣知道要先殺死哪個(gè)進(jìn)程呢?其實(shí)Linux的每個(gè)進(jìn)程都有一個(gè)oom_score(位于/proc/<pid>/oom_score),這個(gè)值越大,就越有可能被OOM Killer選中并殺死。
當(dāng)一個(gè)進(jìn)程被OOM Killer殺死以后會(huì)向操作系統(tǒng)日志寫(xiě)入殺死的進(jìn)程PID等信息,所以判斷進(jìn)程是否被OOM Killer,就可以通過(guò)搜索操作系統(tǒng)日志來(lái)得知。
ECS集群進(jìn)程被OOM Killer的日志:
[Wed Aug 31 16:36:42 2017] Out of memory: Kill process 43805 (keystone-all) score 249 or sacrifice child
[Wed Aug 31 16:36:42 2017] Killed process 43805 (keystone-all) total-vm:4446352kB, anon-rss:4053140kB, file-rss:68kB
[Wed Aug 31 16:56:25 2017] keystone-all invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[Wed Aug 31 16:56:25 2017] keystone-all cpuset=/ mems_allowed=0
[Wed Aug 31 16:56:25 2017] CPU: 2 PID: 88196 Comm: keystone-all Not tainted 3.10.0-327.13.1.el7.x86_64 #1
Swarm集群進(jìn)程被OOM Killer的日志:
Memory cgroup out of memory: Kill process 20911 (beam.smp) score 1001 or sacrifice child
Killed process 20977 (sh) total-vm:4404kB, anon-rss:0kB, file-rss:508kB
總結(jié)起來(lái)搜索命令為:
grep -i 'killed process' /var/log/messages
或者:
egrep "oom-killer|total-vm" /var/log/messages
遇到此問(wèn)題時(shí),解決辦法有以下幾個(gè):
- 增大ECS實(shí)例物理內(nèi)存或者減少被殺死的進(jìn)程分配的內(nèi)存值。
- 檢查ECS實(shí)例是否掛載了Swap交換分區(qū)( ECS實(shí)例默認(rèn)不掛載Swap交換分區(qū) ),如果未掛載(阿里云ECS環(huán)境大多數(shù)OOM Killer的問(wèn)題都因?yàn)槲磼燧dSwap交換分區(qū),相比性能,進(jìn)程健康性更加重要)請(qǐng)搜索Linux掛載Swap交換分區(qū)的方法并自行掛載Swap交換分區(qū)。
應(yīng)用運(yùn)行的Java虛擬機(jī)進(jìn)程Crash(異常退出)
Java虛擬機(jī)通常會(huì)由于異常的JNI調(diào)用、C Heap OOM、其他Bug等原因在運(yùn)行時(shí)進(jìn)程Crash,發(fā)生此問(wèn)題時(shí),會(huì)在當(dāng)前JVM進(jìn)程的工作目錄(通過(guò)pwdx <jvm_pid>命令可查)生成一個(gè)hs_err_<jvm_pid>.log。通常,從這個(gè)日志文件中即可查到Java虛擬機(jī)Crash時(shí)執(zhí)行的線程或原因(必要時(shí)需要通過(guò)允許生成coredump文件進(jìn)一步分析)。
另外,在EDAS控制臺(tái)應(yīng)用的基本信息頁(yè)面,應(yīng)用設(shè)置區(qū)域的異常退出分析右側(cè)單擊開(kāi)啟,配合應(yīng)用監(jiān)控告警功能,Java虛擬機(jī)進(jìn)程退出時(shí),就會(huì)發(fā)出告警,然后登錄ECS實(shí)例查找相關(guān)日志,分析具體原因。