解决阿里云低配服务器进程killed问题

多年前因为一些原因,买了一个新加坡的低配服务器(ecs.t5-lc2m1.nano)。本来上面只是跑个 nginx 和脚本,近期需要弄点新东西,发现连 yum 都执行失败。

这个问题困扰有一段时间了,具体表现为:

shell

# 执行yum命令被内核killed,例如:
[root@iZt4nfkptd39wsnnpvwsvcZ ~]# yum update
Killed

既然进程是被 killed,那么直接找内核日志。

shell

# 执行命令,查看内核日志
[root@iZt4nfkptd39wsnnpvwsvcZ ~]# dmesg | egrep -i -B100 'killed process'
# 可看到下面的返回Out of memory字样

[ 2067.387457] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-0.slice/session-3.scope,task=yum,pid=106912,uid=0
[ 2067.387466] Out of memory: Killed process 106912 (yum) total-vm:704512kB, anon-rss:371016kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:1376kB oom_score_adj:0

找到了问题原因,解决起来就比较简单。

既然是内存问题,那么就粗暴的扩大内存。又由于这个机器没什么重要的东西,性能方面基本不考虑。所以可以考虑使用交换分区,并且调整系统对内存分配策略。 但是交换分区并不是什么好办法,对磁盘压力比较大,很多命令都会假死卡住。只要你耐心等,还是能执行成功的,总比直接被 killed 要好点。

shell

# 注意:一下操作全部使用root用户
# 第一步,创建 1G 交换文件
[root@iZt4nfkptd39wsnnpvwsvcZ ~]# mkdir -p /opt/swapfile/
[root@iZt4nfkptd39wsnnpvwsvcZ ~]# dd if=/dev/zero of=/opt/swapfile/1GB.swap bs=1024 count=1048576

# 第二步,保护交换文件,禁止其他用户修改
[root@iZt4nfkptd39wsnnpvwsvcZ ~]# chown root:root /opt/swapfile/1GB.swap
[root@iZt4nfkptd39wsnnpvwsvcZ ~]# chmod 0600 /opt/swapfile/1GB.swap

# 第三步,将交换文件设置为交换分区
[root@iZt4nfkptd39wsnnpvwsvcZ ~]# mkswap /opt/swapfile/1GB.swap

# 第四步,临时启用交换分区
[root@iZt4nfkptd39wsnnpvwsvcZ ~]# swapon /opt/swapfile/1GB.swap

# 第五步,将交换写入分区表(持久化)
[root@iZt4nfkptd39wsnnpvwsvcZ ~]# sudo cp /etc/fstab /etc/fstab.bak
[root@iZt4nfkptd39wsnnpvwsvcZ ~]# echo '/opt/swapfile/1GB.swap none swap sw 0 0' | sudo tee -a /etc/fstab

# 第六步,调整使用交换分区的策略和回收策略
# 宗旨:尽量使用内存,减少swap,同时,尽早flush到外存,早点释放内存给写cache使用。
[root@iZt4nfkptd39wsnnpvwsvcZ ~]#  sudo sysctl vm.swappiness=10
[root@iZt4nfkptd39wsnnpvwsvcZ ~]#  echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
[root@iZt4nfkptd39wsnnpvwsvcZ ~]#  sudo sysctl vm.vfs_cache_pressure=50
[root@iZt4nfkptd39wsnnpvwsvcZ ~]#  echo 'vm.vfs_cache_pressure=100' | sudo tee -a /etc/sysctl.conf

# 第七步,调整系统内存分配策略
[root@iZt4nfkptd39wsnnpvwsvcZ ~]#  sudo sysctl vm.overcommit_memory =1
[root@iZt4nfkptd39wsnnpvwsvcZ ~]#  echo 'vm.overcommit_memory =1' | sudo tee -a /etc/sysctl.conf

我平时很少用这个机器(说白了就是穷),花钱是不可能花钱的,所以不准备升级这个服务器