systemd 中的内存限制

sbl*_*din 4 systemd celery

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

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

我在这里读到,您可以使用MemoryHighMemoryMax选项控制 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
Run Code Online (Sandbox Code Playgroud)

Mic*_*ton 5

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

如果您希望服务在使用特定内存量时终止,则MemoryHigh=根本不指定,仅指定MemoryMax=.

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