Skip to content

程序自动killed,怎么解决? #17

Answered by hktalent
hktalent asked this question in Q&A
Discussion options

You must be logged in to vote

线上排查进程突然挂掉原因
对于线上应用,出现进程自动挂掉的原因,如果可以排除因程序本身原因,那么很大可能性是因为操作系统内存不够用,进程被操作系统kill掉了。
那如何确认是否是被操作系统kill掉的呢?
如果是因OutOfMemory被系统kill掉的进程,会在/var/log目录下的dmesg文件中留下最终的遗迹。可使用dmesg命令查看操作系统kill进程日记。
dmesg -T | grep -E -i -B100 'killed process'
1.
命令行执行输出如下(go进程)。
......
Out of memory: Kill process 28670 (bfe) score 386 or sacrifice child
Killed process 28670, UID 555, (bfe) total-vm:8478620kB, anon-rss:6149940kB, file-rss:4kB
1.
2.
3.
如果能知道挂掉的进程id,且在dmesg命令输出文本中找到,就能知道是否因内存原因被操作系统kill掉。
如果是虚拟机部署,建议在启动脚本中输出进程的id到文件存储,以便于后续问题排查。
此方法同样可以用于容器排查。
由于kubernetes的最小调度单元是Pod,如果只是容器重启,Pod不变,所在的物理机(虚拟机)就不变。而dmesg输出的是物理机(虚拟机)的操作系统kill进程日记,因此,虽然容器重启了,但我们还能使用dmesg命令查看进程被kill的原因。但需要注意,进程ID与容器内看到的进程ID是不同的。
一个容器部署的Java…

Replies: 2 comments

Comment options

hktalent
Jul 12, 2022
Maintainer Author

You must be logged in to vote
0 replies
Answer selected by hktalent
Comment options

hktalent
Jul 13, 2022
Maintainer Author

You must be logged in to vote
0 replies
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Q&A
Labels
None yet
1 participant