

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

# 排查扩展问题
<a name="troubleshooting-v3-scaling-issues"></a>

本节与使用 3.0.0 及更高 AWS ParallelCluster 版本使用Slurm作业调度程序安装的集群相关。有关配置多个队列的更多信息，请参阅[多个队列的配置](configuration-of-multiple-queues-v3.md)。

如果您的一个正在运行的集群遇到问题，请在开始排查问题之前，通过运行以下命令将该集群置于 `STOPPED` 状态。这样可以防止产生任何意外成本。

```
$ pcluster update-compute-fleet --cluster-name mycluster \
   --status STOP_REQUESTED
```

您可以使用 [`pcluster list-cluster-log-streams`](pcluster.list-cluster-log-streams-v3.md) 命令，并通过使用其中一个失败节点或头节点的 `private-dns-name` 进行筛选，列出集群节点中可用的日志流。

```
$ pcluster list-cluster-log-streams --cluster-name mycluster --region eu-west-1 \
 --filters 'Name=private-dns-name,Values=ip-10-0-0-101'
```

然后，您可以通过使用 [`pcluster get-cluster-log-events`](pcluster.get-cluster-log-events-v3.md) 命令并传递与下一节中提及的其中一个关键日志相对应的 `--log-stream-name`，检索日志流的内容并进行分析：

```
$ pcluster get-cluster-log-events --cluster-name mycluster \
--region eu-west-1 --log-stream-name ip-10-0-0-13.i-04e91cc1f4ea796fe.cfn-init
```

AWS ParallelCluster 在 CloudWatch 日志组中创建集群日志流。您可以在控制台的 “**自定义 CloudWatch 控制面板**” 或 “日志” **组中查看这些日志**。有关更多信息，请参阅[与 Amazon CloudWatch 日志集成](cloudwatch-logs-v3.md)和[亚马逊 CloudWatch 控制面板](cloudwatch-dashboard-v3.md)。

**Topics**
+ [用于调试的关键日志](#troubleshooting-v3-key-logs)
+ [运行作业失败时在 `slurm_resume.log` 中看到“`InsufficientInstanceCapacity`”错误，或创建集群失败时在 `clustermgtd.log` 中看到该错误](#compute-node-initialization-ice-failure-v3-c2)
+ [排查节点初始化问题](#troubleshooting-v3-node-init)
+ [**排查意外节点替换和终止问题**](#troubleshooting-v3-unexpected-node-replacements-and-terminations)
+ [**替换、终止或关闭有问题的实例和节点**](#replacing-terminating-or-powering-down-problematic-instances-and-nodes-v3)
+ [队列（分区）`Inactive` 状态](#troubleshooting-v3-queues)
+ [排查其他已知的节点和作业问题](#troubleshooting-v3-other-node-job-issues)

## 用于调试的关键日志
<a name="troubleshooting-v3-key-logs"></a>

下表概述了头节点的关键日志：
+  `/var/log/cfn-init.log`- CloudFormation 这是初始化日志。其中包含设置实例时运行的所有命令。可以用它来排查初始化问题。
+  `/var/log/chef-client.log`：这是 Chef 客户端日志。其中包含通过 Chef/CINC 运行的所有命令。可以用它来排查初始化问题。
+  `/var/log/parallelcluster/slurm_resume.log`：这是 `ResumeProgram` 日志。它启动动态节点的实例。可以用它来排查动态节点启动问题。
+  `/var/log/parallelcluster/slurm_suspend.log`：这是 `SuspendProgram` 日志。在终止动态节点的实例时会调用该日志。可以用它来排查动态节点终止问题。查看此日志时，还应检查 `clustermgtd` 日志。
+  `/var/log/parallelcluster/clustermgtd`：这是 `clustermgtd` 日志。它作为集中式进程守护程序运行，用于管理大多数集群操作。可以用它来排查任何启动、终止或集群操作问题。
+  `/var/log/slurmctld.log`-这是Slurm控制守护程序日志。 AWS ParallelCluster 不会做出扩展决策。相反，它只会尝试启动资源来满足 Slurm 的要求。它可用于排查扩展和分配问题、与作业相关的问题以及与调度器相关的任何启动和终止问题。
+  `/var/log/parallelcluster/compute_console_output`：此日志记录意外终止的静态计算节点样本子集的控制台输出。如果静态计算节点终止并且计算节点日志在中不可用，则使用此日志 CloudWatch。当您使用 Amazon EC2 控制台或检索实例控制台输出时 AWS CLI ，您收到的`compute_console_output log`内容是相同的。

以下是计算节点的关键日志：
+  `/var/log/cloud-init-output.log`：这是 [cloud-init](https://cloudinit.readthedocs.io/) 日志。其中包含设置实例时运行的所有命令。可以用它来排查初始化问题。
+  `/var/log/parallelcluster/computemgtd`：这是 `computemgtd` 日志。它在每个计算节点上运行，用于在头节点上的 `clustermgtd` 进程守护程序离线的不常见事件中监控节点。可以用它来排查意外终止问题。
+  `/var/log/slurmd.log` - 这是 Slurm 计算进程守护程序日志。可以用它来排查初始化和计算失败问题。

## 运行作业失败时在 `slurm_resume.log` 中看到“`InsufficientInstanceCapacity`”错误，或创建集群失败时在 `clustermgtd.log` 中看到该错误
<a name="compute-node-initialization-ice-failure-v3-c2"></a>

如果集群使用 Slurm 调度器，则会遇到容量不足问题。如果发出实例启动请求时没有足够的可用实例，则会返回 `InsufficientInstanceCapacity` 错误。

对于静态实例容量，您可以在 `/var/log/parallelcluster/clustermgtd` 中的 `clustermgtd` 日志中找到该错误。

对于动态实例容量，您可以在 `/var/log/parallelcluster/slurm_resume.log` 中的 `ResumeProgram` 日志中找到该错误。

消息与以下示例类似：

```
An error occurred (InsufficientInstanceCapacity) when calling the RunInstances/CreateFleet operation...
```

根据您的用例，请考虑使用以下方法之一来避免收到这些类型的错误消息：
+ 如果启用了置放群组，则将其禁用。有关更多信息，请参阅 [置放群组和实例启动问题](troubleshooting-v3-placemment-groups.md)。
+ 为实例预留容量并使用 ODCR（按需容量预留）启动这些实例。有关更多信息，请参阅 [使用按需容量预留（ODCR）启动实例](launch-instances-odcr-v3.md)。
+ 配置多个具有不同实例类型的计算资源。如果您的工作负载不需要特定的实例类型，则可以对多个计算资源利用快速容量不足故障转移。有关更多信息，请参阅 [Slurm 集群快速容量不足故障转移](slurm-short-capacity-fail-mode-v3.md)。
+ 在同一个计算资源中配置多种实例类型，并利用多实例类型分配。有关配置多个实例的更多信息，请参阅 [Slurm 的多实例类型分配](slurm-multiple-instance-allocation-v3.md)和 [`Scheduling`](Scheduling-v3.md)/[`SlurmQueues`](Scheduling-v3.md#Scheduling-v3-SlurmQueues)/[`ComputeResources`](Scheduling-v3.md#Scheduling-v3-SlurmQueues-ComputeResources)/[`Instances`](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-ComputeResources-Instances)。
+ 通过在集群配置 [`Scheduling`](Scheduling-v3.md)/[`SlurmQueues`](Scheduling-v3.md#Scheduling-v3-SlurmQueues)/[`Networking`](Scheduling-v3.md#Scheduling-v3-SlurmQueues-Networking)/[`SubnetIds`](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-Networking-SubnetIds) 中更改子网 ID，将队列移动到不同的可用区。
+ 如果您的工作负载没有紧密耦合，则将队列分散到不同的可用区。有关配置多个子网的更多信息，请参阅 [`Scheduling`](Scheduling-v3.md)/[`SlurmQueues`](Scheduling-v3.md#Scheduling-v3-SlurmQueues)/[`Networking`](Scheduling-v3.md#Scheduling-v3-SlurmQueues-Networking)/[`SubnetIds`](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-Networking-SubnetIds)。

## 排查节点初始化问题
<a name="troubleshooting-v3-node-init"></a>

本节介绍如何排查节点初始化问题。这包括节点无法启动、开机或加入集群的问题。

**Topics**
+ [头节点](#troubleshooting-v3-node-init.head-node)
+ [计算节点](#troubleshooting-v3-node-init.compute-node)

### 头节点
<a name="troubleshooting-v3-node-init.head-node"></a>

适用日志：
+  `/var/log/cfn-init.log` 
+  `/var/log/chef-client.log` 
+  `/var/log/parallelcluster/clustermgtd` 
+  `/var/log/parallelcluster/slurm_resume.log` 
+  `/var/log/slurmctld.log` 

检查 `/var/log/cfn-init.log` 和 `/var/log/chef-client.log` 日志或相应的日志流。这些日志包含设置头节点时运行的所有操作。设置过程中发生的大多数错误的错误消息应该都包含在 `/var/log/chef-client.log` 日志中。如果在集群的配置中指定了 `OnNodeStart` 或 `OnNodeConfigured` 脚本，请通过日志消息仔细检查脚本是否成功运行。

创建集群时，头节点必须等待计算节点加入集群，然后才能加入集群。因此，如果计算节点加入集群失败，则头节点也会失败。根据您使用的计算节点的类型，您可以按照其中一组过程来排查此类问题：

### 计算节点
<a name="troubleshooting-v3-node-init.compute-node"></a>
+ 适用日志：
  + `/var/log/cloud-init-output.log`
  + `/var/log/slurmd.log`
+ 如果启动了计算节点，请先检查 `/var/log/cloud-init-output.log`，其中应包含类似于头节点 `/var/log/chef-client.log` 日志的设置日志。设置过程中发生的大多数错误的错误消息应该都包含在 `/var/log/cloud-init-output.log` 日志中。如果在集群配置中指定了预安装或安装后脚本，请检查它们是否成功运行。
+ 如果您使用的是修改了 Slurm 配置的自定义 AMI，则可能存在阻止计算节点加入集群的 Slurm 相关错误。对于与调度器相关的错误，请检查 `/var/log/slurmd.log` 日志。

**动态计算节点：**
+ 搜索计算节点名称的 `ResumeProgram` 日志 (`/var/log/parallelcluster/slurm_resume.log`) 以查看是否对该节点调用过 `ResumeProgram`。（如果`ResumeProgram`从未被调用，则可以查看`slurmctld`日志 (`/var/log/slurmctld.log`) 以确定是否尝试Slurm过`ResumeProgram`使用该节点进行调用）。
+ 请注意，`ResumeProgram` 的权限不正确可能会导致 `ResumeProgram` 静默失败。如果您使用的是修改了 `ResumeProgram` 设置的自定义 AMI，请检查该 `ResumeProgram` 是否由 `slurm` 用户拥有并具有 `744` (`rwxr--r--`) 权限。
+ 如果调用了 `ResumeProgram`，请查看是否为该节点启动了实例。如果未启动任何实例，则会看到一条描述启动失败的错误消息。
+ 如果启动了实例，则在设置过程中可能出现了问题。您应该会从 `ResumeProgram` 日志中看到相应的私有 IP 地址和实例 ID。此外，您可以查看特定实例的相应设置日志。有关排查计算节点设置错误的更多信息，请参阅下一节。

 **静态计算节点：**
+ 检查 `clustermgtd` (`/var/log/parallelcluster/clustermgtd`) 日志，查看是否为该节点启动了实例。如果它们没有启动，则应该有明确的错误消息详细说明启动失败的原因。
+ 如果启动了实例，则表示设置过程中出现了问题。您应该会从 `ResumeProgram` 日志中看到相应的私有 IP 地址和实例 ID。此外，您可以查看特定实例的相应设置日志。

 **由竞价型实例支持的计算节点：**
+ 如果这是您第一次使用竞价型实例，并且作业保持在 PD（待处理状态），请仔细检查 `/var/log/parallelcluster/slurm_resume.log` 文件。您可能会发现类似下面的错误：

  ```
  2022-05-20 13:06:24,796 - [slurm_plugin.common:add_instances_for_nodes] - ERROR - Encountered exception when launching instances for nodes (x1) ['spot-dy-t2micro-2']: An error occurred (AuthFailure.ServiceLinkedRoleCreationNotPermitted) when calling the RunInstances operation: The provided credentials do not have permission to create the service-linked role for Amazon EC2 Spot Instances.
  ```

  使用竞价型实例时，您的账户中必须存在 `AWSServiceRoleForEC2Spot` 服务相关角色。要使用在您的账户中创建此角色 AWS CLI，请运行以下命令：

  ```
  $ aws iam create-service-linked-role --aws-service-name spot.amazonaws.com
  ```

  有关更多信息，请参阅 Amazon EC2 AWS ParallelCluster 用户指南[使用竞价型实例](spot-v3.md)中的用户指南和 *Amazon EC2 用户指南*中[竞价型实例请求的服务相关角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-requests.html#service-linked-roles-spot-instance-requests)。

## **排查意外节点替换和终止问题**
<a name="troubleshooting-v3-unexpected-node-replacements-and-terminations"></a>

本节继续探讨如何排查节点相关问题，特别是在节点意外替换或终止时。
+ **适用日志：**
  + `/var/log/parallelcluster/clustermgtd`（头节点）
  + `/var/log/slurmctld.log`（头节点）
  + `/var/log/parallelcluster/computemgtd`（计算节点）

 **节点意外替换或终止** 
+  检查 `clustermgtd` 日志 (`/var/log/parallelcluster/clustermgtd`) 以查看 `clustermgtd` 是否替换或终止了节点。请注意，`clustermgtd` 处理所有正常的节点维护操作。
+  如果 `clustermgtd` 替换或终止了该节点，则应该会有详细说明为何对该节点执行此操作的消息。如果原因与调度器有关（例如，因为节点处于 `DOWN` 状态），请查看 `slurmctld` 日志以获取更多信息。如果原因与 Amazon EC2 有关，则应有信息性消息，详细说明需要该替换的 Amazon EC2 相关问题。
+  如果`clustermgtd`没有终止节点，请先检查这是否是 Amazon EC2 的预期终止，更具体地说是即时终止。 `computemgtd`，在计算节点上运行，如果节点`clustermgtd`被确定为运行状况不佳，也可以终止节点。检查 `computemgtd` 日志 (`/var/log/parallelcluster/computemgtd`) 以查看 `computemgtd` 是否终止了该节点。

 **节点失败** 
+ 检查 `slurmctld` 日志 (`/var/log/slurmctld.log`) 以查看作业或节点失败的原因。请注意，如果节点失败，作业会自动重新排队。
+ 如果 `slurm_resume` 报告该节点已启动，并且 `clustermgtd` 在几分钟后报告 Amazon EC2 中没有该节点的相应实例，则该节点可能在设置过程中失败。要从计算 (`/var/log/cloud-init-output.log`) 中检索日志，请执行以下步骤：
  + 提交一项作业以便让 Slurm 启动一个新节点。
  + 等待计算节点启动。
  + 修改实例启动的关闭行为，以便停止而不是终止出现故障的计算节点。

    ```
    $ aws ec2 modify-instance-attribute \
        --instance-id i-1234567890abcdef0 \
        --instance-initiated-shutdown-behavior "{\"Value\": \"stop\"}"
    ```
  + 启用终止保护。

    ```
    $ aws ec2 modify-instance-attribute \
        --instance-id i-1234567890abcdef0 \
        --disable-api-termination
    ```
  + 将节点标记为易于识别。

    ```
    $ aws ec2 create-tags \
        --resources i-1234567890abcdef0 \
        --tags Key=Name,Value=QUARANTINED-Compute
    ```
  + 通过更改 `parallelcluster:cluster-name` 标签将节点与集群分离。

    ```
    $ aws ec2 create-tags \
        --resources i-1234567890abcdef0 \
        --tags Key=parallelcluster:clustername,Value=QUARANTINED-ClusterName
    ```
  + 使用以下命令从该节点检索控制台输出。

    ```
    $ aws ec2 get-console-output --instance-id i-1234567890abcdef0 --output text
    ```

## **替换、终止或关闭有问题的实例和节点**
<a name="replacing-terminating-or-powering-down-problematic-instances-and-nodes-v3"></a>
+ **适用日志：**
  + `/var/log/parallelcluster/clustermgtd`（头节点）
  + `/var/log/parallelcluster/slurm_suspend.log`（头节点）
+ 在大多数情况下，`clustermgtd` 会处理所有预期的实例终止操作。检查 `clustermgtd` 日志以查看其无法替换或终止节点的原因。
+ 对于 [`SlurmSettings` 属性](Scheduling-v3.md#Scheduling-v3-SlurmSettings.properties) 失败的动态节点，请检查 `SuspendProgram` 日志以查看 `slurmctld` 是否以特定节点作为参数调用了 `SuspendProgram`。请注意，`SuspendProgram` 实际上并不执行任何操作，它只是记录被调用时的时间。所有实例终止和 `NodeAddr` 重置均由 `clustermgtd` 完成。经过 `SuspendTimeout` 之后，Slurm 会自动将节点置回 `POWER_SAVING` 状态。
+ 如果计算节点由于引导失败而持续失败，请验证它们是否在启用了 [Slurm 集群保护模式](slurm-protected-mode-v3.md)的情况下启动。如果未启用受保护模式，请修改受保护模式设置以启用受保护模式。排查并修复引导脚本问题。

## 队列（分区）`Inactive` 状态
<a name="troubleshooting-v3-queues"></a>

如果您运行 `sinfo` 并且输出显示队列的 `AVAIL` 状态为 `inact`，则您的集群可能启用了 [Slurm 集群保护模式](slurm-protected-mode-v3.md)，并且队列已在预定义的时间段内设置为 `INACTIVE` 状态。

## 排查其他已知的节点和作业问题
<a name="troubleshooting-v3-other-node-job-issues"></a>

另一种已知问题是 AWS ParallelCluster 可能无法分配工作岗位或做出扩展决策。对于此类问题， AWS ParallelCluster 只按照 Slurm 的指示启动、终止或维护资源。对于这些问题，请查看 `slurmctld` 日志以排查问题。