服务器内存不足导致Tomcat进程被杀/服务终止 - 问题排查与解决方法

一、问题出现

开发环境:

阿里云的ECS云服务器(内存2G)、CentOS 7.0

服务器上部署了两个Tomcat, 一个部署运行后台管理系统(开放端口11001),一个负责部署客户端后台接口(开放端口11002)

打开浏览器,输入后台管理的域名地址:admin.xxx.com。结果报错:502 Bad Gateway。

二、问题排查

1. Nginx问题排查

因为首先报错信息看到的是Nginx代理服务器返回的502错误,于是首先去查看Nginx日志:/usr/local/nginx/logs/error.log,发现具体的信息如下:

2023/04/07 09:27:56 [error] 11978#0: *296704 connect() failed (111: Connection refused) while connecting to upstream, client: 103.235.151.232, server: admin.xxx.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://127.0.0.1:11001/favicon.ico", host: "admin.xxx.com", referrer: "http://admin.xxx.com/login"

分析一下,这是一个连接失败的错误信息,Nginx是个代理服务器,请求连接的对象是部署在Tomcat上的一个后台管理服务,对应的端口号是11001,既然Nginx还在正常运行,日志里也没有Nginx报错的信息,那就继续排查Tomcat。

2. Tomcat问题排查

首先运行命令:ps aux | grep tomcat,看看Tomcat的进程是否正在运行,文章开头提过,服务端有两个Tomcat在运行,分别监听的端口号是11001和11002,其中通过Nginx对端口11001的请求无法连接。

从上面的截图来看,只有一个Tomcat进程在运行,11001端口对应的那个Tomcat根本就没有运行,这就解释了为什么会请求报错,那么需要进一步查找是什么原因导致了Tomcat突然退出。

Tomcat是运行在JVM上的,常见的内存溢出有以下两种:

1. java.lang.OutOfMemoryError: PermGen space

2. java.lang.OutOfMemoryError: Java heap space

查看Tomcat的日志:cat {tomcat安装目录}/logs/catalina.out,里面并没有发现Tomcat因为内容溢出或其它异常退出的信息。

3. Jvm遇到致命错误崩溃

如果Jvm遇到致命错误而崩溃,应当会在程序目录生成hs_err_pid.log等错误报告文件,查看{tomcat安装目录}/bin 并没有找到崩溃的日志信息。

4. Tomcat内存占用过大,被系统kill

如果是系统主动杀死了Tomcat,会有相关的系统日志:cat /var/log/messages,查看后果然找到了相关的信息:

 如图所示,系统因为内存不够,杀死了占用内存最高的一个java进程(Tomcat),PID:2480,执行的时间也和与请求报错时间能对应上:

Apr  6 00:28:23 iZ2ze4ef9xk9hkxafq58d9Z kernel: Out of memory: Kill process 2480 (java) score 349 or sacrifice child
Apr  6 00:28:23 iZ2ze4ef9xk9hkxafq58d9Z kernel: Killed process 2480 (java), UID 0, total-vm:2650044kB, anon-rss:675812kB, file-rss:0kB, shmem-rss:0kB

三、问题解决

既然是内存不足引起的问题,那么怎么解决呢?除了升级服务器的物理内存,还有其他什么办法吗?

1. Tomcat jvm 内存大小配置

简单来说就是配置Tomcat使用的JVM内存大小,通过限制Tomcat内存使用的上限来避免被系统直接KILL掉。

2. SWAP虚拟内存配置

在Linux系统中的SWAP(交换分区),类似于Windows系统的虚拟内存。系统会把一部分硬盘空间虚拟成内存使用,将系统内非活动内存换页到SWAP,以提高系统可用内存。

参考:

Linux实例SWAP分区的配置和常见问题处理_云服务器 ECS-阿里云帮助中心

猜你喜欢

转载自blog.csdn.net/crazestone0614/article/details/130009219