

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 最佳實務
<a name="best-practices"></a>

## Amazon 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 受管字首清單的詳細資訊，請參閱使用](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-aws-managed-prefix-lists.html) AWS 受管字首清單。

## 單一聯絡限制
<a name="single-contact-limitation"></a>

 AWS Ground Station Agent 支援每個聯絡人的多個串流，但一次僅支援單一聯絡人。為了防止排程問題，請勿在多個資料流程端點群組之間共用執行個體。如果單一代理程式組態與多個不同的 DFEG ARNs 相關聯，將無法註冊。

## 與 AWS Ground Station 客服人員一起執行服務和程序
<a name="avoiding-contested-cores"></a>

 在與 AWS Ground Station 代理程式相同的 EC2 執行個體上啟動服務和程序時，請務必將其繫結至 AWS Ground Station 代理程式和 Linux 核心未使用的 vCPUs，因為這可能會導致瓶頸，甚至在聯絡期間遺失資料。此繫結至特定 vCPUs 的概念稱為親和性。

要避免的核心：
+ `agentCpuCores` 從 [代理程式組態檔案](configuring-agent.md#agent-config-file)
+ 來自 [調校硬體中斷和接收佇列 - 影響 CPU 和網路](ec2-instance-performance-tuning.md#tune-hardware-interrupts) 的 `interrupt_core_list`。
  + 預設值可從 找到 [附錄：中斷/RPS 調校的建議參數](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`

### 簡化服務 （系統化）
<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>
```

 如需詳細資訊，請造訪：[Red Hat Enterprise 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 man 頁面](https://linux.die.net/man/1/taskset)