我需要测试内存管理进程。
- 我没有源代码,所以我需要从操作系统端进行所有测试。
- 我希望能够说类似的话
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=
作为主要控制机制使用,并MemoryMax=
作为最后一道防线使用。 […]指定执行进程的最大内存使用限制。[…]
此设置已弃用。代替使用
MemoryMax=
。
如果您不想创建和自定义完整的服务,而只想运行临时命令,那么您可以使用系统运行用户建议的实用程序嗨天使:
systemd-run --scope -p MemoryMax=1G firefox
创建一个瞬态
.scope
单元而不是默认的瞬态.service
单元(见上文)。设置所创建的范围或服务单元的属性。该选项采用与 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 作为普通用户的进程。但也许这有一天会改变。