暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

记一次java进程莫名消失的排查过程

IT微联盟 2021-10-09
2036

点击上方IT微联盟”,选择“置顶或者星标


tomcat项目部署在linux服务器进程莫名消失了

背景

我们有一个项目部署在阿里云的服务器上,没有设置任何监控。但是会偶尔人工登陆到机器巡检,项目运行了一年没有出现过大问题。近期业务反馈线上数据不正确,我们登陆机器发现项目进程找不到了。我们一脸懵,没遇到过这情况啊。

  • 阿里云配置
    内存 8G

  • java项目
    jvm参数堆内存6g
    jdk使用1.8

解决问题

  1. 我们发现问题后,第一反应是不是被别人攻击了,立即改了服务器密码。排查机器各项指标都正常后,重新启动了项目,观察了半小时后,没有出现问题。

  2. 观察项目日志,项目忽然停止没有其他异常日志,项目停止的时间点也能与阿里云cpu、内存等监控对上,而且我们发现在项目停止时服务器执行了两行命令(不是我们执行的)

  996   MAKRER=SHOW_LOCALE;printf $MAKRER""; locale; MAKRER=SHOW_LOCALE;printf $MAKRER"";
  997   CHECK_TYPE=SHELL; echo "INFO=${CHECK_TYPE} PID=$$ PPID=$PPID TTY=$(tty) SHELL=$0 HOME=$HOME PWD=$PWD| CHECK_SHELL_END"

  1. 这两个命令没有什么特别之处,而且之前也没有遇到过,就求助了度娘,经过一顿操作,网上对于这两行命令的描述并不多,有一篇帖子描述:服务器遭受到攻击了。但是观察我们服务器没有什么奇怪的项目(还是我太菜了?)。

  2. 经过大佬指点,我们排查了服务器日志,位置:/var/log/messages
    发现了一行日志,恍然大悟,判断是否由于OOM killer导致应用被kill。前段使用我们jvm堆的大小由4g改为了6g,才导致该问题,大意了啊。

Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉。内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory()被触发,然后调用select_bad_process()选择一个”bad”进程杀掉。如何判断和选择一个”bad进程呢?linux选择”bad”进程是通过调用oom_badness(),挑选的算法和想法都很简单很朴实:最bad的那个进程就是那个最占用内存的进程。

  1. 查看机器没有设置swap区(阿里云服务器默认不设置)。我们jdk使用的1.8,会使用堆外内存导致机器内存内占用满导致oom。

  2. 但是为什么会出现上面两行命令,我们还是没动,后来咨询了阿里云,给了回复,但是总感觉怪怪的,有大佬懂么?

您好,通过您准备反馈信息,应该有人恶意破解了您的root密码,然后登录服务器进行了操作,请参考https://tieba.baidu.com/p/6437563537 也有类似用户出现这个问题,这边查看服务器没有磁盘快照,请您查看您本地是否有数据备份,可以进行恢复

反思

问题解决
没有及时发现问题机器配置监控报警
优化项目(jvm参数调整)没有跟进观察优化项目时跟进观察项目,设置应急方案

终归还是自己菜了,后面还是要多多学习

- end -

 点小程序,免费练习BATJ最新、最全面试题目。


每一个“在看”,都是对我们最大的肯定!


文章转载自IT微联盟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论