问题描述:

今天上班后,登录一台内网测试服务器,发现部分进程失踪 (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. 《DSP using MATLAB》示例Example6.18、6.19

  2. ckeditor使用教程

    ckeditor 的官方网站是 http://ckeditor.com/ 一.使用方法: 1.在页面<head>中引入ckeditor核心文件ckeditor.js <script ...

  3. docker could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network

    原因: 无法进行网络分配了 解决方法: // 所有的网络 docker network ls // 删除不用的,腾出多余的 docker network rm <networkname> ...

  4. 使用 lego生成 Let's Encrypt 证书

    1. 工具 https://github.com/xenolf/lego   2. 使用 命令生成新的 lego --email="foo@bar.com" --domains=& ...

  5. 使用dnSpy对目标程序(EXE或DLL)进行反编译修改并编译运行

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的工具下载地址为: https://github.com/cnxy/dnSpy/arc ...

  6. 腾讯加入QQ群,代码生成地址

    腾讯加入QQ群,代码生成地址 http://qun.qq.com/join.html

  7. 一些IPC常用头文件

    //my_err.h#include <errno.h> /* for definition of errno */ #include <stdarg.h> /* ISO C ...

  8. [深度学习]Python/Theano实现逻辑回归网络的代码分析

    2014-07-21 10:28:34 首先PO上主要Python代码(2.7), 这个代码在Deep Learning上可以找到. # allocate symbolic variables for ...

  9. Windows Driver Kit Version 7.1.0 ( 也就是 7600.16385.1 ) 下载地址

    Windows Driver Kit Version 7.1.0 ( 也就是 7600.16385.1 ) 下载地址 http://download.microsoft.com/download/4/ ...

  10. Netty--Google Protobuf编解码

    Google Protobuf是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化.它很适合做数据存储或 RPC 数据交换格式.可用于通讯协议.数据存储等领域的语言无关.平台无关.可扩展的序列 ...