

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

# 最佳实践
<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-managed 前缀列表。有关 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 ARN 相关联，则注册失败。

## 在旁边运行服务和进程AWS Ground Station座席
<a name="avoiding-contested-cores"></a>

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

要避免使用的内核：
+ `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) 手册页