有没有办法限制 Unix 中特定进程可以使用的内存量?

有没有办法限制 Unix 中特定进程可以使用的内存量?

我需要测试内存管理进程。

  • 我没有源代码,所以我需要从操作系统端进行所有测试。
  • 我希望能够说类似的话limitmemory 400k -p <pid>

在unix下有没有办法做到这一点?任何常见的 UNIX 实用程序都会很棒。

答案1

ulimit -v,它是一个内置的 shell,但它应该做你想做的事。

我有时在初始化脚本中使用它:

ulimit -v 128k
command
ulimit -v unlimited

然而,您似乎想要在程序运行时操纵最大可分配内存的方法,对吗?可能类似于renice操纵优先级。

然而,据我所知,还没有这样的工具。

答案2

在内核 >=2.6.36 且 util-linux >=2.21 的 Linux 系统上,您可以使用限制设置进程资源限制的命令:

prlimit --as=400000 --pid <pid>

这会将进程可以使用的最大虚拟内存量限制为 400000。您可以在 中找到可以为给定进程限制的资源的完整列表man 2 prlimit

正如注释和手册页中所述,限制 RSS 的数量在 >2.4.0 和 <2.4.30 的内核中不起作用。

答案3

在 Linux 系统上,您可以使用以下位置的内存控制器:对照组 版本1或者版本 2

系统使之变得容易控制资源使用,尤其是在具有 cgroups-v2 的系统上:

MemoryHigh=bytes

  指定本单元中已执行进程的内存使用限制。如果不可避免,内存使用量可能会超过限制,但在这种情况下,进程会严重减慢,并且内存会被大量占用。这是控制单元内存使用的主要机制。 […]

MemoryMax=bytes

  指定该单元中执行的进程的内存使用的绝对限制。如果内存使用量无法控制在限制以下,则会在单元内部调用内存不足杀手。建议MemoryHigh=作为主要控制机制使用,并MemoryMax=作为最后一道防线使用。 […]

MemoryLimit=bytes

  指定执行进程的最大内存使用限制。[…]

  此设置已弃用。代替使用MemoryMax=

如果您不想创建和自定义完整的服务,而只想运行临时命令,那么您可以使用系统运行用户建议的实用程序嗨天使:

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

--scope

  创建一个瞬态.scope单元而不是默认的瞬态.service单元(见上文)。

--property=,-p

  设置所创建的范围或服务单元的属性。该选项采用与 systemctl(1) 相同格式的赋值设置属性命令。

答案4

如果您使用 systemd,则可以在文件中设置一些附加选项.service。您可以设置的选项的完整列表在这里描述

下面是一个简短的示例,展示了如何使用 systemd 的此功能:

# cat /etc/systemd/system/qbittorrent-nox.service
[Unit]
Description=qbittorrent-nox
Documentation=man:qbittorrent-nox
DefaultDependencies=yes
Requires=media-Kabi.mount
After=media-Kabi.mount network-online.target
Before=multi-user.target
Conflicts=umount.target

[Service]
User=morfik
Group=p2p
Type= simple
RemainAfterExit=no
ExecStart=/usr/bin/qbittorrent-nox
Nice=19
IOSchedulingClass=idle
PrivateNetwork=no
CPUShares=256
MemoryLimit=50M
BlockIOWeight=128
Slice=p2p.slice
StandardError=null
StandardOutput=null

[Install]
WantedBy=multi-user.target

当然,您不需要我使用的所有选项。如果您只想限制内存使用,请添加MemoryLimit=50M,限制为 50MiB。

这是结果:

# systemctl status qbittorrent-nox.service
● qbittorrent-nox.service - qbittorrent-nox
   Loaded: loaded (/etc/systemd/system/qbittorrent-nox.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2015-05-07 19:25:20 CEST; 1s ago
     Docs: man:qbittorrent-nox
 Main PID: 21712 (qbittorrent-nox)
   Memory: 9.4M (limit: 50.0M)
   CGroup: /p2p.slice/qbittorrent-nox.service
           └─21712 /usr/bin/qbittorrent-nox

May 07 19:25:20 morfikownia systemd[1]: Started qbittorrent-nox.
May 07 19:25:20 morfikownia systemd[1]: Starting qbittorrent-nox...

到目前为止,这仅适用于系统守护进程/服务,并且您不能以这种方式限制例如 Firefox 作为普通用户的进程。但也许这有一天会改变

相关内容