这个答案根据 的值解释了当遇到 OOM 情况时内核采取的行动sysctl vm.overcommit_memory。
当overcommit_memory设置为0或1,overcommit启用,并计划允许分配更多的内存比实际可用。
现在当我们在这种情况下内存不足时会发生什么?OOM 杀手如何决定先杀死哪个进程?
我在家里的 3 台计算机上安装了 Linux Mint,当打开 Firefox 时,它们几乎都慢得无法使用。这是top的输出:
正如您所看到的,“Web Content”和 Firefox 一起占用了我几乎所有的 CPU,以及超过 50% (4GB+) 的系统内存。
过去我在 Debian 或 Ubuntu 上从来没有遇到过这个问题,但到目前为止,它在我安装 Mint 的每台计算机上都发生过。这种极高(接近总数)的 CPU/内存使用率是恒定的,并且导致我的计算机无法使用。
有没有人有关于如何解决这个问题的想法?如果没有修复,我怎样才能让这个“Web 内容”应用程序根本不运行?
我的消息日志中抛出了以下报告:
kernel: Out of memory: Kill process 9163 (mysqld) score 511 or sacrifice child
kernel: Killed process 9163, UID 27, (mysqld) total-vm:2457368kB, anon-rss:816780kB, file-rss:4kB
Run Code Online (Sandbox Code Playgroud)
如果这个问题是针对 的并不重要httpd,mysqld或者postfix我很好奇如何继续调试问题。
我怎样才能获得更多关于为什么 PID 9163 被杀死的信息,我不确定 linux 是否在某处保留终止的 PID 的历史记录。
如果您的消息日志文件中出现这种情况,您将如何逐步解决此问题?
# free -m
total used free shared buffers cached
Mem: 1655 934 721 0 10 52
-/+ buffers/cache: 871 784
Swap: 109 6 103`
Run Code Online (Sandbox Code Playgroud) 多年来,我的操作系统的OOM 杀手无法正常工作并导致系统冻结。
当内存使用率非常高时,整个系统往往会“冻结”(实际上:变得非常慢)几个小时甚至几天,而不是杀死进程来释放内存。
我记录的最长期限是在辞职以进行重置之前的 7 天。
当即将达到 OOM 时,iowait非常非常高(~ 70%),然后变得不可测量。
该工具:iotop表明每个程序都以非常高的吞吐量(每几十 MB/秒)从我的硬盘驱动器中读取。
那些程序在读什么?
- 目录层次结构?
- 可执行代码本身?
我现在不知道。
[已编辑] 在我写这条消息时(2017 年),我使用的是最新的 ArchLinux (4.9.27-1-lts),但几年前就已经遇到了这个问题。
我在各种 Linux 发行版和不同的硬件配置中遇到过同样的问题。
目前(2019 年),我使用的是最新的 Debian 9.6 (4.9.0) 我有16 GB的物理内存,一个安装了我的操作系统的 SSD,而不是任何交换分区。
由于我拥有的 ram 数量,我不想启用交换分区,因为它只会延迟问题的出现。
此外,由于 SSD 交换过于频繁,可能会缩短磁盘的使用寿命。
顺便说一下,我已经尝试过使用和不使用交换分区,事实证明它只会延迟问题的出现,而不是解决方案。
对我来说,问题是由于 Linux 从缓存中删除了重要数据,这导致系统冻结,因为它每次都必须从硬盘驱动器读取所有内容。
我什至想知道 Linux 是否不会删除正在运行的程序的可执行代码页,这可以解释为什么通常不读取大量数据的程序在这种情况下会这样做。
我已经尝试了几件事,希望能解决这个问题。
一种是设置/proc/sys/vm/min_free_kbytes为1000000(1 GB)。
因为这1 GB应该是空闲的,所以我认为这块内存会被 Linux 保留来缓存重要数据。
但它没有奏效。
另外,我认为补充一点很有用,即使它在理论上听起来不错,但通过定义 …
我的计算机最近内存不足(在处理大型 GIS 数据集时编译软件的意外后果)。在详细说明它如何处理 OOM 条件的系统日志中,有以下行:
Out of memory: Kill process 7429 (java) score 259 or sacrifice child
Run Code Online (Sandbox Code Playgroud)
那是or sacrifice child关于什么的?肯定不是在考虑一些黑暗的仪式来让事情继续下去吗?
我有 500 万个文件,占用了大约 1TB 的存储空间。我需要将这些文件传输给第三方。
做到这一点的最佳方法是什么?我曾尝试使用 .tar.gz 减小大小,但即使我的计算机有 8GB 内存,我也会收到“系统内存不足”错误。
是蜗牛邮件文件的最佳解决方案吗?
使用单个或几个重要的系统服务守护进程运行一些 Linux 服务器,我想为这些守护进程调整 OOM 杀手,以防发生奇怪的事情。例如,今天一些运行 MySQL 的 Ubuntu 服务器杀死了一个 MySQL 守护进程,因为大量apt-checker进程正在消耗所有内存,内核认为杀死 MySQL 是个好主意。
我知道我可以使用该/proc/$(pidof mysqld)/oom_score_adj文件调整分数来为内核提供一些线索,我不希望 MySQL 被杀死,但这在服务重新启动后无法生存。我应该编辑包中的 init/upstart 脚本以包含这些调整吗?我认为这不是一个非常优雅的解决方案,因为我会对属于一个包的文件进行调整。是否可以在一般情况下连接到 upstart/init 脚本并有条件地调整它?或者你会建议运行一个不确定的脚本while true{ adjust_oom(); sleep 60;}吗?
httpd( Apache/2.2.29) 内存使用有一些问题。
随着时间的推移,httpd进程中的内存使用量会逐渐增加,直到最终达到 100%。
我上次重新启动httpd是在大约 24 小时前。输出free -m是:
[ec2-user@www ~]$ free -m
total used free shared buffers cached
Mem: 1655 1415 239 0 202 424
-/+ buffers/cache: 788 866
Swap: 1023 4 1019
Run Code Online (Sandbox Code Playgroud)
为了证明它肯定是httpd,我重新启动httpd并free -m再次运行:
[ec2-user@www ~]$ sudo service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
[ec2-user@www ~]$ free -m
total used free shared buffers cached
Mem: 1655 760 894 …Run Code Online (Sandbox Code Playgroud) 在我们的集群中,我们限制了我们的进程资源,例如内存 ( memory.limit_in_bytes)。
我认为,这最终也是通过 Linux 内核中的 OOM 杀手来处理的(通过阅读源代码看起来是这样)。
有没有办法在我的进程被杀死之前获得信号?(就像SGE 的-notify选项一样,它将在进程终止qsubSIGUSR1之前发送。)
我在/dev/mem_notify 这里读到,但我没有 - 现在还有别的东西吗?我也读过这似乎有些相关。
我希望能够至少转储一个小的堆栈跟踪和其他一些有用的调试信息 - 但也许我什至可以通过释放一些内存来恢复。
我目前使用的一种解决方法是这个小脚本,它经常检查我是否接近 (95%) 限制,如果是,它会向进程发送一个SIGUSR1. 在 Bash 中,我在后台 ( cgroup-mem-limit-watcher.py &) 中启动此脚本,以便它监视同一 cgroup 中的其他 proc,并在父 Bash 进程终止时自动退出。
https://dvdhrm.wordpress.com/2014/06/10/memfd_create2/
从理论上讲,您可以在
memfd_create()不引入新系统调用的情况下实现 [ ] 行为,如下所示:
int fd = open("/tmp", O_RDWR | O_TMPFILE | O_EXCL, S_IRWXU);
(注意,为了更方便地保证这里的 tmpfs,我们可以使用“ /dev/shm”代替“ /tmp”)。
因此,最重要的问题是为什么我们需要第三条路?
[...]
- 后备内存属于拥有文件的进程,不受挂载配额的限制。
^ 我认为这句话的第一部分不能依赖是正确的吗?
所述memfd_create()的代码被作为“的字面实施链接的文件居住在[α] TMPFS必须是内核内部”。跟踪代码,我理解它的不同之处在于不实施 LSM 检查,还创建了 memfds 来支持“密封”,正如博客文章继续解释的那样。但是,我非常怀疑memfds正在考虑不同的,以原则上TMPFILE。
具体来说,当OOM 杀手来敲门时,我认为它不会解释 memfds 持有的内存。这可能总计高达 50% 的 RAM - tmpfs的size= 选项的值。内核不会为内部 tmpfs 设置不同的值,因此它将使用默认大小 50%。
所以我认为我们通常可以预期拥有大型 memfd 但没有其他重要内存分配的进程不会被 OOM 杀死。那是对的吗?
out-of-memory ×10
memory ×4
linux ×3
linux-kernel ×3
apache-httpd ×1
arch-linux ×1
bugs ×1
cgroups ×1
compression ×1
cpu-usage ×1
daemon ×1
debian ×1
firefox ×1
kill ×1
limit ×1
linux-mint ×1
logs ×1
resources ×1
tar ×1