AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 490978
Accepted
Sergey
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 1 个回答
  • 927 Views

1 个回答

  • Voted
  1. 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)具有稍大的限制是一个好主意。这样,您将始终拥有可用于系统守护程序的资源。

    • 4

相关问题

  • Linux 内核中的 cpuset cgroup 继承语义“坏了”什么?

  • 计算一段时间内 cgroup 的 CPU 使用率

  • 卸载软件的 cgroup 文件

  • 如何检查我的 Linux 主机上是否有 cgroup 可用?

  • cgroup 内存使用值多久刷新一次?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve