当操作系统物理内存和交换空间不够用时,操作系统的OOM Killer机制(默认打开)就会选择性地杀死进程,那么它是怎样知道要先杀死哪个进程呢?其实Linux的每个进程都有一个oom_score(位于/proc/<pid>/oom_score),这个值越大,就越有可能被OOM Killer选中并杀死。
当一个进程被杀死时,这个信息记录在哪里?
当一个进程被OOM Killer杀死以后会向操作系统日志写入杀死的进程PID等信息,所以判断进程是否被OOM Killer,就可以通过搜索操作系统日志来得知。
DataPump进程被OOM Killer的日志:
messages:Dec 25 16:31:20 iZm5e9rq4aelxkngiw5xoqZ kernel: [ 5842] 0 5842 2235658 1685262 3606 0 0 DataPump
messages:Dec 25 16:31:20 iZm5e9rq4aelxkngiw5xoqZ kernel: Out of memory: Kill process 5842 (DataPump) score 402 or sacrifice child
messages:Dec 25 16:31:20 iZm5e9rq4aelxkngiw5xoqZ kernel: Killed process 5842 (DataPump), UID 0, total-vm:8942632kB, anon-rss:6739808kB, file-rss:1240kB, shmem-rss:0kB
搜索命令为:
grep -i 'Kill process' /var/log/messages
遇到此问题时,解决办法有以下几个:
增大ECS实例物理内存或者减少被杀死的进程分配的内存值。
检查ECS实例是否挂载了Swap交换分区( ECS实例默认不挂载Swap交换分区 ),
如果未挂载(阿里云ECS环境大多数OOM Killer的问题都因为未挂载Swap交换分区,相比性能,进程健康性更加重要)请搜索Linux挂载Swap交换分区的方法并自行挂载Swap交换分区。
linux系统文件通常在 /var/log 中下面是对下面常出现的文件进行解释
/var/log/message ---------------------------------------系统启动后的信息和错误日志
/var/log/secure ------------------------------------------与安全相关的日志信息
/var/log/maillog ------------------------------------------与邮件相关的日志信息
/var/log/cron ----------------------------------------------与定时任务相关的日志信息
/var/log/spooler ------------------------------------------与UUCP和news设备相关的日志信息
/var/log/boot.log -----------------------------------------守护进程启动和停止相关的日志消息
/var/log/wtmp ---------------------------------------------永久记录每个用户登录、注销及系统的启动、停机的事件
/var/run/utmp ---------------------------------------------记录当前正在登录系统的用户信息;
/var/log/btmp ----------------------------------------------记录失败的登录尝试信息。