`--oom-kill-disable` 对 Docker 容器有什么作用?

2023-12-25

我已经明白了docker run -m 256m --memory-swap 256m将限制容器,使其最多可以使用 256 MB 内存且无交换区。如果它分配更多,那么容器中的进程(不是“容器”)将被杀死。例如:

$ sudo docker run -it --rm -m 256m --memory-swap 256m \
        stress --vm 1 --vm-bytes 2000M --vm-hang 0
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [1] (415) <-- worker 7 got signal 9
stress: WARN: [1] (417) now reaping child worker processes
stress: FAIL: [1] (421) kill error: No such process
stress: FAIL: [1] (451) failed run completed in 1s

显然,其中一个工作人员分配的内存超出了允许的范围,并收到了SIGKILL。请注意,父进程保持活动状态。

现在如果效果-m是如果进程分配了太多内存,则调用 OOM 杀手,那么当指定时会发生什么-m and --oom-kill-disable?像上面一样尝试会得到以下结果:

$ sudo docker run -it --rm -m 256m --memory-swap 256m --oom-kill-disable \
        stress --vm 1 --vm-bytes 2000M --vm-hang 0
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
(waits here)

在不同的外壳中:

$ docker stats
CONTAINER           CPU %               MEM USAGE / LIMIT       MEM %               NET I/O             BLOCK I/O           PIDS
f5e4c30d75c9        0.00%               256 MiB / 256 MiB       100.00%             0 B / 508 B         0 B / 0 B           2


$ top
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                           
19391 root      20   0 2055904 262352    340 D   0.0  0.1   0:00.05 stress

我看到docker stats显示内存消耗为 256 MB,并且top显示了一个RES256 MB 和VIRT2000 MB。但是,这实际上意味着什么?如果容器内的进程尝试使用超过允许的内存,会发生什么情况?从什么意义上说它受到限制-m?


我认为the docs https://docs.docker.com/engine/reference/run/#user-memory-constraints --oom-kill-disable不受限制-m但实际上需要它:

默认情况下,如果内存不足,内核会终止容器中的进程 发生(OOM)错误。要更改此行为,请使用 --oom-kill-禁用选项。仅在您还设置了 -m/--memory 选项的容器上禁用 OOM Killer。如果 -m 标志不是 设置,这可能会导致主机内存不足并需要 杀死主机的系统进程以释放内存。

一位开发商表示早在2015年 https://github.com/moby/moby/issues/14440#issuecomment-119243820 that

无论是否设置 -m 标志,主机都可能会耗尽内存。但 这也是无关紧要的,因为 --oom-kill-disable 不执行任何操作,除非 -m 是 通过了。

关于您的更新,当发生什么情况时OOM-killer已禁用,但已达到内存限制(有趣的房间文章 https://www.kernel.org/doc/gorman/html/understand/understand016.html),我说新的电话malloc这样就会像描述的那样失败here https://stackoverflow.com/a/35791623/7926064但这也取决于交换配置和主机可用内存。如果你的-m限制高于实际可用内存,主机将开始终止进程​​,其中之一可能是 docker 守护进程(他们试图通过以下方式避免)更改其 OOM 优先级 https://docs.docker.com/config/containers/resource_constraints/#understand-the-risks-of-running-out-of-memory).

The 内核文档 https://lwn.net/Articles/432224/ (cgroup/memory.txt) say

如果禁用 OOM-killer,cgroup 下的任务将挂起/休眠 内存 cgroup 请求可用内存时的 OOM-waitqueue

对于 cgroup 的实际实现(docker 也使用它),您必须检查源代码 https://github.com/torvalds/linux/tree/master/kernel/cgroup.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`--oom-kill-disable` 对 Docker 容器有什么作用? 的相关文章

随机推荐

  • 将 python Webserver 作为 Windows 服务运行

    我有服务器和控制台scripts http svn python org projects python trunk Lib CGIHTTPServer py它继续监听端口上的控制台和服务器请求 在 UNIX 环境中 我将服务器和控制台脚本
  • 在脚本中使用临时函数或过程

    我在用SQL Server 2012 我有一个脚本 通过它我可以将值插入到表中 在该脚本中我必须转换某些值的格式DateTime基于两个参数的变量 我可以使用CASE or if条件在sql 我不被允许做任何Function or proc
  • 如何在卡片操作中单击时调用特定回调 - Bot Framework

    我展示了一个带有一些产品的轮播 每个产品都有一个带有代码的按钮 卡片操作类型为 ImBack 但一旦通过 postAsync 方法显示轮播 单击按钮将再次调用根对话框 有没有办法定义按钮单击的回调或显示相同的轮播但使用 PromptDial
  • Windows Vista 中的安装文件名

    我在这篇文章中读到 http technet microsoft com en us library cc709628 aspx http technet microsoft com en us library cc709628 aspx
  • QTableView:当用户使用鼠标单击特定单元格时如何获取数据

    其实我是Qt新手 无法匹配QMouseEvent with QTableview 请帮助解决这个问题 下面是一个示例 说明如何在单击表格单元格时获取该单元格的文本 假设一个QTableView定义在一些MyClass班级 你需要connec
  • 如何使用 Bower 安装 Bootstrap v4 alpha? [复制]

    这个问题在这里已经有答案了 The v4 alpha 文档 http v4 alpha getbootstrap com getting started download states Bootstrap v4 0 0 alpha 可以通过
  • 如何运行将数据加载到其他项目 BigQuery Table 的云编辑器任务

    我在项目 A 下创建了云编辑器环境 我想将数据加载到其他项目 B BigQuery 表中 我知道任务 GCSToBigQueryOperator 但它没有成功 它失败了 我想知道如何实现这一点 我想从项目 A 运行一个将数据加载到项目 B
  • 滚动到 angular2 时动画进入视图

    我找到了一个库 用于在滚动到 aos https github com michalsnik aos 但它似乎没有任何 angular2 绑定可供使用 有谁知道如何在 Angular2 中完成类似的事情 或者至少配置 aos 在 Angul
  • 如何在iPhone中创建应用程序包?

    我使用 XCode 制作了一个小型应用程序 我如何创建一个应用程序包以将其安装在 iPhone 中 谁能帮我解决这个问题 提前致谢 是的 如上所述 您需要支付 99 美元的开发者费用 完成此操作后 您可以通过 XCode 直接部署到使用配置
  • PHP 中的数组打乱顺序

    我有以下代码 输出如下 域名 com image1 jpg 域名 com image2 jpg 域名 com image3 jpg 我正在尝试随机化输出的顺序 在 foreach 语句之前 我尝试使用 shuffle bb 对数组进行洗牌
  • 创建与 DetailView 相反的视图

    上传图像后 我试图从 CreateView 反转到 DetailView 我收到同样的消息 NoReverseMatch 位于 photo image add 未找到带有参数 和关键字参数 pk 50 的 image view 的反向操作
  • SailsJS Waterline 与 Bluebird Promises

    使用 Waterline ORM 时 如果我想使用默认提供的 bluebird Promise api 如何将处理传递回控制器 下面是代码 module exports Authenticate auth function req res
  • 如何衡量两个数据的相似度

    我正在测量两个大小相同的数据的相似度为20 即 A 0 915450999999999 0 908220499999997 0 900374999999996 0 890547499999996 0 880455499999997 0 86
  • 如何让 Firestore 索引合并发挥作用?

    我在使用 firestore 索引合并来减少所需索引的数量时遇到问题 考虑这个示例情况 Firestore 集合 测试 somedoc a 1 b 1 c 1 d 1 这将导致 Firestore 在测试时为字段 a 到 d 创建 4 个自
  • scala.js 与 jscala 有什么区别?

    有两个工具可以直接在 JavaScript 中编译 Scala 代码 Scala js http www scala js org and JScala https github com nau jscala 它们看起来都很棒 并且可以使用
  • issubclass 的用法

    gt gt gt import sys gt gt gt sys version info 2 4 4 final 0 gt gt gt class C pass gt gt gt issubclass C C True gt gt gt
  • 处理 Akka actor 中的错误

    我有一个非常简单的例子 我有一个演员 SimpleActor 通过向自身发送消息来执行周期性任务 该消息在参与者的构造函数中安排 在正常情况下 即没有故障 一切正常 但如果 Actor 必须处理错误怎么办 我还有另一个演员 SimpleAc
  • 捕获 C++ CLI 应用程序中登录的异常

    我试图捕获 C CLI 应用程序中的所有异常 以便我可以记录它们 包括堆栈跟踪 到目前为止 我有一些看起来很有希望的代码 STAThreadAttribute int main array
  • 使用 cffi-libffi 按值传递结构?

    我的印象是 CFFI 无法按值传递结构 但 CFFI 文档说 要将结构按值传递或返回给函数 请加载 cffi libffi 系统并将结构指定为 struct structure name 要传递或返回指针 您可以使用 pointer or
  • `--oom-kill-disable` 对 Docker 容器有什么作用?

    我已经明白了docker run m 256m memory swap 256m将限制容器 使其最多可以使用 256 MB 内存且无交换区 如果它分配更多 那么容器中的进程 不是 容器 将被杀死 例如 sudo docker run it