【Linux】关于OOM(Out of Memory)相关的介绍及处理方法

这篇具有很好参考价值的文章主要介绍了【Linux】关于OOM(Out of Memory)相关的介绍及处理方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于OOM(Out of Memory)相关的介绍及处理方法

OOM(Out-of-Memory)机制是内核的一部分,用于处理内存消耗过度的情况。OOM机制的责任是选择一个或多个高内存消耗的进程,并终止它们以释放内存。

在Linux中,进程的OOM Score决定了在出现内存不足的情况下,进程是最可能被终止的。OOM Score越高的进程被终止的可能性也就越大。

你不应该直接修改一个进程的OOM Score。通常,你可以通过以下方式来影响OOM的行为:

  1. 调整系统级别的内存限制(例如sysctl调整vm.overcommit_memory限制)
  2. 调整内存使用(例如在应用程序代码中管理内存,或使用可调整的进程或容器限制)
  3. 调整OOM Score的全局设置(例如修改/proc/sys/vm/oom_score_adj值,该值影响所有进程)

在任何情况下,请小心谨慎地处理OOM设置并确保它们符合您的实际需求。

可以使用sysctl来调整Linux系统中的vm.overcommit_memory设置。这个设置控制Linux内核如何处理内存过度分配的情况。

修改vm.overcommit_memory限制

以下是在Linux中使用sysctl修改vm.overcommit_memory设置的步骤:

  1. 确认当前的vm.overcommit_memory设置。在终端中运行以下命令:

    sysctl vm.overcommit_memory
    

    如果您需要提权才能运行此命令,请在命令前添加sudo。

  2. 根据输出结果判断您是否需要修改内存设置。vm.overcommit_memory有以下三个值可供选择:

    • 0:表示内核将检查是否有足够的可用内存来满足进程的需要,如果没有足够的内存,内核将杀死进程并释放内存。
    • 1:表示内核将允许进程分配所有它们请求的虚拟内存,并且不会检查物理内存是否足够。当物理内存不足时,进程可能会因无可用内存而崩溃。
    • 2:表示内核将允许进程分配所有它们请求的虚拟内存,但会检查交换空间和物理内存是否足够。如果两者都不足,内核将杀死进程并释放内存。
  3. 修改vm.overcommit_memory设置。在命令行中输入以下命令并为需要的值(0到2)进行替换:

    sudo sysctl vm.overcommit_memory=<value>
    

    例如,如果您想将值设置为2,可以运行以下命令:

    sudo sysctl vm.overcommit_memory=2
    
  4. 如果您希望永久保存修改的值,可以将它们添加到/etc/sysctl.conf文件中。在文件的末尾添加以下行:

    vm.overcommit_memory = <value>
    

    请替换为所需设置的值(0到2)。

注意事项:请注意操作系统版本和内核版本是否支持您设置的值。另外,请谨慎地进行内存设置的更改,以免出现不可预料的行为。

调整内存使用

1.在应用程序代码中管理内存:应用程序可以使用一些技术来管理内存,例如手动释放内存、使用内存池和内存重用等。可以帮助应用程序避免过度使用内存,从而减少出现OOM问题的概率。

2.使用可调整的进程或容器限制:可以使用可调整的进程或容器限制来限制进程或容器可以使用的内存量。这些限制可以根据需要进行调整,并可用于避免过度使用内存和OOM问题。

3.升级硬件:如果出现频繁的OOM问题,则可以考虑升级系统硬件,例如增加内存容量。这将提高系统的内存容量,并减少OOM问题的发生。

调整OOM Score的全局设置

OOM Score是Linux系统中用来确定进程优先级的指标,可以通过更改该值来调整系统中进程的优先级。以下是调整OOM Score全局设置的步骤:

  1. 打开/etc/sysctl.conf文件:
sudo vim /etc/sysctl.conf
  1. 在文件末尾添加以下行:
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
vm.oom_kill_allocating_task = 0
  1. 解释一下这三个参数的意义:
  • vm.overcommit_memory:表示系统内存充足性检查机制。0表示表示系统将会检查并根据需要减少内存使用,1表示系统将允许分配超出系统内存总量的内存(即虚拟内存),2表示所有的内存请求都分配,而不管交换空间是否够用。
  • vm.overcommit_ratio:表示当开启vm.overcommit_memory时,向应用层分配物理内存与虚拟内存的比例。默认值为50%,所以将该值调整为80%可以给应用层更多的物理内存。
  • vm.oom_kill_allocating_task:表示当系统出现OOM(out of memory)时,是否杀掉正在分配内存的任务以释放内存。将该值设置为0可以让系统直接杀掉已存在的进程,而不是正在分配内存的进程。
  1. 保存并退出文件,重启系统(或者执行以下命令使设置生效):
sudo sysctl -p

这样,系统中的所有进程都将根据新的设置来调整优先级,从而更好地管理内存使用。需要注意的是,调整系统优先级具有一定的风险,请在操作前仔细评估并备份数据。

临时修改oom_score_adj值

例如临时修改ssh进程oom_score_adj值

cat /proc/1589/oom_score_adj
-1000
# 覆盖原值
echo 0 > /proc/1589/oom_score_adj

涉及到的文件

panic_on_oom

用来控制当内存不足时该如何做。

/proc/sys/vm/panic_on_oom

  • 值为0:内存不足时,启动 OOM killer。

  • 值为1:内存不足时,有可能会触发 kernel panic(系统重启),也有可能启动 OOM killer。

  • 值为2:内存不足时,表示强制触发 kernel panic,内核崩溃GG(系统重启)。

oom_kill_allocating_task

用来决定触发OOM时先杀掉哪种进程

/proc/sys/vm/oom_kill_allocating_task

  • 值为0:会 kill 掉得分最高的进程。

  • 值为非0:会kill 掉当前申请内存而触发OOM的进程。

oom_score_adj

设置进程kill优先级接口

/proc/PID/oom_score_adj(注意 points越小越不容易被杀;值为-1000到+1000)

oom_dump_tasks

用来记录触发OOM时记录哪些日志

/proc/sys/vm/oom_dump_tasks oom_dump_tasks

参数可以记录进程标识信息、该进程使用的虚拟内存总量、物理内存、进程的页表信息等。

值为0:关闭打印上述日志。在大型系统中,可能存在上千进程,逐一打印使用内存信息可能会造成性能问题。

其他导致OOM

其他1:cgroup oom(/sys/fs/cgroup/memory)

1. memory.usage_in_bytes > memory.limit_in_bytes时触发。

2. memory.oom_control控制oom行为

oom_kill_disable 1/0

3.日志差异

Cgroup oom时调用栈会有

a. mem_cgroup_out_of_memory+0xAAA/0xBBB

b. oom信息会新增当前memcgroup的信息,包括used,limit和

Task信息

其他2: overcommit

Memory Overcommit的意思是操作系统承诺给进程的内存大小超过了实际可用的内存。

接口:

/proc/sys/vm/overcommit_kbytes

/proc/sys/vm/overcommit_memory

内核参数 vm.overcommit_memory 接受三种取值:

  • 0 – Heuristic overcommit handling. 这是缺省值,它允许overcommit,但过于明目张胆的overcommit会被拒绝,比如malloc一次性申请的内存大小就超过了系统总内存。Heuristic的意思是“试探式的”,内核利用某种算法(对该算法的详细解释请看文末)猜测你的内存申请是否合理,它认为不合理就会拒绝overcommit。

  • 1 – Always overcommit. 允许overcommit,对内存申请来者不拒。

  • 2 – Don’t overcommit. 禁止overcommit。

/proc/sys/vm/overcommit_ratio

默认50,表示超过50%触发

验证

# grep -i commit /proc/meminfo
CommitLimit: 5967744 kB
Committed_AS: 5363236 kB

注意:

overcommit针对的是内存申请,内存申请不等于内存分配,内存只在实际用到的时候才分配。比如进程malloc申请100G,但是使用只用到10M,那么oom针对的是实际内存(RSS),overcommit针对的是malloc。

日志差异:调用栈有__vm_enough_memory, 只是打印meminfo,不会kill任务

参考文章:https://zhuanlan.zhihu.com/p/463434212文章来源地址https://www.toymoban.com/news/detail-464940.html

到了这里,关于【Linux】关于OOM(Out of Memory)相关的介绍及处理方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CUDA报错:Out of Memory

    如果报错里提示Pytorch reserved的内存远大于Already allocated的内存,那么就是因为分配显存时单位过大,导致出现大量内存碎片无法继续分配(与操作系统内存管理同理)。 我们可以限制一次分配的最大单位来解决这个问题。 随后代码便可正常运行了。

    2024年02月15日
    浏览(57)
  • Out of memory,realloc failed

    git config --global http.postBuffer 1048576000

    2024年02月21日
    浏览(49)
  • vite打包失败 - out of memory

    在做项目时,随着需求的不断增加,我们的代码文件会越来越大,但是在打包时,在 Node 中通过 JavaScript 使用内存的大小却是有限制的。于是,今天打算部署代码时,报错了: 解决方案 在网上找了以下解决方案: 升级node版本(未尝试:非必要,不升级,免得带来不兼容问题

    2024年04月10日
    浏览(44)
  • 解决 JavaScript heap out of memory

    运行 npm run dev 报错 Reached heap limit Allocation failed - JavaScript heap out of memory 解决方式一: 用 vscode 打开项目,在终端中运行如下 之后运行 解决方式二: 在运行时加上运行参数 解决方式三: 在系统环境变量里面配置 重启 vscode ,在vscode 的终端中运行 查看环境变量是否修改成功

    2024年02月08日
    浏览(54)
  • 报错解决:RuntimeError: CUDA out of memory.

    在进行深度学习的模型训练时,经常会遇到显存溢出的报错: RuntimeError: CUDA out of memory. 输出如下图所示: 打开一个终端,输入以下命令查看GPU使用情况: 输出如下图所示: 使用nvidia-htop可以进一步查看更为详细的内容。 nvidia-htop:A tool for enriching the output of nvidia-smi. 可以通

    2024年02月12日
    浏览(61)
  • IDEA out of memory问题解决,亲测有效!

    一、问题现象 IDEA一启动就弹出如下: 二、解决方案 1、点击图中的Continue按钮,然后快速的点开help按钮 2、点击help,找到如图按钮: 点开按钮以后,修改这三项的值,尽量调大一些,如图我的设置就够用了,重启IDEA即可。亲测有限!

    2024年02月16日
    浏览(43)
  • Stable Diffusion v1.5 Out of Memory 解决

    方法1: AI绘画——使用stable-diffusion生成图片时提示RuntimeError: CUDA out of memory处理方法_ai画图内存不足错误:cuda内存不足。_PromiseTo的博客-CSDN博客 方法2:

    2024年02月11日
    浏览(55)
  • torch.cuda.OutOfMemoryError: CUDA out of memory.

    训练清华ChatGLM-6B时报错, 原因是显存不够 torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 96.00 MiB (GPU 0; 23.70 GiB total capacity; 4.37 GiB already allocated; 64.81 MiB free; 4.37 GiB reserved in total by PyTorch) If reserved memory is allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentatio

    2024年02月06日
    浏览(48)
  • Unity 报错之 打包安卓闪退 Could not allocate memory: System out of memory

    更换机器打包,打包机器上没有开发使用的Unity版本,所以更换了Unity2019.4.8f1版本进行导出安卓工程,在安卓工程中打包出现闪退问题。 Unity: Could not allocate memory: System out of memory! Trying to allocate: 4227858432B with 16 alignment. MemoryLabel: DynamicArray Allocation happened at: Line:78 in Memory overv

    2024年02月13日
    浏览(53)
  • Pycharm报错torch.cuda.OutOfMemoryError: CUDA out of memory.

    报错 做深度学习相关的实验,可以看到我的显卡内存很小(哭了,不过我有时候是在别的电脑上做的,那个电脑比这个好用),网上搜到的说的 max_split_size_mb:128 这个方法我贴到我代码上之后没有效果。 因为我在这个电脑上做的是主实验后面的一些对比实验,也就是代码中很

    2024年02月05日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包