如何在Linux中限制应用程序的内存使用量?

如何在Linux中限制应用程序的内存使用量?

我有一个闭源软件,存在一些内存泄漏问题。是否有一个工具或解决方案可以在不使用“ulimit”的情况下在固定内存量中“沙盒化”进程(一般来说,我需要每个应用程序的内存控制)

答案1

在基于 systemd 的发行版上,你也可以使用 systemd-run(间接使用 cgroups)。 例如:

systemd-run --scope -p MemoryLimit=1G firefox

注意:这将要求您输入密码,但应用程序将以您的用户身份启动。不要让这误导您认为该命令需要使用 运行sudo,因为这会导致命令在 root 下运行,而这几乎不是您的本意。

如果你不想输入密码(确实,为什么你需要密码来限制你已经拥有的内存),您可以使用--user选项,但要使其工作,您需要启用 cgroupsv2 支持,目前需要使用systemd.unified_cgroup_hierarchy内核参数启动

答案2

'ulimit' 是针对每个应用程序的控制……实际上是针对每个进程。ulimit shell 命令是 shell 内置命令,用于设置 shell 进程及其子进程的限制。将 'ulimit' 命令放入启动应用程序的脚本中,将仅为此应用程序设置限制。

答案3

您可以使用进程管理守护程序monit来监视进程使用的内存量,并在内存量超过定义的限制时重新启动它。

这听起来确实很激烈,但考虑到你的应用程序已知存在泄漏,当进程大小变得大于机器物理内存或操作系统施加的任何地址空间限制中的较小者时,根据其使用情况定期重新启动它只是推迟了不可避免的事情。

答案4

使用 cgroups。 https://man7.org/linux/man-pages/man7/cgroups.7.html

memory.limit_in_bytes注意和之间的区别memory.memsw.limit_in_bytes。还请注意memory.soft_limit_in_bytes

Further information can be found in the kernel source file
Documentation/admin-guide/cgroup-v1/memory.rst (or
Documentation/cgroup-v1/memory.txt in Linux 5.2 and
earlier).

相关内容