jur*_*rez 6 memory linux freeze swap
当我的机器内存不足时,我会出现意外行为。
我有一个带有 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)。
我不明白的是:
我不是内核专家,但据我所知,系统不应该在内存不足时冻结/挂起。我希望看到的是:
7za在内存耗尽时杀死所以实际上有 3 个独立的机制来防止内存耗尽,但它们似乎都失败了。我意识到可能有一些我不知道的微妙问题(即来宾 VM 中的内存膨胀、锁定的内存等),但我真的想不出任何可以解释我所看到的行为的东西。
有人可以解释这里发生了什么以及为什么?我只是错过了什么吗?我可以做些什么来确定性地防止挂起吗?
编辑:
我进行了一些差异测试,我发现:
问题似乎与 LVM 有某种关系。我在这两种情况下都使用了相同的物理分区,因此它也与磁盘无关。在测试期间,我将 vm.swappiness 保留为 60(默认)。
顺便提一下 - 在一个特定的测试中,我注意到在 htop 中,就在机器冻结之前,交换栏中出现了一个“缺口”。所以内核实际上开始使用swap,但它只持续了大约3秒。
这个问题应该很容易重现。
更新:
对于跟进此事的任何人,我确定问题特定于在 LVM 上使用交换空间(加密与否)。这是在 4.x 内核上测试的,我无法通过调整 sysctl 参数来避免这种挂起。我目前没有关于 5.x 的信息。对我来说,这似乎是一个内核错误。
小智 1
我见过类似的结果发生——但问题不在于缺乏记忆;而在于缺乏记忆。该进程会占用根分区/卷中的空间。
例如,通常这可能是对 /tmp 或 / 中的其他文件系统的过度写入。内核将尽可能地交换所有内容(虽然不多),以便将未写入的内存存储在 RAM 缓冲区中。很快这就会失败,一切都会停止。
通常,您会收到发出的警告消息 - 但对于特别贪婪存储的进程,您可能不会看到它们。
| 归档时间: |
|
| 查看次数: |
1406 次 |
| 最近记录: |