systemd 中的内存限制

systemd 中的内存限制

我正在使用 systemd 在 Ubuntu 18.04 LTS 服务器上运行 Celery(一个 python 分布式任务调度程序)。

我必须安排大部分长时间运行的任务(执行需要几分钟),根据数据的不同,这些任务最终可能会消耗大量 RAM。我想采取某种安全措施来控制内存使用量。

我读过了这里MemoryHigh你可以使用和MemoryMax选项控制 systemd 服务使用的 RAM 量

我已经在我的 Celery 服务设置中使用了这些选项,并且我观察了当 Celery 服务达到给定的限制时会发生什么htop

服务停止执行并处于“D”状态,但停留在该状态并且分配的内存不会被释放。

systemd 是否可以终止占用内存的进程?

更新

正如下面的评论所建议的,我已经尝试了一些诊断,并且我将添加其他问题的详细信息。

Linux 服务器在 Virtual Box 托管的开发虚拟机上运行,​​仅运行消耗资源的任务。

MemoryMax设置以百分比(35%)表示。

下图中你可以看到htop中的进程状态

htop 暂停进程

正如在回答中建议的那样问题,以下是暂停进程堆栈的内容。

[<0>] __lock_page_or_retry+0x19b/0x2e0
[<0>] do_swap_page+0x5b4/0x960
[<0>] __handle_mm_fault+0x7a3/0x1290
[<0>] handle_mm_fault+0xb1/0x210
[<0>] __do_page_fault+0x281/0x4b0
[<0>] do_page_fault+0x2e/0xe0
[<0>] page_fault+0x45/0x50
[<0>] 0xffffffffffffffff

答案1

如果进程达到 ,则应该已被终止MemoryMax=。但如果超过 ,MemoryHigh=则可能会以您描述的方式暂停。问题是,如果达到 ,MemoryHigh=则可能永远不会达到MemoryMax=。如果进程实际上没有释放内存,那么它将永远处于暂停状态。

如果您希望服务在使用特定数量的内存时终止,则根本不要指定MemoryHigh=,只需指定MemoryMax=

最终,您的开发人员应该找到并解决应用程序中的内存泄漏。

相关内容