Skip to content

记一次个人服务器上 Java 应用自动停止的异常排查

背景

小孟同学自己买了个服务器(2 核 4G),部署了一些 Java 应用在上面,但是最近服务经常自己就停止了。

排查

查看系统 message 记录

bash
[root@ls log]# cd /var/log
[root@ls log]# cat messages* |grep java
May 20 21:18:34 ls kernel: [12777]     0 12777  1225316   414774     943        0             0 java
May 20 21:18:34 ls kernel: Out of memory: Kill process 12777 (java) score 398 or sacrifice child
May 20 21:18:34 ls kernel: [12777]     0 12777  1225316   414844     943        0             0 java
May 20 21:18:34 ls kernel: Out of memory: Kill process 12777 (java) score 398 or sacrifice child
May 20 21:18:34 ls kernel: Killed process 12777 (java), UID 0, total-vm:4901264kB, anon-rss:1659376kB, file-rss:0kB, shmem-rss:0kB
[root@ls log]#

可以看到是因为内存不足( Out of memory)造成的。

查看内存使用情况

bash
[root@ls log]# free -h
              total        used        free      shared  buff/cache   available
Mem:           3.9G        2.4G        150M        912K        1.1G        1.1G
Swap:            0B          0B          0B
[root@ls log]#

确实所剩不多了

解决方案

由于资金有限,买高配置的服务器不现实。那么在不增加物理内存的情况下,启用 swap 交换区作为虚拟内存是一个不错的选择。

注意:如果使用 Kubernetes 的话,此方法不可行。安装 Kubernetes 必须关闭 swap。

参考文档:Linux 启用 swap 交换区作为虚拟内存

增加交换内存 swap

查看系统当前的分区情况

bash
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           972M        202M        661M        7.6M        107M        642M
Swap:          0           0           0

# 可以看出,当前是没有启用 swap 交换区的。

创建用于交换分区的文件

bash
# 先创建一个 swap 文件存放的文件夹
mkdir /opt/swap

# 创建8GB的交换内存(一般大小设为为物理内存的两倍即可)
# (bs*count=文件大小) 会在 /opt/swap/下创建名为 data 的文件(交换内存文件)
# 创建需要一点时间,需要耐心等待
dd if=/dev/zero of=/opt/swap/data bs=1M count=8192

# 把这个文件设置为交换分区文件
mkswap /opt/swap/data

# 修改文件权限为600
chmod 600 /opt/swap/data

# 启用交换分区文件
swapon /opt/swap/data

# 开机时自启用。若要想使开机时自启用,则需修改文件/etc/fstab 添加一行
vi /etc/fstab
# 添加以下内容:
/opt/swap/data swap swap defaults 0 0

关闭 swap 交换文件

bash
# 查看 swap 状态。Swap 为 0 说明没有开启 Swap
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           972M        202M        661M        7.6M        107M        642M
Swap:          0           0           0


# 临时关闭全部 swap
swapoff -a
# 关闭指定 swap
swapoff /opt/swap/data

# 移除 swap 文件
rm -f /opt/swap/data

# 从 /etc/fstab 文件中删除追加的内容
vi /etc/fstab
# 删除(或注释掉)以下内容:
/opt/swap/data swap swap defaults 0 0