问题描述:

今天上班后,登录一台内网测试服务器,发现部分进程失踪 (Nginx/PHP-FPM/MySQL/Crond)。

解决方法:

1、首先启动这些进程,保证正常提供服务。

2、查看服务器日志信息,排除故障。

shell > less /var/log/messages-

Sep   :: localdomain kernel: Out of memory: Kill process  (mysqld) score  or sacrifice child
Sep :: localdomain kernel: Killed process , UID , (mysqld) total-vm:9170936kB, anon-rss:246880kB, file-rss:32kB Sep :: localdomain kernel: Out of memory: Kill process (nginx) score or sacrifice child
Sep :: localdomain kernel: Killed process , UID , (nginx) total-vm:130256kB, anon-rss:216kB, file-rss:12kB

3、发现类似的日志信息,上网查资料。

4、资料显示,这是由于系统内存不足导致触发 Linux Kernel OOM(Out of memory killer)保护机制,将占用内存大的进程杀死,以保证系统正常运行。

Sep   :: localdomain kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=, oom_adj=, oom_score_adj=
Sep :: localdomain kernel: mysqld cpuset=/ mems_allowed=- Sep :: localdomain kernel: crond invoked oom-killer: gfp_mask=0x84d0, order=, oom_adj=, oom_score_adj=
Sep :: localdomain kernel: crond cpuset=/ mems_allowed=- Sep :: localdomain kernel: php invoked oom-killer: gfp_mask=0x201da, order=, oom_adj=, oom_score_adj=
Sep :: localdomain kernel: php cpuset=/ mems_allowed=-

5、还发现一种情况,内存够用,但还是触发了 OOM 杀死进程。这里涉及到一个 Low Memory 的知识点。内核使用 Low Memory 来跟踪所有的内存分配。

注意:只有在 32 位操作系统中才区分 Low Memory 与 High Memory ,64 位系统中 Low Memory 就是所有内存空间。

shell > free -lm
total used free shared buffers cached
Mem:
Low:
High:
-/+ buffers/cache:
Swap:

# 可以看到:Low 大小跟总内存一样大,High 都为 0 。

6、那该怎么办?

> 增加内存、使用 64 位操作系统。

> 合理配置内存空间,例如 PHP 加速器的缓存空间等,定期重启 PHP-FPM 进程。

> 手动释放内存:sync; echo 3 > /proc/sys/vm/drop_caches

> 使用 hugemem 内核,该内核以不同的方式分割 low/high memory ,而且多数情况下会提供足够多的 low memory 到 high memory 的映射。
  安装 hugemem kernel rpm 包,重启服务器即可。
 
> 指定不杀死某进程:echo -17 > /proc/$(pidof mysqld)/oom_adj  # -17 为对该进程禁止使用 OOM

> echo "vm.panic_on_oom = 1" >> /etc/sysctl.conf; sysctl -p   # 关闭 OOM ( 后两三种慎用吧 )

sync; echo 3 > /proc/sys/vm/drop_caches

Linux OOM 自动杀死进程的更多相关文章

  1. linux 根据进程名杀死进程 -kill进程名

    前两天一个老师给我出了一个linux操作上的问题,现在知道进程名怎样杀死这个进程.或许很多人都会和我一样说用 #pkill 进程名 或是 #killall 进程名 的确这个两个命令都能做到这些,而且我 ...

  2. 20_Android中apk安装器,通过WebView来load进一个页面,Android通知,程序退出自动杀死进程,通过输入包名的方式杀死进程

     场景:实现安装一个apk应用程序的过程.界面如下: 编写如下应用,应用结构如下: <RelativeLayout   编写activity_main.xml布局: <Relative ...

  3. linux下批量杀死进程

    ps aux|grep python|grep -v grep|cut -c 9-15|xargs kill -15 管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入.下面 ...

  4. Linux基础命令---杀死进程killall

    killall killall可以根据名字来杀死进程,它会给指定名字的所有进程发送信息.如果没有指定信号名,则发送SIGTERM.信号可以通过名称(例如-HUP或-SIGHUP)或数字(例如-1)或选 ...

  5. Linux基础命令---杀死进程pkill

    pkill pkill可以给指定的进程发送信息,它可以结束某个执行的进程或者目录登录的用户. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedo ...

  6. Linux 下批量杀死进程

    ps aux|grep python|grep -v grep|cut -c 9-15|xargs kill -15 管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入.下面 ...

  7. Linux下强制杀死进程的方法

    常规篇: 首先,用ps查看进程,方法如下: $ ps -ef …… smx 1822 1 0 11:38 ? 00:00:49 gnome-terminal smx 1823 1822 0 11:38 ...

  8. linux实现自动检测进程是否存活的脚本

    可以在性能测试过程中.定期检测startAgent和nmon的状态 #!/bin/sh while true do pnmon=`ps aux | grep nmon | grep -v grep`; ...

  9. linux 强制删除杀死进程 sudo pkill uwsgi -9 杀死uwsgi 关闭防火墙 iptables -F

    sudo pkill -f uwsgi -9 四.关闭防火强        iptables -F  #清空规则        systemctl stop firewalld  #关闭防火墙服务   ...

随机推荐

  1. 每天一个linux命令:【转载】nl命令

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  2. stm32寄存器版学习笔记03 外部中断

    stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...

  3. Java--数组转成list,list转数组

    数组转成list: 方法一: String[] userid = {"aa","bb","cc"}; List<String> ...

  4. Flask第五篇——设置debug模式

    flask默认是没有开启debug模式的,开启debug模式有很多好处: 第一,可以帮助我们查找代码里面的错误,比如: # coding: utf-8 from flask import Flask ...

  5. kong nginx 配置文件说明&&借鉴

    备注:     只是简单的进行说明配置文件,不会牵扯到源码   1.  配置文件位置 // 通过ps 查找 ps -ef |grep nginx /usr/local/openresty/nginx/ ...

  6. Java API 操作Zookeeper

    一.依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookee ...

  7. xdebug : Debug session was finished without being paused

    一.当调试模式出现说路径不匹配的时候,需要检查当前请求的URL和设置断点的是否在同样的位置 Debug session was finished without being paused It may ...

  8. Java 静态对象 static

    什么是静态变量 大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立. 然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 static 大显身手的时候了 ...

  9. 汇编_指令_DS*10H的含义

    在8086存储器系统中,20位地址总线的地址是物理地址.但是由于8086内部寄存器都是16位的, 用16位寄存器直接访问20位存储器空间显然不可能,所以8086CPU使用了存储器分段的办法.这 样内存 ...

  10. mysql实战优化之一:sql优化

    1.选取最适用的字段属性 MySQL 可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得 ...