问题描述:

今天上班后,登录一台内网测试服务器,发现部分进程失踪 (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. BZOJ3325 [Scoi2013]密码【Manacher】【构造】【贪心】

    Description Fish是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进.通过翻阅古籍,Fish 得知了这个密码的相关信 ...

  2. MQ 发布/订阅者模式

    package com.chauvet.utils.mq.topic; import javax.jms.DeliveryMode; import javax.jms.JMSException; im ...

  3. ballerina 学习十一 Packages

    ballerina 的包还是比较简单的,实际上就是对于源码文件集合的管理,同时我们可以添加别名,同时可以进行 其他包的引用 import 简单例子 代码 import ballerina/math; ...

  4. [LeetCode系列]子集枚举问题[无重复元素]

    给定一组数(未排序), 求它们的所有组合可能. 如给定{1 2 3}, 返回: [ [] [1] [2] [3] [1 2] [1 3] [2 3] [1 2 3] ] 算法思路: 对数组排序, 从小 ...

  5. XaaS简介(关于IssS,PaaS以及SaaS)

    IaaS,比较容易理解,提供了一个操作系统以及操作系统的硬件支撑:阿里云: PaaS,提供了一个平台,或者说,使用PaaS是希望能够在上面建立自己的服务/应用,同时平台会提供一些API或者工具,能够降 ...

  6. win7怎么安装和启动 jboss

    本文以JBoss Application Server 4.2.1 GA(以下简称JBoss)为例,介绍它在Windows平台上的启动过程.为了方便叙述,对平台环境做以下假定:Java运行时的安装路径 ...

  7. 如何把SQLServer数据库从高版本降级到低版本

    如何把SQLServer数据库从高版本降级到低版本 编写人:CC阿爸 2015-4-7 近期在给一个客户推行ECM系统时,基本客户的硬件环境,我们为其安装的为SQL2008 64位的数据库系统.在安装 ...

  8. bootstrap常用模态框

    <!-- 触发器(button) --> <button class="btn btn-xs btn-success" data-toggle="mod ...

  9. CFile用法(转)

    一.各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟练的掌握文件操作是十分重要的.本文将对Vis ...

  10. Java-Runoob-面向对象:Java 接口

    ylbtech-Java-Runoob-面向对象:Java 接口 1.返回顶部 1. Java 接口 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以 ...