

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

# 最佳实践
<a name="best-practices"></a>

## 亚马逊 EC2 最佳实践
<a name="best-practices-ec2"></a>

 遵循当前的 EC2 最佳实践，并确保足够的数据存储可用性。

[https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-best-practices.html](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-best-practices.html)

## Linux 调度器
<a name="linux-scheduler"></a>

如果相应的进程未固定到特定内核，Linux 计划程序可以重新排序 UDP 套接字上的数据包。在数据传输期间，任何发送或接收 UDP 数据的线程都应将自己固定在特定内核上。

## AWS Ground Station 托管前缀列表
<a name="managed-prefix-list-best-practice"></a>

在指定允许从天线通信的网络规则时，建议使用 `com.amazonaws.global.groundstation` AWS 托管前缀列表。有关 AWS 托管前缀列表的更多信息，请参阅[使用 Amazon 托管前缀列](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-aws-managed-prefix-lists.html)表。

## 单次联络限制
<a name="single-contact-limitation"></a>

 AWS Ground Station 座席支持每次联络有多个数据流，但一次只支持一个联络。为防止出现计划问题，请勿在多个数据流端点组之间共享实例。如果单个代理配置与多个不同的 DFEG 相关联 ARNs，则注册失败。

## 与 AWS Ground Station 代理一起运行服务和进程
<a name="avoiding-contested-cores"></a>

 在与代理相同的 EC2 实例上启动服务和进程时，务必将它们绑定到 AWS Ground Station AWS Ground Station 代理和 Linux 内核CPUs 未使用的 v 上，因为这可能会导致瓶颈，甚至在联系期间丢失数据。这种绑定到特定 v 的概念CPUs 被称为亲和力。

要避免使用的内核：
+ `agentCpuCores`从[代理配置文件](configuring-agent.md#agent-config-file)
+ 来自 [调整硬件中断和接收队列-影响 CPU 和网络](ec2-instance-performance-tuning.md#tune-hardware-interrupts) 的 `interrupt_core_list`。
  + 默认值可从中找到 [附录： interrupt/RPS Tune 的推荐参数](ec2-instance-performance-tuning.md#recommended-parameters)

### 举个使用`c5.24xlarge`实例的例子
<a name="avoiding-contested-cores-example"></a>

如果你指定了

`"agentCpuCores": [24,25,26,27,72,73,74,75]"`

然后跑了

`echo "@reboot sudo /opt/aws/groundstation/bin/set_irq_affinity.sh '0,1,48,49' 'ffffffff,ffffffff,ffffffff' >> /var/log/user-data.log 2>&1" >>/var/spool/cron/root`

然后避免使用以下内核：

`0,1,24,25,26,27,48,49,72,73,74,75`

### 亲和服务 (systemd)
<a name="avoiding-contested-cores-with-services"></a>

 新推出的服务将自动关联到`interrupt_core_list`前面提到的服务。如果您启动的服务的用例需要额外的内核，或者需要更少拥挤的内核，请按照本节进行操作。

使用以下命令检查您的服务当前配置的关联度：

```
systemctl show --property CPUAffinity <service name>
```

 如果你看到一个空值`CPUAffinity=`，比如，这意味着它很可能会使用上面命令中的默认内核 `...bin/set_irq_affinity.sh <using the cores here> ...` 

要覆盖并设置特定的关联性，请运行以下命令来查找服务文件的位置：

```
systemctl show -p FragmentPath <service name>
```

 打开并修改文件（使用`vi``nano`、等），然后将其放在如下`[Service]`部分`CPUAffinity=<core list>`中：

```
[Unit]
...

[Service]
...
CPUAffinity=2,3

[Install]
...
```

保存文件并重新启动服务以应用关联性：

```
systemctl daemon-reload
systemctl restart <service name>

# Additionally confirm by re-running
systemctl show --property CPUAffinity <service name>
```

 欲了解更多信息，请访问：[红帽企业 Linux 8-管理、监控和更新内核-第 27 章。使用 systemd 配置 CPU 关联和 NUMA 策略](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/assembly_configuring-cpu-affinity-and-numa-policies-using-systemd_managing-monitoring-and-updating-the-kernel)。

### 关联进程（脚本）
<a name="avoiding-contested-cores-with-processes"></a>

 强烈建议手动关联新启动的脚本和进程，因为默认的 Linux 行为允许它们使用计算机上的任何内核。

为避免任何正在运行的进程（例如 python、bash 脚本等）发生核心冲突，请使用以下命令启动该进程：

```
taskset -c <core list> <command>
# Example: taskset -c 8 ./bashScript.sh
```

 如果该进程已在运行，请使用诸如`pidof``top`、或之类的命令`ps`来查找特定进程的进程 ID (PID)。使用 PID，您可以看到当前与以下内容的亲和力：

```
taskset -p <pid>
```

 并且可以用以下方式对其进行修改：

```
taskset -p <core mask> <pid>
# Example: taskset -p c 32392 (which sets it to cores 0xc -> 0b1100 -> cores 2,3)
```

有关任务集的更多信息，请参阅[任务集-Linux](https://linux.die.net/man/1/taskset) 手册页