服务器上tomcat进程突然终止问题排查
1)检查是否shell进程终止导致tomcat终止(排除)
由于使用./catalina.sh start启动tomcat,启动后tomcat的父PID为1,因此不会由于shell断开而终止
2)tomcat进程是否被主动停止(排除)
查询tomcat的catalina.out日志,未发现有终止的日志,比如
INFO [Thread-6] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
INFO [Thread-6] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
3)检查是否被操作系统kill掉
1. 查看Killed对应的日志
1.1 触发Killed常见原因
当系统资源不足时,Linux 内核也可以决定终止一个或多个进程。 一个非常常见的例子是内存不足 (OOM) killer,会在系统的物理内存耗尽时触发。
Linux有这个特性:OOM Killer,一个保护机制,用于避免在内存不足的时候不至于出现严重问题,把一些无关的进程优先杀掉,即在内存严重不足时,系统为了继续运转,内核会挑选一个进程,将其杀掉,以释放内存,缓解内存不足情况,不过这种保护是有限的,不能完全的保护进程的运行。
由于运行tomcat的是个人的服务器或测试服务器,配置较低,因此出现内存不足的情况。
1.2 查看Killed日志
当内存不足时,内核会将相关信息记录到内核日志缓冲区中,该缓冲区可通过 /dev/kmsg 获得。
有几个工具/脚本/命令 可以更轻松地从该虚拟设备读取数据,其中最常见的是 dmesg 和 journalctl。
使用 sudo dmesg | tail -7 命令(任意目录下,不需要进入log目录,这应该是最简单的一种)
hs@hs:~$ sudo dmesg | tail -7
[4772612.871775] [1125836] 1000 1125836 2539 911 61440 0 0 bash
[4772612.871777] [1126560] 1000 1126560 1787 474 53248 0 0 tmux: client
[4772612.871779] [1138439] 1000 1138439 2029489 1412461 12845056 0 0 python3
[4772612.871781] [1141425] 1000 1141425 1809 38 49152 0 0 sleep
[4772612.871783] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-1549.scope,task=python3,pid=1138439,uid=1000
[4772612.871840] Out of memory: Killed process 1138439 (python3) total-vm:8117956kB, anon-rss:5649844kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:12544kB oom_score_adj:0
[4772612.968800] oom_reaper: reaped process 1138439 (python3), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
可以看到:
oom-kill之后,就是解释那个被killed的程序的pid和uid
Out of memory: Killed process 1138439 (python3) total-vm:8117956kB, anon-rss:5649844kB,内存不够
total_vm:总共使用的虚拟内存 Virtual memory use (in 4 kB pages)
8117956/1024(得到MB)/1024(得到GB)=7.741GB
rss:常驻内存使用Resident memory use (in 4 kB pages)
5649844/1024/1024=5.388GB