EDAS应用进程突然消失

问题描述

EDAS上的应用在运行时,进程突然消失。

问题原因

该问题通常由系统物理内存耗尽或应用运行的Java虚拟机进程异常退出(Crash)导致,本文以Linux操作系统为例进行说明:

  • 物理内存耗尽触发操作系统OOM Killer机制:
    1. 当操作系统物理内存和交换空间不够用时,操作系统的OOM Killer机制(默认打开)就会选择性地结束进程。
      说明:OOM Killer机制是如何知道要先结束哪个进程?其实Linux的每个进程都有一个oom_score值(位于/proc/XXX/oom_score),该值越大,越有可能会被OOM Killer机制选中并结束。
    2. 当一个进程被OOM Killer结束后,会向/var/log/messages操作系统日志写入结束进程的PID等信息,所以判断进程是否被OOM Killer,可以通过搜索操作系统日志来得知,执行以下任意一条命令,可以查看进程被结束的信息。

      grep -i 'killed process' /var/log/messages
      egrep "oom-killer|total-vm" /var/log/messages

      ECS实例进程被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
  • 应用运行的JVM进程异常退出(Crash)

解决方案

物理内存耗尽触发OOM Killer机制

遇到此问题时,请参见以下解决办法:

  • 增加ECS实例物理内存,如何增加请参见按量付费实例变配规格
  • 减少被结束进程分配的内存值。若被结束的是JVM进程,您可以根据您的业务情况,参见JVM启动配置参数,调整JVM的内存使用情况。
  • 检查ECS实例是否挂载Swap交换分区(ECS实例默认不挂载Swap交换分区,挂载Swap交换分区,可能会影响磁盘I/O的性能),如果未挂载(ECS实例大多数OOM Killer的问题都因为未挂载Swap交换分区导致,相比性能,进程健康性更加重要。),如何添加Swap交换分区,请参见Linux实例Swap分区的配置

若您的问题已经解决,可以参见OOM Kill报警,开启OOM Kill报警功能,并配合应用监控功能,在出现OOM Killer的风险时,EDAS会发出预警信息。当系统将应用结束之后,EDAS会发出报警信息。

应用运行的JVM进程异常退出(Crash)

JVM进程通常会因为异常的JNI调用等原因在运行时异常退出,发生此问题时,会在当前JVM进程的工作目录(通过pwdx [$JVM_PID]命令可查)生成一个hs_err_[$JVM_PID].log文件。通常,从这个日志文件中即可查到JVM进程异常退出时执行的线程或原因(必要时可以通过生成coredump文件进一步分析)。

说明:[$JVM_PID]为您JVM的进程号,您可以通过ps -ef |grep java命令查看进程号。

若您的问题已经解决,可以参见异常退出分析,开启异常退出分析功能,并配合应用监控功能,在Java进程退出时,就会发出告警。

适用于

  • 企业级分布式应用服务EDAS