计费和资源限制
目录
- 概述
- 基础设施
- Slurm JobComp 配置
- 构建前的 Slurm 计费配置
- 构建后的 Slurm 计费配置
- SlurmDBD 配置
- MySQL 配置
- SlurmDBD 归档和清除
- 工具
- 数据库配置
- 集群选项
- 账户选项
- 用户选项
- 限制执行
- 修改实体
- 删除实体
- 计费解释
概述
Slurm 可以配置为收集每个作业和作业步骤执行的计费信息。 计费记录可以写入简单的文本文件或数据库。 有关当前正在执行的作业和已经终止的作业的信息均可用。 sacct 命令可以报告正在运行或已终止作业的资源使用情况,包括单个任务,这对于检测任务之间的负载不平衡非常有用。 sstat 命令可用于仅查看当前正在运行的作业的状态。 它还可以提供有关任务之间不平衡的有价值信息。 sreport 可用于生成基于特定时间间隔内执行的所有作业的报告。
与资源计费相关的有三种不同的插件类型。 与这些插件相关的 Slurm 配置参数(在 slurm.conf 中)包括:
- AccountingStorageType 控制作业和作业步骤信息的详细记录方式。您可以将此信息存储在文本文件中或存储到 SlurmDBD 中。
- JobAcctGatherType 依赖于操作系统,并控制用于收集计费信息的机制。 支持的值为 jobacct_gather/linux、jobacct_gather/cgroup 和 jobacct_gather/none(不收集信息)。
- JobCompType 控制作业完成信息的记录方式。这可以用于记录基本的作业信息,如作业名称、用户名、分配的节点、开始时间、完成时间、退出状态等。如果只需要保留基本的作业信息,则此插件应能以最小的开销满足您的需求。您可以将此信息存储在文本文件中,或存储到 MySQL 或 MariaDB 数据库中。
使用 sacct 查看作业信息依赖于 AccountingStorageType 被配置为收集和存储该信息。 使用 sreport 依赖于某个数据库被用于存储该信息。
使用 sacct 或 sstat 查看作业内资源使用情况的信息依赖于 JobAcctGatherType 和 AccountingStorageType 都被配置为收集和存储该信息。
将计费信息存储到文本文件中非常简单。只需配置适当的插件(例如 JobCompType=jobcomp/filetxt),然后指定文件的路径名(例如 JobCompLoc=/var/log/slurm/job_completions)。 使用 logrotate 或类似工具防止日志文件过大。 在移动文件后,但在压缩之前向 slurmctld 守护进程发送 SIGUSR2 信号,以便创建新的日志文件。
直接将数据存储到数据库中可能看起来很有吸引力,但这需要不仅为 Slurm 控制守护进程(slurmctld)提供用户名和密码数据,还需要为需要访问数据的用户命令(sacct、sreport 和 sacctmgr)提供用户名和密码。 将潜在的敏感信息提供给所有用户会使数据库安全性更难以提供。通过中间守护进程发送数据可以提供更好的安全性和性能(通过缓存数据)。SlurmDBD(Slurm 数据库守护进程)提供了这样的服务。 SlurmDBD 是用 C 编写的,多线程、安全且快速。 使用 SlurmDBD 所需的配置将在下面描述。 直接将信息存储到数据库中的方式是类似的。
请注意,SlurmDBD 依赖于现有的 Slurm 插件进行身份验证和 Slurm SQL 进行数据库使用,但其他 Slurm 命令和守护进程在安装 SlurmDBD 的主机上并不需要。请在运行 SlurmDBD 的服务器上安装 slurm 和 slurm-slurmdbd RPM。
请注意,如果您从使用 MySQL 插件切换到使用 SlurmDBD 插件,您必须确保集群已添加到数据库中。MySQL 插件不需要此操作,但在使用 MySQL 插件时,如果您将其放在那里也不会造成伤害。您可以通过以下命令进行验证:
sacctmgr list cluster
如果集群不存在,请添加它(假设我的集群名称为 snowflake):
sacctmgr add cluster snowflake
如果不这样做,将导致 slurmctld 在切换后无法与 slurmdbd 通信。如果您计划升级到新版本的 Slurm,请不要同时切换插件,否则可能会得到意外结果。请先做一个,然后再做另一个。
如果配置了 SlurmDBD 但没有响应,则 slurmctld 将利用内部缓存,直到 SlurmDBD 恢复服务。 缓存的数据由 slurmctld 在关闭时写入本地存储,并在启动时恢复。 如果 slurmctld 启动时 SlurmDBD 不可用,将使用基于守护进程最后一次通信时的状态的有效银行账户、用户限制等的缓存。 请注意,SlurmDBD 必须在 slurmctld 首次启动时响应,因为没有此关键数据的缓存可用。 由 slurmctld 生成的作业和步骤计费记录将在需要时写入缓存,并在恢复服务时转移到 SlurmDBD。请注意,如果 SlurmDBD 停机时间过长,以至于排队记录的数量超过最大队列大小,则将开始丢弃消息。
基础设施
通过 SlurmDBD,我们能够在一个位置收集来自多个集群的数据。 这对用户命名和 ID 施加了一些限制。 计费是通过用户名(而不是用户 ID)维护的,但给定的用户名应在所有计算机上指代同一个人。 身份验证依赖于用户 ID 号码,因此这些号码必须在与每个 SlurmDBD 通信的所有计算机上保持一致,至少对于需要身份验证的用户而言。 特别是,配置的 SlurmUser 必须在所有集群中具有相同的名称和 ID。 如果您计划有用户账户、限制等的管理员,他们也必须在所有集群中具有一致的名称和 ID。 如果您计划限制对计费记录的访问(例如,仅允许用户查看其作业的记录),那么所有用户应具有一致的名称和 ID。
注意:默认情况下,仅支持小写用户名,但您可以在 slurmdbd.conf 中配置 Parameters=PreserveCaseUser 以允许使用大写字符的用户名。
确保数据安全的最佳方法是对 SlurmDBD 的通信进行身份验证,我们推荐使用 MUNGE 来实现此目的。 如果您有一个由 Slurm 管理的集群并在该集群上执行 SlurmDBD,则正常的 MUNGE 配置就足够了。 否则,MUNGE 应该在所有 Slurm 管理的集群的所有节点上安装,以及运行 SlurmDBD 的机器上。 然后,您可以选择为所有这些计算机使用一个 MUNGE 密钥,或者为每个集群维护一个唯一的密钥,以及一个用于集群之间通信的第二个密钥以提高安全性。 计划中的 MUNGE 增强功能将支持在单个配置文件中使用两个密钥,但目前必须启动两个不同的守护进程,并使用不同的配置来支持两个不同的密钥(创建两个密钥文件,并使用 --key-file 选项启动守护进程以找到正确的密钥,以及使用 --socket 选项为每个指定不同的本地域套接字)。 本地域套接字的路径名将在 Slurm 和 SlurmDBD 配置文件(分别为 slurm.conf 和 slurmdbd.conf)中需要提供(更多细节将在下面提供)。
无论您是否使用任何身份验证模块,您都需要有一种方法让 SlurmDBD 获取用户和/或管理员的 UID。如果使用 MUNGE,理想情况下,您的用户在所有集群上的 ID 应该相同。如果是这种情况,您应该在数据库服务器上组合每个集群的 /etc/passwd 文件,以允许 DBD 解析名称进行身份验证。如果使用 MUNGE 并且用户的名称不在 passwd 文件中,则操作将失败。如果不使用 MUNGE,您应该将希望成为管理员或操作员的任何人添加到 passwd 文件中。如果他们计划运行 sacctmgr 或任何计费工具,他们应该具有相同的 UID,否则将无法正确进行身份验证。LDAP 服务器也可以作为收集此信息的一种方式。
存储备份主机
可以通过在 slurm.conf 中指定 AccountingStorageBackupHost,以及在 slurmdbd.conf 中指定 DbdBackupHost 来配置 slurmdbd 的备份实例。备份主机应与托管主 slurmdbd 实例的机器不同。两个 slurmdbd 实例都应能够访问同一数据库,共享相同的 munge 密钥,并具有相同的用户及其 UID/GID。网络页面 有一个可视化表示,展示了这可能的样子。
Slurm JobComp 配置
目前,SlurmDBD 不支持作业完成,但可以直接写入数据库、脚本或平面文件。如果您正在使用计费存储插件,则使用作业完成插件可能是多余的。如果您想配置此项,以下是一些更重要的参数:
- JobCompHost: 仅在使用数据库时需要。数据库服务器执行的主机的名称或地址。
- JobCompLoc: 仅在使用平面文件时需要。写入作业完成数据的文件位置。
- JobCompPass: 仅在使用数据库时需要。连接数据库的用户的密码。由于密码无法安全维护,因此不建议直接将信息存储在数据库中。
- JobCompPort: 仅在使用数据库时需要。数据库接受通信的网络端口。
- JobCompType: 作业完成插件的类型设置为 "jobcomp/mysql" 或 "jobcomp/filetxt"。
- JobCompUser: 仅在使用数据库时需要。连接数据库的用户名。
- JobCompParams: 将任意文本字符串传递给作业完成插件。
构建前的 Slurm 计费配置
您可以通过使用 AccountingStorageType=accounting_storage/slurmdbd 来配置 SlurmDBD 与数据库进行通信。这允许创建称为 "关联" 的用户实体,它由集群、用户、账户和可选的分区组成。
MySQL 或 MariaDB 是首选数据库。 请参阅 升级指南,了解有关 Slurm 和数据库服务器包的就地升级的信息。
要启用此数据库支持,只需在系统上安装所需使用的数据库的开发包。Slurm 在 MySQL 中使用 InnoDB 存储引擎以实现回滚功能。此功能必须在您的 MySQL 安装中可用,否则回滚将无法工作。
slurm 配置脚本使用 mysql_config 来获取有关已安装库和头文件的信息。您可以在配置 slurm 构建时使用 --with-mysql_conf=/path/to/mysql_config 选项来指定 mysql_config 脚本的位置。 在成功配置时,输出类似于以下内容:
checking for mysql_config... /usr/bin/mysql_config MySQL 测试程序构建正确。
注意:在第一次运行 slurmdbd 之前,有几个 MySQL/MariaDB 服务器设置应进行审核。
- innodb_buffer_pool_size: 我们建议为 SQL 服务器分配可用内存的 5% 到 50%,并至少 4 GiB。将此值设置得太小可能会在升级大型 Slurm 数据库或清除旧记录时导致问题。
- innodb_log_file_size: 应设置为 innodb_buffer_pool_size 除以 innodb_log_files_in_group 的 25%。以减少不必要的小写入磁盘。 请记住,增加此值可能会导致 SQL 服务器意外关闭时的恢复时间增加。
- innodb_redo_log_capacity: 在 MySQL 8.0.30 及更高版本中使用此值替代 innodb_log_file_size。 应设置为 innodb_buffer_pool_size 的 25%。
- innodb_lock_wait_timeout: 将此值设置为 900 秒,以允许某些潜在的长查询成功完成。
- max_allowed_packet: 我们建议此值至少为 16M,并且在使用较旧的 SQL 服务器版本时检查此值非常重要。如果您使用 AccountingStoreFlags=job_env,job_script,则此值必须大于 max_script_size。
请参见以下示例:
mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; +-------------------------+------------+ | Variable_name | Value | +-------------------------+------------+ | innodb_buffer_pool_size | 4294967296 | +-------------------------+------------+ 1 row in set (0.001 sec) $cat my.cnf ... [mysqld] innodb_buffer_pool_size=4096M innodb_log_file_size=1024M innodb_lock_wait_timeout=900 max_allowed_packet=16M ...
此外,在 MySQL 5.7 之前的版本中,默认行格式设置为 COMPACT,这可能在创建表时导致一些问题。在较新版本中,它已更改为 DYNAMIC。表的行格式决定了其行在页面中的物理存储方式,并直接影响查询和 DML 操作的性能。在非常特定的情况下,使用非 DYNAMIC 格式可能导致行无法适应页面,并且 MySQL 可能在创建表时抛出错误。因此,建议在创建数据库表之前仔细阅读行格式的信息,如果您默认不使用 DYNAMIC,请考虑设置该格式。如果在升级过程中出现以下 InnoDB 错误,则可以将表修改(可能需要一些时间)以将行格式设置为 DYNAMIC,从而允许转换继续进行:
[警告] InnoDB: 无法在表 ... 中添加字段 ...,因为添加后行大小为 Y,超过索引叶页面上记录的最大允许大小 (X)。
您可以通过显示 innodb_default_row_format 变量来查看默认行格式:
mysql> SHOW VARIABLES LIKE 'innodb_default_row_format'; +---------------------------+---------+ | Variable_name | Value | +---------------------------+---------+ | innodb_default_row_format | dynamic | +---------------------------+---------+ 1 row in set (0.001 sec)
您还可以通过运行以下命令查看表的创建方式,其中 db_name 是您在 slurmdbd.conf 中设置的 Slurm 数据库(StorageLoc)的名称:
mysql> SHOW TABLE STATUS IN db_name;
构建后的 Slurm 计费配置
为简单起见,我们将假设您正在使用 SlurmDBD。您可以直接与存储插件进行通信,但这提供的安全性很少。
必须设置几个 Slurm 配置参数以支持在 SlurmDBD 中归档信息。SlurmDBD 有一个单独的配置文件,在单独的部分中进行了文档说明。 请注意,您可以在将作业完成记录写入文本文件或根本不维护的情况下将计费信息写入 SlurmDBD。 如果您不设置以 "AccountingStorage" 开头的配置参数,则计费信息将不会被引用或记录。
- AccountingStorageEnforce:
此选项包含您可能希望强制执行的以逗号分隔的选项列表。有效选项是任何以逗号分隔的组合:
- associations - 如果用户的 association 不在数据库中,则将阻止用户运行作业。此选项将防止用户访问无效账户。
- limits - 这将强制执行在关联和 qos 上设置的限制。 通过设置此选项,将自动设置 'associations' 选项。如果使用 qos,则将强制执行限制,但如果您希望强制访问 qos,仍然需要下面描述的 'qos'。
- nojobs - 这将使得不会在计费中存储任何作业信息。通过设置此选项,'nosteps' 也将被设置。
- nosteps - 这将使得不会在计费中存储任何步骤信息。在您希望使用限制但不太关心利用率的环境中,nojobs 和 nosteps 都可能有用。
- qos - 这将要求所有作业指定(无论是明确指定还是默认)一个有效的 qos(服务质量)。每个关联在数据库中定义 QOS 值。通过设置此选项,将自动设置 'associations' 选项。如果您希望强制执行 QOS 限制,则需要使用 'limits' 选项。
- safe - 这将确保只有在使用具有 TRES-分钟限制的关联或 qos 时,作业才能启动,如果作业能够运行到完成。未设置此选项时,只要其使用未达到 TRES-分钟限制,作业将被启动,这可能导致作业启动后在达到限制时被终止。 设置 'safe' 选项后,即使在作业启动后限制发生变化并且关联或 qos 违反更新的限制,作业也不会因限制而被终止。 通过设置此选项,将自动设置 'associations' 选项和 'limits' 选项。
- wckeys - 这将防止用户在没有访问权限的 wckey 下运行作业。使用此选项时,将自动设置 'associations' 选项。'TrackWCKey' 选项也设置为 true。
如果未设置 AccountingStorageEnforce(默认行为),作业将根据在每个集群中配置的策略执行。 - AccountingStorageExternalHost: 要注册的外部 slurmdbd 的以逗号分隔的列表(<host/ip>[:port][,...])。如果未给出端口,将使用 AccountingStoragePort。这允许与外部 slurmdbd 注册的集群使用 --cluster/-M 客户端命令选项相互通信。 如果集群在外部 slurmdbd 中不存在,则将其添加到外部 slurmdbd。 如果外部 slurmdbd 中已存在非外部集群,则 slurmctld 将忽略注册到外部 slurmdbd。
- AccountingStorageHost:SlurmDBD 执行的主机的名称或地址
- AccountingStoragePass:用于访问数据库以存储计费数据的密码。仅用于数据库类型存储插件,其他情况下将被忽略。在使用 MUNGE 身份验证的 SlurmDBD(数据库守护进程)中,可以配置为使用专门配置的 MUNGE 守护进程,以提供集群之间的身份验证,而默认的 MUNGE 守护进程提供集群内的身份验证。在这种情况下,AccountingStoragePass 应指定用于与替代 MUNGE 守护进程通信的命名端口(例如 "/var/run/munge/global.socket.2")。默认值为 NULL。
- AccountingStoragePort: SlurmDBD 接受通信的网络端口。
- AccountingStorageType: 设置为 "accounting_storage/slurmdbd"。
- ClusterName: 为每个 Slurm 管理的集群设置唯一名称,以便能够识别来自每个集群的计费记录。
- TrackWCKey: 布尔值。如果您希望跟踪用户的 wckeys(工作负载特征键)。Wckey 是一种独立的方式,用于对可能无关的账户进行计费。当运行作业时,使用 --wckey 选项指定一个值,计费记录将通过此 wckey 收集。
SlurmDBD 配置
SlurmDBD 需要其自己的配置文件,名为 "slurmdbd.conf"。 此文件应仅在运行 SlurmDBD 的计算机上,并且仅应由执行 SlurmDBD 的用户(例如 "slurm")可读。 此文件应受到保护,以防止未经授权的访问,因为它包含数据库登录名和密码。 有关配置参数的更完整描述,请参见 slurmdbd.conf(5)。 一些更重要的参数包括:
- AuthInfo: 如果使用 SlurmDBD 和第二个 MUNGE 守护进程,请存储 MUNGE 用于提供企业级身份验证的命名套接字的路径名。 否则,将使用默认的 MUNGE 守护进程。
- AuthType: 定义 Slurm 组件之间通信的身份验证方法。建议使用 "auth/munge" 的值。
- DbdHost: 执行 Slurm 数据库守护进程的机器的名称。此名称应为节点名称,不带完整域名(例如 "lx0001")。 默认值为 localhost,但应提供以避免警告消息。
- DbdPort: Slurm 数据库守护进程(slurmdbd)监听工作的端口号。默认值为系统构建时建立的 SLURMDBD_PORT。如果未明确指定,将设置为 6819。 此值必须等于 slurm.conf 文件中的 AccountingStoragePort 参数。
- LogFile: Slurm 数据库守护进程日志写入的文件的完全限定路径名。 默认值为无(通过 syslog 进行日志记录)。
- PluginDir: 标识查找 Slurm 插件的位置。 这是一个以冒号分隔的目录列表,类似于 PATH 环境变量。 默认值为配置时给定的前缀 + "/lib/slurm"。
- SlurmUser: slurmdbd 守护进程执行的用户的名称。 此用户必须在执行 Slurm 数据库守护进程的机器上存在,并且与执行 slurmctld 的主机具有相同的 UID。 出于安全考虑,建议使用 "root" 以外的用户。 默认值为 "root"。此名称在所有向 SlurmDBD 报告的集群中也应相同。 注意:如果此用户与 slurmctld 设置的用户不同,并且不是 root,则必须以 AdminLevel=Admin 添加到计费中,并且必须重新启动 slurmctld。
- StorageHost: 定义运行数据库的主机的名称,我们将存储数据。 这可以是运行 slurmdbd 的主机,但对于较大的系统,我们建议将数据库保留在单独的机器上。
- StorageLoc: 指定写入计费记录的数据库的名称。对于数据库,默认数据库为 slurm_acct_db。请注意,名称中不能包含 '/',否则将使用默认值。
- StoragePass: 定义用于访问数据库以存储作业计费数据的密码。
- StoragePort: 定义数据库监听的端口。
- StorageType: 定义计费存储机制。 目前唯一可接受的值是 "accounting_storage/mysql"。 值 "accounting_storage/mysql" 表示计费记录应写入由 StorageLoc 参数指定的 MySQL 或 MariaDB 数据库。 此值必须被指定。
- StorageUser: 定义我们将用于连接数据库以存储作业计费数据的用户的名称。
MySQL 配置
虽然 Slurm 会自动创建数据库表,但您需要确保 StorageUser 在 MySQL 或 MariaDB 数据库中具有权限。 作为 mysql 用户,使用以下命令授予该用户权限:
GRANT ALL ON StorageLoc.* TO 'StorageUser'@'StorageHost';
(需要反引号)
(您需要是 root 才能执行此操作。此外,在密码使用的信息中,有一行以 '->' 开头。这是一个续行提示,因为前面的 mysql 语句未以 ';' 结束。它假定您希望输入更多信息。)
如果您希望 Slurm 自动创建数据库及任何未来的数据库,您可以将授权行更改为 *.* 而不是 StorageLoc.*
实时示例:
mysql@snowflake:~$ mysql 欢迎使用 MySQL 监视器。命令以 ; 或 \g 结束。 您的 MySQL 连接 ID 为 538 服务器版本:5.0.51a-3ubuntu5.1(Ubuntu) 输入 'help;' 或 '\h' 获取帮助。输入 '\c' 清除缓冲区。 mysql> create user 'slurm'@'localhost' identified by 'password'; 查询 OK, 0 行受影响 (0.00 sec) mysql> grant all on slurm_acct_db.* TO 'slurm'@'localhost'; 查询 OK, 0 行受影响 (0.00 sec)
您可能还需要对系统名称执行相同操作,以便 mysql 正常工作:
mysql> grant all on slurm_acct_db.* TO 'slurm'@'system0'; 查询 OK, 0 行受影响 (0.00 sec) 其中 'system0' 是本地主机或数据库存储主机。
或者使用密码...
mysql> grant all on slurm_acct_db.* TO 'slurm'@'localhost' -> identified by 'some_pass' with grant option; 查询 OK, 0 行受影响 (0.00 sec)
在这种情况下,您也需要对系统名称执行相同操作:
mysql> grant all on slurm_acct_db.* TO 'slurm'@'system0' -> identified by 'some_pass' with grant option; 其中 'system0' 是本地主机或数据库存储主机。
验证您是否具有 InnoDB 支持
mysql> SHOW ENGINES; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | ... | | | | | | | InnoDB | DEFAULT | 支持事务、行级锁定和外键 | YES | YES | YES | | ... | | | | | | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
然后创建数据库:
mysql> create database slurm_acct_db;
这将授予用户 'slurm' 在本地主机或存储主机系统上执行所需操作的权限。必须在 SlurmDBD 正常工作之前完成此操作。在您在 mysql 中授予用户 'slurm' 权限后,您可以启动 SlurmDBD 和其他 Slurm 守护进程。您可以通过输入其路径名 '/usr/sbin/slurmdbd' 或 '/etc/init.d/slurmdbd start' 来启动 SlurmDBD。您可以通过输入 'ps aux | grep slurmdbd' 来验证 SlurmDBD 是否正在运行。
如果 SlurmDBD 未运行,您可以在启动 SlurmDBD 时使用 -v 选项以获取更详细的信息。以 '-D' 选项在守护进程模式下启动 SlurmDBD 也可以帮助调试,这样您就不必去日志中查找问题。
SlurmDBD 归档和清除
随着时间的推移,slurm 数据库可能会变得足够大,以至于难以管理。为了保持数据库在合理的大小,slurmdbd 支持根据数据的年龄进行归档和清除。被清除的数据将从数据库中删除,但您可以选择在清除时归档数据。 归档的数据将放置在平面文件中,稍后可以通过 sacctmgr 加载到 slurmdbd 中。
强烈建议在设置计费后不久 制定数据保留计划。如果在数据库已经增长到难以处理的大小后添加清除,可能很难赶上所需的清除间隔。监控表大小和系统利用率,以决定您希望保留数据的时间,并尝试在达到该时间之前设置相关的配置选项。
归档和清除选项以 Archive${*} 和 Purge${*}After 的形式出现。有关可用配置参数的更多详细信息,请参见 slurmdbd.conf(5)。
清除选项的单位很重要。例如: PurgeJobsAfter=12months 将在每月初清除超过 12 个月的作业,而 PurgeJobsAfter=365days 将在每天初清除超过 365 天的作业。这一区别对于非常活跃的集群可能很有用,减少一次需要清除的数据量。
归档服务器
如果您的站点需要持续访问归档/清除的数据,可以创建 slurmdbd 的归档实例。先前从生产数据库归档和清除的数据可以加载到归档服务器中,从而保持生产数据库在可管理的大小,同时确保旧记录仍然可访问。
slurmdbd 的归档实例不应能够与生产服务器通信。理想情况下,它们将有各自的 MySQL/MariaDB 实例,用于存储其数据。Slurm 控制器(slurmctld)绝不应与归档 slurmdbd 进行通信。
在配置归档服务器时,某些数据库条目需要与生产服务器匹配,以便归档的信息能够正确显示。为了确保唯一标识符匹配,应使用 mysqldump 导出关联、QOS 和 TRES 信息。 导出这些表的命令应如下所示,并用适当的值替换 <slurm_user>、<db_name> 和 <cluster>:
mysqldump -u <slurm_user> -p <db_name> <cluster>_assoc_table qos_table tres_table > slurm.sql
虽然应该使用 mysqldump 来转移这些表的信息,但不应使用它来转移将通过归档/清除过程生成的信息。如果使用 mysqldump 尝试获取所需的信息,可能会存在轻微差异,并且在稍后尝试加载归档文件时,可能会出现记录间隙或重复记录,从而阻止归档文件正确加载。
工具
Slurm 包含一些工具,让您可以处理计费数据; sacct、sacctmgr 和 sreport。 这些工具通过 SlurmDBD 守护进程获取或设置数据。
- sacct 用于检索存储在数据库中的正在运行和已完成作业的详细信息。
- sacctmgr 用于管理数据库中的实体。这些包括集群、账户、用户关联、QOS 等。
- sreport 用于生成在给定时间段内收集的使用情况的各种报告。
有关每个命令的更多信息,请参见手册页。
虽然 sreport 提供了快速生成一些最常请求的信息的报告的能力,但站点通常希望对信息的显示方式有额外的控制。有一些第三方工具可以帮助生成包含有关您集群的相关信息图表的仪表板。这些工具不是由 SchedMD 维护或支持,但这些实用程序对某些站点非常有用:
- Grafana:允许使用 Prometheus 或 InfluxDB 收集的数据创建各种图表的仪表板。
- InfluxDB: 包括一个导出工具,用于收集来自 Slurm 的性能指标。
- Prometheus :包括一个导出工具,用于收集来自 Slurm 的性能指标。
数据库配置
计费记录是基于我们称之为 Association 的内容维护的, 它由四个元素组成:集群、账户、用户名和可选的分区名称。使用 sacctmgr 命令来创建和管理这些记录。
注意:设置计费关联是有顺序的。 您必须在添加账户之前定义集群,并且必须在添加用户之前添加账户。
例如,要将名为 "snowflake" 的集群添加到数据库中,请执行以下命令 (注意:自 20.02 起,如果集群不存在,slurmctld 将在启动时将其添加到数据库。添加后仍需创建关联):
sacctmgr add cluster snowflake
将账户 "none" 和 "test" 添加到集群 "snowflake",执行如下命令:
sacctmgr add account none,test Cluster=snowflake \ Description="none" Organization="none"
如果您有更多集群希望将这些账户添加到,您可以选择不指定集群,这将把账户添加到系统中的所有集群,或者用逗号分隔您希望添加的集群名称。 请注意,可以通过逗号分隔名称同时添加多个账户。 必须指定账户的 description 和其所属的 organization。 这些术语可以在后续生成计费报告时使用。 账户可以以层次结构的方式排列。例如,账户 chemistry 和 physics 可能是账户 science 的子账户。 层次结构可以具有任意深度。 只需在添加账户行中指定 parent='' 选项即可构建层次结构。 对于上述示例,请执行:
sacctmgr add account science \ Description="science accounts" Organization=science sacctmgr add account chemistry,physics parent=science \ Description="physical sciences" Organization=science
使用类似的语法将用户添加到账户。 例如,要允许用户 da 在所有集群上执行作业,默认账户为 test,请执行:
sacctmgr add user brian Account=physics sacctmgr add user da DefaultAccount=test
如果在集群 snowflake 的 slurm.conf 中配置了 AccountingStorageEnforce=associations,则用户 da 将被允许在账户 test 和将来添加的任何其他账户中运行。 任何尝试使用其他账户的行为将导致作业被中止。 如果他在作业提交命令中未指定账户,则账户 test 将是默认账户。
也可以创建与特定分区相关联的关联。 使用 sacctmgr 的 "add user" 命令时,可以包含 Partition=<PartitionName> 选项,以创建与同一账户和用户的其他关联唯一的关联。
集群选项
在添加或修改集群时,sacctmgr 提供以下选项:
- Name= 集群名称
账户选项
在添加或修改账户时,以下 sacctmgr 选项可用:
- Cluster= 仅将此账户添加到这些集群。 默认情况下,账户将添加到所有定义的集群。
- Description= 账户的描述。(默认是账户名称)
- Name= 账户名称。请注意,名称必须唯一,并且不能在账户层次结构的不同点代表不同的银行账户。
- Organization= 账户的组织。(默认是父账户,除非父账户为 root,则组织设置为账户名称。)
- Parent= 将此账户设为其他已添加账户的子账户。
用户选项
在添加或修改用户时,以下 sacctmgr 选项可用:
- Account= 要将用户添加到的账户
- AdminLevel=此字段用于允许用户为该用户添加会计权限。有效选项包括
- 无
- 操作员:可以添加、修改和删除任何数据库对象(用户、账户等),并添加其他操作员
在由SlurmDBD提供服务的slurmctld上,这些用户可以
- 查看被PrivateData标志阻止的常规用户信息
- 创建/修改/删除预留
- 管理员:这些用户在数据库中具有与操作员相同级别的权限。他们还可以像slurm用户或root一样修改在提供服务的slurmctld上的任何内容。
- Cluster= 仅将账户添加到这些集群(默认是所有集群)
- DefaultAccount= 用户的默认账户,当提交作业时未指定账户时使用。(创建时必填)
- DefaultWCKey= 用户的默认wckey,当提交作业时未指定wckey时使用。(仅在跟踪wckeys时使用。)
- Name= 用户名
- NewName= 用于在会计数据库中重命名用户
- Partition= 此关联适用的Slurm分区名称
限制执行
各种限制和限制执行在 资源限制网页中进行了描述。
要启用任何限制执行,您必须在slurm.conf中至少设置 AccountingStorageEnforce=limits。 否则,即使您设置了限制,它们也不会被执行。 有关AccountingStorageEnforce的其他选项及其解释,请参见资源限制文档。
修改实体
在修改实体时,您可以以类似SQL的方式指定许多不同的选项,使用关键字如where和set。 典型的执行行具有以下形式:
sacctmgr modify <entity> set <options> where <options>
例如:
sacctmgr modify user set default=none where default=test
将把所有默认账户为“test”的用户更改为账户“none”。 一旦实体被添加、修改或删除,变更将发送到相应的Slurm守护进程,并将立即可用。
删除实体
使用类似于上述修改示例的执行行删除实体,但不带set选项。 例如,使用以下执行行删除所有默认账户为“test”的用户:
sacctmgr remove user where default=test
将删除所有默认账户为“test”的用户记录。
sacctmgr remove user brian where account=physics
将从账户“physics”中删除用户“brian”。如果用户“brian”有访问其他账户的权限,则这些用户记录将保留。
注意:在大多数情况下,已删除的实体在slurm数据库中被保留,但标记为已删除。 如果实体存在时间少于1天,则该实体将被完全删除。这是为了清理输入错误。 然而,删除用户关联或账户将导致slurmctld失去对该用户/账户的使用数据的跟踪。
会计解释
Slurm会计主要集中在并行计算上。因此,它在“任务级别”收集统计信息。任务是一组在步骤中运行的用户进程,步骤是作业的一部分。用户可以提交一个包含多个并行任务的步骤,例如通过调用srun -n
。
JobAcctGather插件
在给定的时间间隔内收集一些可跟踪资源(TRES)的指标,如cpu、内存、能量等,时间间隔在JobAcctGatherFrequency中定义,或通过在命令行中使用--acct-freq
选项。数据轮询也会在步骤开始或结束时触发。
根据指标的性质,值将作为独立值记录或聚合/计算到数据结构中。
例如,TresUsageInTot字段可以在作业运行时通过sstat查询,对于每个TRES,它存储所有任务收集的指标的总和。例如,如果我们有5个任务,所有任务都消耗1GB内存,则TresUsageInTot将显示“memory=5G”。在同样的例子中,对于TresUsageInMax,它将存储该步骤中任何任务所见的最大内存峰值,因此它将显示“memory=1G”。 如果我们查询TresUsageInMaxNode和TresUsageInMaxTask,我们将能够看到哪个任务ID具有最大的内存峰值,以及该事件发生在哪个节点。这些值可以在专用字段MaxRSS、MaxRSSNode和MaxRSSTask中查询。
需要考虑的其他因素是,在某些情况下,例如能量,消耗是按节点计算的。我们没有特定于任务的值,因此如果系统中有其他作业或多个任务,运行时的消耗将受到节点中所有进程的影响。
作业完成后,数据将存储在数据库中,并可以使用其他工具查询,如sacct。在这种情况下,TresUsage*字段可能具有不同的含义。例如,在内存的情况下,TresUsageInTot现在将存储在任何时间内所有任务的内存峰值的总和。这个值本身并没有用处,但它用于计算TresUsageInAve以获得平均内存峰值,然后可以与TresUsageInMax(或MaxRSS)进行比较,以查看是否至少有一个异常任务在该步骤中消耗了过多内存,指示某些问题。
请注意,对于单任务进程,TresUsageInTot可以用作步骤在任何时间消耗的最大内存,这将等于MaxRSS并有效地表示步骤内存峰值。 分析工作类似,我们提供插件如HDF5和InfluxDB,可以帮助以其他方式可视化会计数据。
最后修改于2025年6月11日