隔离 cpu 和内存资源

1 创建 Slice​ 单元文件

创建一个名为 flow.slice​ 的文件,路径为 /etc/systemd/system/​:

收起

bash

sudo mkdir -p /etc/systemd/system/flow.slice.d
sudo vi /etc/systemd/system/flow.slice.d/flow-resource.conf

1.2 编辑 Slice​ 单元文件

在文件中添加以下内容:

收起

ini

[Unit]
Description=Slice for flow
Before=slices.target

[Slice]
CPUQuota=300%
MemoryMax=6.5G
  • CPUQuota=75%​:限制该 Slice​ 内的进程最多使用 75% 的 CPU 资源。
  • MemoryMax=7G​:限制该 Slice​ 内的进程最多使用 7GB 的内存。

2.3 保存并退出文件

Ctrl + X​,然后按 Y​ 确认保存,最后按 Enter​ 退出 nano​ 编辑器。

2. 重新加载 systemd​ 管理器配置

修改配置文件后,需要重新加载 systemd​ 管理器的配置,使新的 Slice​ 单元生效:

收起

bash

sudo systemctl daemon-reload
sudo systemctl restart flow.slice
sudo systemctl status flow.slice

3. click 用户的会话关联到新的 Slice

为了确保 jack​ 用户的所有进程都受到资源限制,需要将其会话关联到 user-jack.slice​。可以通过修改 systemd​ 的用户配置文件来实现。

3.1 创建或编辑 systemd 用户配置文件

创建或编辑 /etc/systemd/system/user@.service.d/override.conf 文件:

bash

sudo mkdir -p /etc/systemd/system/user@.service.d
sudo vi /etc/systemd/system/user@.service.d/override.conf

3.2 添加配置内容

在文件中添加以下内容:

收起

ini

[Service]
Slice=click.slice

这将把所有用户会话关联到 click.slice

3.3 配置 PAM(失败)
sudo yum install systemd-pam -y
  1. 编辑 PAM 配置文件
    打开 /etc/pam.d/sshd​ 文件:
sudo vi /etc/pam.d/sshd

在文件中找到包含 pam_systemd.so​ 的行(通常在 session​ 类型的模块中),如果没有则添加。并通过 slice=​ 参数指定 flow.slice​,示例如下:

报错:无效参数:slice=flow.slice

session    required     pam_systemd.so slice=flow.slice 

这行配置表示在用户 SSH 登录建立会话时,使用 pam_systemd.so模块,并且将会话关联到 flow.slice​。

  1. 保存并退出文件
    Ctrl + X​,再按 Y​ 确认保存,最后按 Enter​ 退出编辑器。
  2. 重新加载 SSH 服务
sudo systemctl reload sshd
  1. 检查启动日志
sudo journalctl -xe | grep pam_systemd

4. 重新加载 systemd​ 管理器配置并重启用户会话

再次重新加载 systemd​ 管理器的配置:

收起

bash

sudo systemctl daemon-reload
sudo systemctl restart flow.slice
sudo systemctl status flow.slice

然后重启 flow​ 用户的会话,使配置生效:

收起

bash

sudo loginctl terminate-user flow
sudo systemctl status flow.slice

之后,当 flow​ 用户登录时,其进程将受到之前设置的资源限制。

5. 验证配置

你可以使用 systemd-cgtop​ 命令来查看资源使用情况,确认 jack​ 用户的进程是否受到了限制:

收起

bash

sudo systemd-cgtop

sudo systemd-cgls

通过以上步骤,你就可以确保 jack​ 用户的进程最多只能使用 75% 的 CPU 和 7GB 的内存,从而为系统保留一部分资源,避免因应用程序高负载导致系统崩溃

检查当前会话关联的 slice

loginctl show-user $(id -un) -p Sessions --value | tr ' ' '\n' | xargs -I {} systemctl status session-{}.scope

cpu 压力测试

yum install stress -y

systemd-run --slice=flow.slice --scope stress --cpu 4 --vm 1 --vm-bytes 300M --timeout 120s

/etc/pam.d/login
session    required   pam_systemd.so slice=click-user.slice if_user=flow

/etc/pam.d/sshd
session    required   pam_systemd.so slice=click-user.slice if_user=flow




  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    954 引用 • 944 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...