View a markdown version of this page

收集 Slurm 使用托管的指标 Prometheus 收藏家 - AWS 个

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

收集 Slurm 使用托管的指标 Prometheus 收藏家

在 AWS PCS 集群上启用Slurm指标后(参见Slurm 中的指标 AWS 个),您可以使用托管Prometheus收集器自动抓取指标终端节点并提供数据以供PromQL查询。托管收集器在您的 VPC 子网中创建弹性网络接口,以通过端口 6817 访问集群控制器的指标终端节点。

收集器可以将指标传送到以下任一目的地:

  • 适用于 Prometheus 的亚马逊托管服务工作空间 — 专用的Prometheus兼容指标存储,可配置保留期(默认为 150 天)。您可以通过Prometheus兼容的 API 进行查询,或者Grafana.

  • CloudWatch 数据集 — 您的账户的默认 CloudWatch数据集,包含 15 个月的保留期。您可以通过 Query Studio 或Prometheus兼容的 HTTP API 进行 CloudWatch 查询。

无论选择哪个目标,集群端配置(Slurm设置、控制器目标、安全组和抓取配置)都是相同的。只有创建抓取器请求中的destination区块和查询端点不同。

您可以使用aws amp create-scraper命令创建收集器。尽管此命令属于 amp CLI 命名空间,但它支持这两个目标。

有关 VPC-connected 托管收集器的更多信息,请参阅《亚马逊 CloudWatch 用户指南》中的设置 VPC-connected 托管收集器。

先决条件

在配置托管收集器之前,请验证以下内容:

  • Slurm指标已启用 -指标终端节点必须在您的集群上处于活动状态。您可以通过设置MetricsType和CommunicationParameters自定义Slurm设置来启用它。有关启用Slurm指标的说明,请参阅Slurm 中的指标 AWS 个。有关自定义Slurm设置的更多信息,请参阅在中配置自定义 Slurm 设置 AWS 个。

  • Slurm版本 25.11 或更高版本 -集群必须运行 Slurm 25.11 或更高版本才能公开指标终端节点。

  • 目标资源 -为您的指标创建目的地:

    • 适用于 Prometheus 工作空间的亚马逊托管服务 — 创建一个工作空间并等待其达到状态。ACTIVE有关创建工作空间的说明,请参阅《 Amazon Prometheus 托管服务用户指南》中的创建工作空间。

    • CloudWatch 数据集 — 每个账户在每个区域都有一个default数据集。你不需要创建它。

  • VPC 子网和网络 — 您需要在与集群控制器相同的 VPC 中的不同可用区中至少有两个子网。包括控制器网络接口所在的可用区。VPC 必须启用 DNS 支持并启用 DNS 主机名。有关详细的联网要求,请参阅《亚马逊 CloudWatch 用户指南》中的设置 VPC-connected 托管收集器。

  • 安全组 -需要为收集器提供专用的安全组。有关配置安全组的说明,请参阅为收集器配置安全组。

  • IAM 权限 — 创建抓取工具需求aps:CreateScraper和权iam:CreateServiceLinkedRole限的 IAM 委托人。该服务会自动创建服务相关角色 (AWSServiceRoleForAmazonPrometheusScraper)。此角色授予收集者访问您的 VPC 资源和写入所选目的地的权限。无需手动设置角色。有关更多信息,请参阅《亚马逊Prometheus托管服务用户指南》中的使用服务相关角色。

  • 互联网或 VPC 终端节点 -收集器子网必须能够访问目标服务。如果您的子网无法访问互联网,请在同一 VPC 和子网中创建接口 VPC 终端节点。用com.amazonaws.region.aps-workspaces于 Prometheus 工作空间目标的亚马逊托管服务,或com.amazonaws.region.monitoring用作数据集目标。 CloudWatch

为收集器配置安全组

我们建议为托管收集器创建专用的安全组,而不是重复使用现有的安全组。专门的小组为您提供遵循最小权限原则的明确、可审计的规则。

重要

该enable_http设置在端口 6817 上暴露了未经身份验证的 HTTP 端点。将此端口的入站访问权限仅限于收集器的安全组。不允许对该端口进行广泛的网络访问(例如 CIDR 范围)。

以下过程使用 shell 变量作为安全组 ID。在运行命令之前设置以下变量:

  • VPC_ID— 您的 PC AWS S 集群所在的 VPC 的 ID。

  • CLUSTER_SG_ID— 连接到您的集群的安全组(您在创建集群时指定的安全组)的 ID。

  • VPCE_SG_ID— 连接到您的接口 VPC 终端节点的安全组的 ID。仅当您的收集器子网通过接口 VPC 终端节点而不是通过互联网或 NAT 出口到达目标服务时,才需要此变量。该终端节点com.amazonaws.region.aps-workspaces用于 Prometheus 的亚马逊托管服务工作空间目标或数据com.amazonaws.region.monitoring集目标。 CloudWatch

为托管配置安全组 Prometheus 收藏家
  1. 为收集器创建专用的安全组并获取组 ID:

    COLLECTOR_SG_ID=$(aws ec2 create-security-group \ --group-name "pcs-prometheus-collector" \ --description "Security group for managed Prometheus collector" \ --vpc-id "$VPC_ID" \ --query 'GroupId' \ --output text)
  2. 向集群的安全组添加入站规则,允许来自收集器安全组的端口 6817 上的 TCP 流量。此规则允许收集器抓取控制器上的Slurm指标端点。

    使用该--ip-permissions表单添加可审计性规则描述:

    aws ec2 authorize-security-group-ingress \ --group-id "$CLUSTER_SG_ID" \ --ip-permissions \ 'IpProtocol=tcp,FromPort=6817,ToPort=6817,UserIdGroupPairs=[{GroupId='"$COLLECTOR_SG_ID"',Description="Prometheus collector scrapes Slurm metrics"}]'

    或者,您可以使用不带规则描述的较短形式:

    aws ec2 authorize-security-group-ingress \ --group-id "$CLUSTER_SG_ID" \ --protocol tcp \ --port 6817 \ --source-group "$COLLECTOR_SG_ID"
  3. (可选)锁定收集器安全组上的出站流量。默认情况下,新创建的安全组允许所有出站流量。如果您想强制执行 “仅限显式出口” 以实现更高的安全状态,请撤消默认的 “全部允许” 规则,仅添加收集器所需的出口规则。

    撤销默认的 “允许所有出口” 规则:

    aws ec2 revoke-security-group-egress \ --group-id "$COLLECTOR_SG_ID" \ --ip-permissions '[{"IpProtocol":"-1","IpRanges":[{"CidrIp":"0.0.0.0/0"}]}]'

    添加明确的出口规则,允许收集器在 TCP 6817 上到达控制器:

    aws ec2 authorize-security-group-egress \ --group-id "$COLLECTOR_SG_ID" \ --ip-permissions \ 'IpProtocol=tcp,FromPort=6817,ToPort=6817,UserIdGroupPairs=[{GroupId='"$CLUSTER_SG_ID"',Description="Egress to Slurm controller for metrics scraping"}]'

    为 HTTPS (TCP 443) 添加明确的出口规则,以到达指标交付目的地(适用于 Prometheus 的亚马逊托管服务或): CloudWatch

    aws ec2 authorize-security-group-egress \ --group-id "$COLLECTOR_SG_ID" \ --ip-permissions \ 'IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges=[{CidrIp=0.0.0.0/0,Description="HTTPS egress for metrics delivery"}]'

    要加强对使用 VPC 终端节点进行传输的子网的控制,请将 CIDR 范围替换为 VPC 终端节点的安全组:

    aws ec2 authorize-security-group-egress \ --group-id "$COLLECTOR_SG_ID" \ --ip-permissions \ 'IpProtocol=tcp,FromPort=443,ToPort=443,UserIdGroupPairs=[{GroupId='"$VPCE_SG_ID"',Description="HTTPS egress to VPC endpoint for metrics delivery"}]'
    注意

    如果您没有撤消默认出口规则,则可以跳过此步骤。默认规则已经允许所有出站流量,包括流向端口 6817 和端口 443 的流量。

  4. (隔离集群)如果您的收集器子网无法访问互联网并使用接口 VPC 终端节点访问目标服务,请向 VPC 终端节点的安全组添加入站规则。此规则允许收集器的 HTTPS 流量到达端点网络接口。这是一个经常错过的步骤。

    aws ec2 authorize-security-group-ingress \ --group-id "$VPCE_SG_ID" \ --ip-permissions \ 'IpProtocol=tcp,FromPort=443,ToPort=443,UserIdGroupPairs=[{GroupId='"$COLLECTOR_SG_ID"',Description="Managed collector reaches service endpoint"}]'
注意

作为一种更简单但限制较少的替代方案,如果控制器的现有安全组包含允许来自自身的流量的自引用规则,则可以将控制器的现有安全组连接到收集器。这无需创建专用群组即可满足连接要求。

例如,如果您的集群的安全组 (sg-0abc1234def56789a) 已经允许来自其自身的所有 TCP 流量,请在创建抓取器时在--security-group-ids参数中传递该安全组 ID:

aws amp create-scraper \ --source '{"vpcConfiguration":{"subnetIds":["subnet-id-1","subnet-id-2"],"securityGroupIds":["sg-0abc1234def56789a"]}}' \ ...

但是,前述程序中描述的专用安全组方法通过明确的可审计规则提供了更高的安全门槛。

有关安全组规则的更多信息,请参阅Amazon VPC 用户指南中的安全组规则。

创建托管收集器

使用创建 VPC-connected 托管收集器,该 AWS CLI 收集器会抓取您的集群控制器并将指标传送到您选择的目的地。

为创建托管收集器 Slurm metrics
  1. 将抓取配置保存到名为的本地 YAML 文件中。scrape-config.yaml有关建议的配置,请参阅建议的抓取配置。

  2. 使用以下结构创建名create-scraper-input.json为 JSON 输入文件。选择与你的目标相匹配的destination方块。

    { "source": { "vpcConfiguration": { "subnetIds": ["subnet-1", "subnet-2"], "securityGroupIds": ["sg-collector"] } }, "destination": { ... }, "scrapeConfiguration": { "configurationBlob": "raw-yaml-contents" } }

    进行如下替换:

    • subnet-1和 subnet-2 — 在与集群控制器同一 VPC 内的不同可用区中至少有两个子网 ID。

    • sg-collector— 托管收集器的安全组 ID。

    • raw-yaml-contents— scrape-config.yaml 文件的全文,粘贴为单个 JSON 字符串值。 AWS CLI base64 会自动对线路上的值进行编码。

    对于该destination字段,使用以下选项之一:

    目的地:适用于 Prometheus 工作区的亚马逊托管服务

    "destination": { "ampConfiguration": { "workspaceArn": "arn:aws:aps:region:account-id:workspace/workspace-id" } }

    目标: CloudWatch 数据集

    "destination": { "cloudWatchConfiguration": { "datasetArn": "arn:aws:cloudwatch:region:account-id:dataset/default" } }

    有关完整参数集,请参阅《命令参考》中的 create-scraper。AWS CLI

  3. 创建刮板:

    aws amp create-scraper --cli-input-json file://create-scraper-input.json

    该命令返回 ascraperId,状态为CREATING。

  4. 等待刮刀状态更改为ACTIVE(通常为 5—15 分钟):

    aws amp describe-scraper --scraper-id scraper-id

    scraper-id替换为上一步中返回的 ID。在抓取器达到ACTIVE状态之前,您无法将其删除。

查找集群控制器终端节点

抓取配置需要您的 AWS PCS 集群控制器的私有 IP 地址。使用以下方法之一进行查找。

AWS 管理控制台
  1. 在以下位置打开 AWS PCS 控制台https://console.aws.amazon.com/pcs/。

  2. 从列表中选择您的集群。

  3. 在集群配置详细信息中,找到 “终端节点” 部分。

  4. 记下Slurm控制器的私有 IP 地址和端口 (slurmctld)。端口是 6817。

AWS CLI
  1. 运行如下命令。cluster-identifier替换为您的集群名称或 ID。

    aws pcs get-cluster --cluster-identifier cluster-identifier

    在响应中,找到endpoints数组中的SLURMCTLD条目。该privateIpAddress值是抓取配置所需的控制器端点。示例如下:

    "endpoints": [ { "type": "SLURMCTLD", "privateIpAddress": "192.0.2.1", "port": "6817" }, { "type": "SLURMRESTD", "privateIpAddress": "192.0.2.1", "port": "6820" } ]

    使用SLURMCTLD条目privateIpAddress中的内容(端口 6817)作为抓取配置中的controller-endpoint值。

  2. 或者,直接仅提取控制器 IP 地址:

    aws pcs get-cluster --cluster-identifier cluster-identifier \ --query 'cluster.endpoints[?type==`SLURMCTLD`].privateIpAddress' \ --output text

建议的抓取配置

以下 YAML 配置从集群控制器中抓取了四个Slurm指标终端节点(作业、节点、调度程序和分区)。每个终端节点都被定义为一项单独的任务,因此您可以在查询中按来源识别指标。

global: scrape_interval: 60s scrape_timeout: 30s scrape_configs: - job_name: 'slurm-jobs' metrics_path: /metrics/jobs static_configs: - targets: - 'controller-endpoint:6817' relabel_configs: - target_label: cluster replacement: 'my-cluster-name' - job_name: 'slurm-nodes' metrics_path: /metrics/nodes static_configs: - targets: - 'controller-endpoint:6817' relabel_configs: - target_label: cluster replacement: 'my-cluster-name' - job_name: 'slurm-scheduler' metrics_path: /metrics/scheduler static_configs: - targets: - 'controller-endpoint:6817' relabel_configs: - target_label: cluster replacement: 'my-cluster-name' - job_name: 'slurm-partitions' metrics_path: /metrics/partitions static_configs: - targets: - 'controller-endpoint:6817' relabel_configs: - target_label: cluster replacement: 'my-cluster-name'

进行如下替换:

  • controller-endpoint— 您的 AWS PCS 集群控制器的私有 IP 地址。有关查找此值的说明,请参阅查找集群控制器终端节点。

  • my-cluster-name— 用于标识您的集群的标签。该relabel_configs方块在该刮刀上的每个指标上都贴有cluster标签。务必在cluster标签上筛选查询。未在标签上盖章的刮刀上的系列在老化之前会显示为重复的未贴标签系列。

托管收集scrape_interval器的最小值为 30 秒。此配置使用 60 秒,因为抓取会给Slurm控制器带来负载 (slurmctld)。查询指标会获取内部锁定并读取内存中的数据结构。此活动可能会影响繁忙集群上的调度程序性能。《Slurm指标指南》建议采集间隔为 60—120 秒,以最大限度地减少对性能的影响。

注意

此配置不包括/metrics/jobs-users-accts端点。Slurm文档警告说,此端点会生成无限数量的序列,不适合存储监控。也不要抓取裸/metrics索引,因为它会将所有子端点数据合并为一个响应。

有关支持的抓取配置选项的更多信息,请参阅亚马逊 CloudWatch 用户指南中的抓取器配置。

验证指标交付

抓取器达到ACTIVE状态后,第一个数据点大约在一个抓取间隔加上交付时间后出现。使用与您的目的地相匹配的验证方法。

验证向适用于 Prometheus 的亚马逊托管服务工作空间的配送

发送 SigV4-signed 请求以列出工作空间中的可用指标名称:

awscurl --service aps --region region \ "https://aps-workspaces.region.amazonaws.com/workspaces/workspace-id/api/v1/label/__name__/values"

呼叫主体需求aps:QueryMetrics和aps:GetLabels权限(或AmazonPrometheusQueryAccess托管策略)。

验证 CloudWatch 数据集的交付

发送 SigV4-signed 请求以列出 CloudWatch数据集中的可用指标名称:

awscurl --service monitoring --region region \ "https://monitoring.region.amazonaws.com/api/v1/label/__name__/values"

呼叫主体的需求cloudwatch:GetMetricData和cloudwatch:ListMetrics权限。

重要

传送到 CloudWatch 数据集的指标存储为 OpenTelemetry (oTel) 指标。它们不会出现在经典 CloudWatch 指标命名空间浏览器中,也不会出现在的输出中aws cloudwatch list-metrics。你必须使用来查询它们PromQL。

对于任一目的地,查找以开头的指标名称 slurm_slurm_nodes,例如slurm_jobs_running、或slurm_node_cpus。如果未显示任何Slurm指标,请验证以下内容:

  • 刮刀状态为。ACTIVE

  • 安全组规则允许收集器访问控制器上的端口 6817。

  • 集群上已启用Slurm指标终端节点。

Query Slurm 指标有 PromQL

您可以使用查询收集的Slurm指标PromQL。同样的查询适用于任一目的地。查询方法取决于您交付指标的位置。

查询 Prometheus 工作空间的亚马逊托管服务

  • HTTP API — 向https://aps-workspaces.region.amazonaws.com/workspaces/workspace-id/api/v1/query或发送 SigV4-signed 请求(服务名称aps)/api/v1/query_range。

  • Grafana— 添加具有 SigV4 身份验证和服务名称Prometheus的数据源。aps有关使用进行查询的说明Grafana,请参阅《亚马逊普罗米修斯托管服务用户指南》中的使用 Grafana 进行查询。

以下示例用于awscurl从适用于 Prometheus 的亚马逊托管服务工作空间中查询正在运行的任务:

awscurl --service aps --region region \ -X POST "https://aps-workspaces.region.amazonaws.com/workspaces/workspace-id/api/v1/query" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "query=slurm_jobs_running"

呼叫主体需要aps:QueryMetricsaps:GetMetricMetadata、aps:GetSeries、和aps:GetLabels权限(或AmazonPrometheusQueryAccess托管策略)。

查询 CloudWatch 数据集

  • CloudWatch 控制台 — 打开 CloudWatch,选择 Query Studio,然后从查询语言菜单中选择 PromQL。

  • HTTP API — 向https://monitoring.region.amazonaws.com/api/v1/query或发送 SigV4-signed 请求(服务名称monitoring)/api/v1/query_range。

  • Grafana— 添加带有 URL https://monitoring.region.amazonaws.com、SigV4 身份验证和服务名称Prometheus的数据源。monitoring有关使用 PromQL in 查询 CloudWatch 指标的说明Grafana,请参阅《亚马逊托管 Grafana 用户指南》中的 “在 Grafana 中使用 PromQL 查询 CloudWatch 指标”。

以下示例用于awscurl从 CloudWatch数据集中查询正在运行的作业:

awscurl --service monitoring --region region \ -X POST "https://monitoring.region.amazonaws.com/api/v1/query" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "query=slurm_jobs_running"

呼叫主体的需求cloudwatch:GetMetricData和cloudwatch:ListMetrics权限。

示例 PromQL 查询

以下查询适用于任一目的地。my-cluster-name替换为您在抓取配置的cluster重新标签中设置的值。

CPU 利用率百分比
100 * slurm_node_cpus_alloc{cluster="my-cluster-name"} / slurm_node_cpus{cluster="my-cluster-name"}
待处理任务(队列待办事项)
slurm_jobs_pending{cluster="my-cluster-name"}
运行任务
slurm_jobs_running{cluster="my-cluster-name"}
作业吞吐量
slurm_jobs_completed{cluster="my-cluster-name"}

有关可用指标和抓取配置的更多信息,请参阅Slurm网站上的指标指南。