小编jur*_*rez的帖子

Linux 在内存不足时挂起

当我的机器内存不足时,我会出现意外行为。

我有一个带有 32GB RAM 的 Intel i7-6700,我正在运行带有 vanilla 4.14.8 内核的 Arch Linux。我在 SSD 磁盘上的加密 LVM 卷上有一个 32GB 交换。

在正常操作期间,我运行几个 QEMU/KVM 来宾以及其他东西(XFCE、Firefox 等)。正常的内存使用率约为 20-30%,几乎没有交换。

但是当我运行一些内存密集型的东西(例如7za a -md=29压缩一个大文件)时,当内存使用率达到 100% 时系统挂起/冻结。键盘和鼠标完全停止响应,显示冻结,磁盘活动停止,与机器的任何 TCP 连接在 SYN 阶段挂起。从这种情况中恢复的唯一方法是重启机器。

在挂起之前的那一刻,可以看到几乎没有使用交换空间。当然,swap 是启用的,我没有使用任何与内存相关的特定 sysctl 设置(特别是,我的 vm.swappiness 的默认值为 60)。

我不明白的是:

  • 为什么内核不使用交换空间?
  • 为什么当内存耗尽时 oom-killer 不会启动?

我不是内核专家,但据我所知,系统不应该在内存不足时冻结/挂起。我希望看到的是:

  • 当有可用的交换空间时,在内存和交换都被消耗(在我的情况下,64G)之前,不应杀死任何进程。
  • 即使没有交换,oom-killer 也应该7za在内存耗尽时杀死
  • 即使没有上述两种情况,任何尝试分配比可用内存更多的内存的进程都应该出错并正常失败。

所以实际上有 3 个独立的机制来防止内存耗尽,但它们似乎都失败了。我意识到可能有一些我不知道的微妙问题(即来宾 VM 中的内存膨胀、锁定的内存等),但我真的想不出任何可以解释我所看到的行为的东西。

有人可以解释这里发生了什么以及为什么?我只是错过了什么吗?我可以做些什么来确定性地防止挂起吗?

编辑:

我进行了一些差异测试,我发现:

  • LVM 卷上的加密交换 => 机器冻结。
  • 分区上的加密交换 => 一切正常(交换按预期使用,机器不会冻结)。

问题似乎与 LVM 有某种关系。我在这两种情况下都使用了相同的物理分区,因此它也与磁盘无关。在测试期间,我将 vm.swappiness 保留为 60(默认)。

顺便提一下 - 在一个特定的测试中,我注意到在 htop 中,就在机器冻结之前,交换栏中出现了一个“缺口”。所以内核实际上开始使用swap,但它只持续了大约3秒。

这个问题应该很容易重现。 …

memory linux freeze swap

6
推荐指数
1
解决办法
1406
查看次数

Linux 如何确定桥接设备的默认 MAC 地址?

Linux 如何确定桥接设备的默认 MAC 地址?我知道它与 中的“bridge id”相同brctl show,但它是如何计算的?当网络接口添加到网桥时,MAC 地址是否应该自动更改?

linux bridge

5
推荐指数
1
解决办法
6810
查看次数

标签 统计

linux ×2

bridge ×1

freeze ×1

memory ×1

swap ×1