Linux OOM-killer机制说明

2023-12-19 08:40
文章标签 linux 说明 机制 killer oom

本文主要是介绍Linux OOM-killer机制说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.什么是OOM-killer

oom_killer(out of memory killer)是Linux内核的一种内存管理机制,在系统可用内存较少的情况下,内核为保证系统还能够继续运行下去,会选择杀掉一些进程释放掉一些内存。通常oom_killer的触发流程是:进程A想要分配物理内存(通常是读写内存)->触发缺页异常->内核去分配物理内存->物理内存不足,触发OOM

1.1. OOM-killer策略

Linux下每个进程都有个OOM权重,在/proc/<pid>/oom_adj里面,取值是-17到+15,取值越高,越容易被干掉。oom killer选择杀哪个进程,是基于它的badness score,该值体现在/proc/<pid>/oom_score里面。它的原则是,尽可能少杀进程来尽可能释放出足够多的内存,同时不去杀那些耗费内存很多的无辜进程。badness score的计算会用到进程的内存大小,CPU时间(user time + system time) 运行时间,以及oom_adj值。进程消耗的内存越多,得分就越高;进程运行的时间越长,得分就越低。

这也解释了,为什么新fork出来的进程容易被杀死,因为它的运行时间短,得分高

oom killer选择进程的策略大致如下:

  1. 它必须拥有大量的页框
  2. 杀掉这个进程只会损失少量的工作
  3. 它的静态优先级必须低(可以通过nice来给不重要的进程设置低的优先级)
  4. 它不能够拥有root权限
  5. 它不能直接访问硬件
  6. 它不能够是0号进程(swapper),1号进程(init),以及内核线程

2.什么是Overcommit

Memory Overcommit的意思是操作系统承诺给进程的内存大小超过了实际可用的内存。一个保守的操作系统不会允许memory overcommit,有多少就分配多少,再申请就没有了,这其实有些浪费内存,因为进程实际使用到的内存往往比申请的内存要少,比如某个进程malloc()了200MB内存,但实际上只用到了100MB,按照UNIX/Linux的算法,物理内存页的分配发生在使用的瞬间,而不是在申请的瞬间,也就是说未用到的100MB内存根本就没有分配,这100MB内存就闲置了。

Unix/Linux的内存分配策略是lazy的,申请的时候不会分配物理内存,只有在使用的时候才分配,为了尽可能地提高内存地利用效率,系统大部分情况下都会“答应”申请内存的要求。由于overcommit的存在,系统没办法在进程运行的时候就预判内存是否会耗尽,只有在真正分配内存的时候才会发现内存不够。为了防止系统崩溃,触发 OOM killer强杀一个或多个进程,以释放部分内存。

2.2.Overcommit策略

Linux 2.6之后允许通过内核参数 vm.overcommit_memory 禁止memory overcommit。内核参数 vm.overcommit_memory 接受三种取值:

  1. 0 – Heuristic overcommit handling. 这是缺省值,它允许overcommit,但过于明目张胆的overcommit会被拒绝,比如malloc一次性申请的内存大小就超过了系统总内存。Heuristic的意思是“试探式的”,内核利用某种算法猜测你的内存申请是否合理,它认为不合理就会拒绝overcommit。
  2. 1 – Always overcommit. 允许overcommit,对内存申请来者不拒。
  3. 2 – Don’t overcommit. 禁止overcommit。

overcommit的阈值在/proc/meminfo中指定,

  • CommitLimit :overcommit的阈值,申请的内存总数超过CommitLimit即为overcommit。通过内核参数vm.overcommit_ratio或vm.overcommit_kbytes间接设置的,公式如下:【CommitLimit = (Physical RAM * vm.overcommit_ratio / 100) + Swap】

        vm.overcommit_ratio 是内核参数,缺省值是50,表示物理内存的50%

  • Committed_AS:所有进程已经申请的内存总大小(是已经申请,不是已经分配),如果 Committed_AS 超过 CommitLimit 就表示发生了 overcommit,超出越多表示 overcommit 越严重

附录:

  • CPU性能分析工具

vmstat、 sar、time、strace、pstree、top

  • 内存性能分析工具

vmstat、strace、top、ipcs、ipcrm、slabtop、cat /proc/meminfo、cat /proc/slabinfo、cat /proc/<pid #>/maps

  • IO性能分析工具

vmstat、iostat、repquota、quotacheck

  • 网络性能分析工具

Ifconfig、ethereal、iptraf、iwconfig、nfsstat、mrtg、ntop、netstat、cat /proc/sys/net

  • CPU性能调优工具

nice、renic、sysctl

  1. 内存性能调优工具

swapon、ulimit、sysctl

  • I/O性能调优工具

Edquota、quoton、sysctl

这篇关于Linux OOM-killer机制说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/511559

相关文章

Linux下修改hostname的三种实现方式

《Linux下修改hostname的三种实现方式》:本文主要介绍Linux下修改hostname的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下修改ho编程stname三种方式方法1:修改配置文件方法2:hFvEWEostnamectl命

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Linux搭建Mysql主从同步的教程

《Linux搭建Mysql主从同步的教程》:本文主要介绍Linux搭建Mysql主从同步的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux搭建mysql主从同步1.启动mysql服务2.修改Mysql主库配置文件/etc/my.cnf3.重启主库my

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

MySQL常见的存储引擎和区别说明

《MySQL常见的存储引擎和区别说明》MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每种引擎有其特点和适用场景,选择存储引擎时需根... 目录mysql常见的存储引擎和区别说明1. InnoDB2. MyISAM3. MEMORY4. A

MyBatis的配置对象Configuration作用及说明

《MyBatis的配置对象Configuration作用及说明》MyBatis的Configuration对象是MyBatis的核心配置对象,它包含了MyBatis运行时所需的几乎所有配置信息,这个对... 目录MyBATis配置对象Configuration作用Configuration 对象的主要作用C

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi

jdk21下载、安装详细教程(Windows、Linux、macOS)

《jdk21下载、安装详细教程(Windows、Linux、macOS)》本文介绍了OpenJDK21的下载地址和安装步骤,包括Windows、Linux和macOS平台,下载后解压并设置环境变量,最... 目录1、官网2、下载openjdk3、安装4、验证1、官网官网地址:OpenJDK下载地址:Ar

linux本机进程间通信之UDS详解

《linux本机进程间通信之UDS详解》文章介绍了Unix域套接字(UDS)的使用方法,这是一种在同一台主机上不同进程间通信的方式,UDS支持三种套接字类型:SOCK_STREAM、SOCK_DGRA... 目录基础概念本机进程间通信socket实现AF_INET数据收发示意图AF_Unix数据收发流程图A

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份