Sergey Asked: 2018-12-27 04:38:33 +0800 CST2018-12-27 04:38:33 +0800 CST 2018-12-27 04:38:33 +0800 CST 限制所有 X 应用程序的 CPU 和内存消耗 772 我想保留少量的 cpu 和内存,以便在紧急情况下能够创建 tty 会话并终止占用内存的 X 应用程序。cgroups提供了这个功能。如何自动将我所有的 X 应用程序放入 cgroup 中? cgroups x 1 个回答 Voted Best Answer Sergey 2019-10-19T12:12:32+08:002019-10-19T12:12:32+08:00 我使用的是 Debian,所以解决方案是基于systemdcgroup 实现的。 第一步是检查 cgroups 层次结构: > systemd-cgls -.slice ├─user.slice │ └─user-1000.slice │ ├─[email protected] ..... │ └─session-2.scope │ ├─1376 lightdm --session-child 14 21 │ ├─1400 x-window-manager ..... systemd自动将 cgroups 分配给终端会话。在 cgroup 层次结构中,我们需要确定其中session-*.scope有 X 应用程序。默认 X 会话范围号始终相同。 要为范围内的所有程序设置内存限制,请键入 > systemctl set-property session-2.scope MemoryLimit=14G 此命令将内存限制设置为会话 2,直到重新启动。 要使此规则永久生效,请运行 > sudo systemctl edit session-2.scope 在文本编辑器类型中 [Scope] MemoryLimit=14G 并保存。此规则将在重新启动之间保持不变。其他资源限制可以在同一个文件中设置。 编辑 正如 derobert 所指出的,X 会话范围号不保证相同。更强大的解决方案是在运行时确定这个数字。 文件/usr/local/bin/resource_limit.sh: #!/bin/bash for s in $(systemd-cgls --no-pager --user-unit \ | grep --extended-regexp --only-matching \ 'session-.{1,3}\.scope');do systemctl set-property --runtime "$s" MemoryLimit="$1" done 文件/etc/systemd/system/resource_limit.service: [Unit] Description=Limit resources Requires=multi-user.target After=multi-user.target [Service] Type=oneshot ExecStartPre=/bin/sleep 5 ExecStart=/usr/local/bin/resource_limit.sh 14G ExecStop=/usr/local/bin/resource_limit.sh 20G RemainAfterExit=true [Install] WantedBy=graphical.target 将上面的文件复制到您的系统并发出命令 systemctl daemon-reload 在此之后,您可以使用命令设置指定的限制(在本例中为 14G) systemctl start resource_limit.service 并使用命令取消设置(设置一些更高的限值) systemctl stop resource_limit.service 为了在重新启动时自动运行此脚本,请发出命令 systemctl enable resource_limit.service 注1 如果您的 X 会话启动速度不够快,您可能需要通过ExecStartPre手动启用服务来增加服务延迟。 笔记2 将限制添加到[email protected](其中 1000 - 是一个 UID)具有稍大的限制是一个好主意。这样,您将始终拥有可用于系统守护程序的资源。
我使用的是 Debian,所以解决方案是基于
systemd
cgroup 实现的。第一步是检查 cgroups 层次结构:
systemd
自动将 cgroups 分配给终端会话。在 cgroup 层次结构中,我们需要确定其中session-*.scope
有 X 应用程序。默认 X 会话范围号始终相同。要为范围内的所有程序设置内存限制,请键入
此命令将内存限制设置为会话 2,直到重新启动。
要使此规则永久生效,请运行
在文本编辑器类型中
并保存。此规则将在重新启动之间保持不变。其他资源限制可以在同一个文件中设置。
编辑
正如 derobert 所指出的,X 会话范围号不保证相同。更强大的解决方案是在运行时确定这个数字。
文件
/usr/local/bin/resource_limit.sh
:文件
/etc/systemd/system/resource_limit.service
:将上面的文件复制到您的系统并发出命令
在此之后,您可以使用命令设置指定的限制(在本例中为 14G)
并使用命令取消设置(设置一些更高的限值)
为了在重新启动时自动运行此脚本,请发出命令
注1
如果您的 X 会话启动速度不够快,您可能需要通过
ExecStartPre
手动启用服务来增加服务延迟。笔记2
将限制添加到
[email protected]
(其中 1000 - 是一个 UID)具有稍大的限制是一个好主意。这样,您将始终拥有可用于系统守护程序的资源。