Slurm可以被配置为收集每个作业和作业步骤执行的核算信息。核算记录可以被写入一个简单的文本文件或一个数据库。目前正在执行的作业和已经终止的作业的信息都是可用的。sacct命令可以报告正在运行或已经终止的作业的资源使用情况,包括单个任务,这对于检测任务之间的负载不平衡非常有用。sstat命令可用于仅对当前正在运行的作业进行统计。它也可以为你提供关于任务之间不平衡的有价值的信息。sreport可以用来生成基于特定时间间隔内执行的所有作业的报告。
有三种不同的插件类型与资源核算有关。与这些插件相关的Slurm配置参数(在slurm.conf中)包括:
使用sacct查看工作信息,取决于AccountingStorageType被配置为收集和存储该信息。sreport的使用取决于一些数据库被用来存储这些信息。
使用 sacct 或 sstat 来查看作业中的资源使用信息,取决于 JobAcctGatherType 和 AccountingStorageType 被配置为收集和存储该信息。
将核算信息存储到文本文件中是非常简单的。只要配置适当的插件(如JobCompType=jobcomp/filetxt),然后指定文件的路径名(如JobCompLoc=/var/log/slurm/job_completions)。使用logrotate或类似工具,防止日志文件过大。在移动文件后,但在压缩文件前,向slurmctld守护进程发送一个SIGUSR2信号,这样就会有新的日志文件产生。
将数据直接从Slurm中存储到数据库中似乎很有吸引力,但它不仅需要为Slurm控制守护进程(slurmctld)提供用户名和密码数据,还需要为需要访问数据的用户命令(sacct、sreport和sacctmgr)提供。将潜在的敏感信息提供给所有用户,使得数据库的安全性更难提供。通过一个中间守护程序发送数据可以提供更好的安全性和性能(通过缓存数据)。SlurmDBD(Slurm Database Daemon)提供了这样的服务。SlurmDBD是用C语言编写的,多线程,安全且快速。下面将介绍使用SlurmDBD所需的配置。直接将信息存储到数据库中的做法类似于
注意,SlurmDBD依赖于现有的Slurm插件来进行身份验证,以及Slurm SQL来使用数据库,但在安装SlurmDBD的主机上不需要其他的Slurm命令和守护程序。在要运行SlurmDBD的服务器上安装slurm和slurm-slurmdbd RPMs。
注意,如果你从使用MySQL插件切换到使用SlurmDBD插件,你必须确保集群已经被添加到数据库中。MySQL插件没有这个要求,但如果你在使用MySQL插件时有这个要求,也不会有什么影响。你可以通过以下方式验证
sacctmgr list cluster
如果集群不在那里,就添加它(其中我的集群的名字是snowflake)。
sacctmgr add cluster snowflake
如果不这样做,将导致slurmctld在切换后无法与slurmdbd对话。如果你打算升级到新版本的Slurm,不要同时切换插件,否则你可能得到意想不到的结果。先做一个再做另一个。
如果SlurmDBD被配置为使用但没有响应,那么slurmctld将利用一个内部缓存,直到SlurmDBD返回服务。缓存的数据在关机时由slurmctld写入本地存储,并在启动时恢复。如果SlurmDBD在slurmctld启动时不可用,将使用基于守护进程最后一次通信时状态的有效银行账户、用户限额等的缓存。注意,SlurmDBD必须在slurmctld首次启动时进行响应,因为没有这种关键数据的缓存。由slurmctld生成的作业和步骤记录将根据需要写入缓存,并在返回服务时传输给SlurmDBD。注意,如果SlurmDBD宕机的时间足够长,排队记录的数量超过了最大队列大小,那么消息将开始被丢弃。
通过SlurmDBD,我们能够在一个地方收集多个集群的数据。这确实对用户的命名和ID施加了一些限制。核算是通过用户名(而不是用户ID)来维护的,但是一个给定的用户名应该在所有的计算机上指的是同一个人。认证依赖于用户ID号码,所以这些号码必须在与每个SlurmDBD通信的所有计算机上统一,至少对需要认证的用户来说是如此。特别是,配置的SlurmUser必须在所有集群中具有相同的名称和ID。如果你计划有用户账户、限制等的管理员,他们也必须在所有集群中拥有一致的名称和ID。如果你计划限制对核算记录的访问(例如,只允许一个用户查看他的工作记录),那么所有用户都应该有一致的名字和ID。
注意:只支持小写的用户名。
确保数据安全的最好方法是对SlurmDBD的通信进行认证,我们推荐MUNGE来实现这一目的。如果你有一个由Slurm管理的集群,并在这一个集群上执行SlurmDBD,正常的MUNGE配置就足够了。否则,MUNGE应该被安装在所有Slurm管理的集群的所有节点上,加上执行SlurmDBD的机器。然后,你可以选择为所有这些计算机安装一个MUNGE密钥,或者为每个集群维护一个唯一的密钥,再加上集群之间通信的第二个密钥,以提高安全性。MUNGE的改进计划是在一个配置文件中支持两个密钥,但目前必须用不同的配置启动两个不同的守护程序,以支持两个不同的密钥(创建两个密钥文件,用--密钥文件选项启动守护程序,以找到适当的密钥,再加上--套接字选项,为每个密钥指定不同的本地域套接字)。在Slurm和SlurmDBD配置文件(分别为slurm.conf和slurmdbd.conf,更多细节将在下面提供)中需要本地域套接字的路径名。
无论你是否使用任何认证模块,你都需要有一种方法让SlurmDBD为用户和/或管理员获得UID。如果使用MUNGE,最理想的是你的用户在所有的集群上都有相同的ID。如果是这样的话,你应该在数据库服务器上有一个每个集群的/etc/passwd文件的组合,以允许DBD解析名字进行认证。如果使用MUNGE,而用户的名字不在passwd文件中,行动将失败。如果不使用MUNGE,你应该把任何你想成为管理员或操作员的人加入到passwd文件中。如果他们打算运行sacctmgr或任何核算工具,他们应该有相同的UID,否则他们将无法正确认证。一个LDAP服务器也可以作为收集这些信息的途径。
目前,SlurmDBD不支持作业完成,但可以直接写入数据库、脚本或平面文件。如果你正在使用核算存储插件运行,使用作业完成插件可能是多余的。如果你想对此进行配置,一些比较重要的参数包括。
虽然SlurmDBD可以用一个平面文本文件来记录工作完成情况和类似的数据,但这种配置不允许在用户和账户之间建立 "关联"。一个数据库允许这样的配置。
MySQL或MariaDB是首选的数据库。
注意:如果你有一个现有的Slurm核算数据库,并计划将你的数据库服务器从10.2.1之前的版本升级到MariaDB 10.2.1(或更新的版本),或从任何版本的MySQL,请联系SchedMD寻求帮助。
要启用这种数据库支持,人们只需要在系统上拥有他们希望使用的数据库的开发包。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 test program built properly.
注意:在第一次运行slurmdbd之前,查看MySQL的innodb_buffer_pool_size的当前设置。考虑将这个值设置得足够大,以处理数据库的大小。当把大表转换到新的数据库模式或清除旧记录时,这个值太小会有问题。我们建议将系统内存的很大一部分分配给它,记住运行MySQL/MariaDB的机器上的其他资源需求,大约在可用内存的5%到50%之间。也建议将innodb_lock_wait_timeout和innodb_log_file_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=64M
innodb_lock_wait_timeout=900
...
此外,在5.7之前的MySQL版本中,默认的行格式被设置为COMPACT,这可能会在升级期间创建表时造成一些问题。在最近的版本中,它被改变为动态格式。表的行格式决定了其行在页面中的物理存储方式,并直接影响到查询和DML操作的性能。在非常特殊的情况下,使用DYNAMIC以外的格式可能会导致行不适合放入页面,MySQL可能会因此在创建表的过程中抛出一个错误。因此,建议在创建你的数据库表之前,如果你默认不使用DYNAMIC,请仔细阅读关于行的格式,如果你的数据库版本支持,请考虑设置。如果在升级过程中出现以下InnoDB错误,这时可以对表进行修改(可能需要一些时间),将行格式设置为DYNAMIC,以便让转换继续进行。
[Warning] InnoDB: Cannot add field ... in table ... because after adding it, the row size is Y which is greater than max
你可以通过显示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;
为了简单起见,我们将在假设你是用SlurmDBD运行的情况下进行。你可以直接与一个存储插件进行通信,但这提供了最小的安全性。
必须设置几个Slurm配置参数以支持在SlurmDBD中归档信息。SlurmDBD有一个单独的配置文件,它在一个单独的章节中被记录。请注意,你可以将核算信息写入SlurmDBD,而作业完成记录则写入文本文件或根本就不维护。如果你不设置以 "AccountingStorage "开头的配置参数,那么核算信息将不会被引用或记录。
SlurmDBD需要它自己的配置文件,称为 "slurmdbd.conf"。这个文件应该只存在于执行SlurmDBD的计算机上,并且只能由执行SlurmDBD的用户(例如 "slurm")阅读。这个文件应该被保护起来,防止未经授权的访问,因为它包含了数据库的登录名和密码。参见 "man slurmdbd.conf "以获得更完整的配置参数描述。一些比较重要的参数包括。
注意:如果你有一个现有的Slurm核算数据库,并计划将你的数据库服务器从10.2.1之前的版本升级到MariaDB 10.2.1(或更新的版本),或从任何版本的MySQL,请联系SchedMD寻求帮助。
虽然Slurm会自动创建数据库表,但你需要确保StorageUser在MySQL或MariaDB数据库中被赋予权限,以便这样做。作为mysql用户,使用诸如以下命令授予该用户权限。
GRANT ALL ON StorageLoc.* TO 'StorageUser'@'StorageHost';
(需要打钩)
(你需要以root身份来做这件事。另外,在密码使用信息中,有一行是以'->'开头的。这是一个继续提示,因为之前的mysql语句没有以';'结束。它假定你希望输入更多信息)。
如果你想让Slurm自己创建数据库,以及任何未来的数据库,你可以将你的授予行改为*.而不是StorageLoc.。
例子:
mysql@snowflake:~$ mysql
Welcome to the MySQL monitor.Commands end with ; or \g.
Your MySQL connection id is 538
Server version: 5.0.51a-3ubuntu5.1 (Ubuntu)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create user 'slurm'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on slurm_acct_db.* TO 'slurm'@'localhost';
Query OK, 0 rows affected (0.00 sec)
你可能也需要对系统名称做同样的处理,以便使mysql正确工作。
mysql> grant all on slurm_acct_db.* TO 'slurm'@'system0';
Query OK, 0 rows affected (0.00 sec)
where 'system0' is the localhost or database storage host.
或者使用密码
mysql> grant all on slurm_acct_db.* TO 'slurm'@'localhost'
-> identified by 'some_pass' with grant option;
Query OK, 0 rows affected (0.00 sec)
案例中也是如此,你做的是对系统名称进行同样的处理。
mysql> grant all on slurm_acct_db.* TO 'slurm'@'system0'
-> identified by 'some_pass' with grant option;
where 'system0' is the localhost or database storage host
确认支持innodb
mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ... | | | | | |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | 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也可以帮助调试,这样你就不必去看日志来发现问题。
有几个工具可以用来处理核算数据,sacct、sacctmgr和sreport。这些工具都是通过SlurmDBD守护程序获取或设置数据。
更多信息请参见每个命令的手册页面。
核算记录是根据我们所说的 "Association "来维护的,它由四个元素组成:集群、账户、用户名和一个可选的分区名称。使用 sacctmgr 命令来创建和管理这些记录。
注意:设置核算关联是有顺序的。你必须在添加账户之前定义群集,你必须在添加用户之前添加账户。
例如,要添加一个名为 "snowflake "的集群到数据库中,执行这一行(注意:从20.02版开始,如果集群不存在,slurmctld会在启动时将其添加到数据库中。添加后仍然需要创建关联)。
sacctmgr add cluster snowflake
将账户 "none "和 "test "添加到集群 "snowflake "中,并执行这样的一行。
sacctmgr add account none,test Cluster=snowflake \
Description="none" Organization="none"
如果你有更多的集群想添加这些账户,你可以不指定集群,这将把账户添加到系统中的所有集群,或者在集群选项中用逗号分隔你想添加的集群名称。注意,可以通过逗号分隔名称,同时添加多个账户。必须指定账户的描述和它所属的组织。这些术语以后可以用来生成核算报告。账户可以按层次排列。例如,化学和物理账户可能是科学账户的子女。层次结构可以有一个任意的深度。只要在添加账户行中指定parent=''选项,就可以构建层次结构。对于上面的例子,执行
sacctmgr add account science \
Description="science accounts" Organization=science
sacctmgr add account chemistry,physics parent=science \
Description="physical sciences" Organization=science
使用类似的语法将用户添加到账户中。例如,要允许用户da在所有集群上执行作业,其默认账户为test execute。
sacctmgr add user brian Account=physics
sacctmgr add user da DefaultAccount=test
如果在集群snowflake的slurm.conf中配置了AccountingStorageEnforce=associations,那么用户da将被允许在账户test和将来添加的任何其他账户中运行。任何试图使用其他账户的行为都会导致作业被中止。如果他没有在作业提交命令中指定一个账户,那么账户test将是默认的。
还可以创建与特定分区绑定的关联。当使用sacctmgr的 "添加用户 "命令时,你可以包括Partition=选项来创建一个关联,这个关联对于具有相同账户和用户的其他关联是唯一的。
当添加或修改一个集群时,这些是sacctmgr的可用选项。
当添加或修改一个帐户时,以下是sacctmgr的选项。
当添加或修改一个用户时,可以使用以下sacctmgr选项。
各种限制和限制执行在资源限制网页上有描述。
要启用任何限制执行,你至少要在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守护进程,并立即可以使用。
使用类似于上面的修改例子的执行行来删除实体,但没有设置选项。例如,使用下面的执行行删除所有默认账户为 "test "的用户。
sacctmgr remove user where default=test
将删除默认账户为 "test "的所有用户记录。
sacctmgr remove user brian where account=physic
将从 "physics "账户中删除用户 "brian"。如果用户 "brian "有访问其他账户的权限,这些用户记录将会保留。
注意:在大多数情况下,被删除的实体会保留在slurm数据库中,但被标记为删除。如果一个实体存在的时间少于1天,该实体将被完全删除。这是为了清理打字错误。然而,删除用户关联或账户,将导致slurmctld失去对该用户/账户的使用数据的追踪。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。