记一次个人服务器上 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。
增加交换内存 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