Limit User Resource on Login Node

如何在登录节点限制用户资源

HPC集群是一个多用户的操作环境。通常情况下,所有用户通过登录节点向调度器申请资源并运行作业。

但由于登录节点本身不处在调度器控制之下,当出现一些不规范的操作,例如长时间使用多核编译、在登陆节点运行MPI程序等,会导致占用大量的CPU、带宽和内存资源,进而影响其他用户正常使用HPC集群。

本文通过介绍一些Linux系统本身的特性,帮助HPC集群管理员了解如何在登录节点通过配置来限制用户可使用的资源。

适用操作系统及版本要求

统一限制所有用户的资源

假设需要限制每个登录用户只能使用100%的CPU资源 (如节点总核数为20,则总CPU资源为2000%) 1. 在文件夹/usr/lib/systemd/system/user-.slice.d下添加配置文件11-limit-cpu.conf

[Slice]
CPUQuota=100%
  1. 刷新配置
systemd daemon-reload
  1. 检查11-limit-cpu.conf是否已经载入
systemdl status user-0.slice
● user-0.slice - User Slice of UID 0
   Loaded: loaded
  Drop-In: /usr/lib/systemd/system/user-.slice.d
           └─10-defaults.conf, 11-limit-cpu.conf
   Active: active since Thu 2023-03-16 15:09:49 CST; 49min ago
    Tasks: 17 (limit: 23634)
   Memory: 156.7M
   CGroup: /user.slice/user-0.slice
           ├─session-1.scope
           │ ├─1310 sshd: root [priv]
           │ ├─1580 sshd: root@pts/0,pts/1,pts/5,pts/4
           │ ├─1581 -bash
           │ ├─2149 -bash
           │ ├─2458 ssh hpcadmin@localhost
           │ ├─2877 -bash
           │ ├─3012 man systemd.resource-control
           │ ├─3024 less
           │ ├─3175 -bash
           │ ├─3304 su - hpcadmin
           │ ├─3305 -bash
           │ ├─3466 man systemd.resource-control
           │ ├─3478 less
           │ ├─3723 systemctl status user-0.slice
           │ └─3724 less
           └─user@0.service
             └─init.scope
               ├─1564 /usr/lib/systemd/systemd --user
               └─1570 (sd-pam)

可以看到系统已经加载了11-limit-cpu.conf ## 限制特定用户的资源

假设hpcadminuid1000,需要限制hpcadmin只能使用400%CPU资源 1. 在文件夹/usr/lib/systemd/system/user-1000.slice.d下添加配置文件limit-cpu.conf

[Slice]
CPUQuota=400%
  1. 刷新配置
systemd daemon-reload
  1. 检查limit-cpu.conf是否已经载入
systemdl status user-1000.slice
● user-1000.slice - User Slice of UID 1000
   Loaded: loaded
  Drop-In: /usr/lib/systemd/system/user-.slice.d
           └─10-defaults.conf, 11-limit-cpu.conf
           /etc/systemd/system/user-1000.slice.d
           └─limit-cpu.conf
   Active: active since Thu 2023-03-16 16:32:11 CST; 5min ago
    Tasks: 5 (limit: 23634)
   Memory: 16.6M
   CGroup: /user.slice/user-1000.slice
           ├─session-3.scope
           │ ├─2085 sshd: hpcadmin [priv]
           │ ├─2105 sshd: hpcadmin@pts/2
           │ └─2106 -bash
           └─user@1000.service
             └─init.scope
               ├─2095 /usr/lib/systemd/systemd --user
               └─2097 (sd-pam)

常用配置项

配置项目可查询man systemd.resource-control * CPUQuota 指定CPU时间占用率,取一个百分比数值,后缀为%, 该百分比指, 相对于一个CPU上可用的总CPU时间,可以获得的最多CPU时间。该配置不会限制使用CPU核数,只能限制使用的总CPU时间。 * MemoryHigh 指定内存使用上限。如果不可避免,内存使用量可能会超过限制,但在这种情况下,进程会严重减慢,并且内存会被积极地占用。可以使用后缀KMGT作为单位。 * MemoryMax 指定内存使用的绝对限制。如果内存使用量无法包含在限制以下,则会在单元内调用内存不足终止程序。建议使用MemoryHigh=作为主要控制机制,并使用MemoryMax=作为最后一道防线。可以使用后缀KMGT作为单位。