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

相关文章

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

linux安装、更新、卸载anaconda实践

《linux安装、更新、卸载anaconda实践》Anaconda是基于conda的科学计算环境,集成1400+包及依赖,安装需下载脚本、接受协议、设置路径、配置环境变量,更新与卸载通过conda命令... 目录随意找一个目录下载安装脚本检查许可证协议,ENTER就可以安装完毕之后激活anaconda安装更