本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
调整您的 EC2 实例的性能
注意
如果您使用 CloudFormation 模板配置 AWS 资源,则会自动应用这些调整。如果您使用 AMI 或手动创建了 EC2 实例,则必须应用这些性能优化才能实现最可靠的性能。
请记住,应用任何优化后重启您的实例。
主题
调整硬件中断和接收队列-影响 CPU 和网络
本部分配置 systemd、SMP IRQ、接收数据包转向 (RPS) 和接收数据流转向 (RFS) 的 CPU 内核使用情况。有关基于您正在使用的实例类型的一组推荐设置,请参阅 附录: interrupt/RPS Tune 的推荐参数。
重要
仅限亚马逊 Linux 2023:在继续操作之前安装并启用 cron 守护程序。
sudo dnf install -y cronie sudo systemctl enable --now crond
本节和之后的两个部分添加了 @reboot crontab 条目,这些条目需要一个正在运行的 cron 守护程序才能在每次启动时生效。在 Amazon Linux 2023 上,默认情况下不会安装 cron 守护程序,因此,如果没有上面的命令,这些条目就会被写入但永远不会运行。在 Amazon Linux 2 上,cron 守护程序已经安装并启用;无需执行任何操作。
-
将 systemd 进程固定在远离座席 CPU 内核的位置。
-
将硬件中断请求路由到远离座席 CPU 内核的位置。
-
配置 RPS 以防止单个网络接口卡的硬件队列成为网络流量的瓶颈。
-
配置 RFS 以提高 CPU 缓存命中率,从而减少网络延迟。
RPM 提供的 set_irq_affinity.sh 脚本为您配置了以上所有功能。添加到 crontab,这样它就会应用于每次启动:
echo "@reboot sudo /opt/aws/groundstation/bin/set_irq_affinity.sh '${interrupt_core_list}' '${rps_core_mask}' >> /var/log/user-data.log 2>&1" >>/var/spool/cron/root
-
interrupt_core_list替换为为内核和操作系统保留的内核,通常是第一和第二个,以及超线程内核对。这不应与上面选择的内核重叠。(例如:“0,1,48,49” 表示超线程、96 个 CPU 的实例)。 -
rps_core_mask是一个十六进制位掩码,用于指定哪些 CPU 应处理传入数据包,每个数字代表 4 个 CPU。此外,还必须从右边开始每 8 个字符用逗号分隔。建议允许使用所有 CPU,并让缓存来处理平衡。-
要查看每种实例类型的推荐参数列表,请参阅 附录: interrupt/RPS Tune 的推荐参数。
-
-
96-CPU 实例的示例:
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
Tune Rx 中断合并-影响网络
中断合并有助于防止主机系统中出现过多的中断,并帮助提高网络吞吐量。使用此配置,可以收集数据包,并且每 128 微秒生成一个中断。添加到 crontab,这样它就会应用于每次启动:
echo "@reboot sudo ethtool -C ${interface} rx-usecs 128 tx-usecs 128 >>/var/log/user-data.log 2>&1" >>/var/spool/cron/root
-
替换
interface为配置为接收数据的网络接口(以太网适配器)。通常,这是eth0因为这是为 EC2 实例分配的默认网络接口。
调整 Rx 环形缓冲区-影响网络
增加 Rx 环形缓冲区的环形条目数,以防止在突发连接期间丢包或溢出。添加到 crontab,这样每次启动时都会正确设置它:
echo "@reboot sudo ethtool -G ${interface} rx 16384 >>/var/log/user-data.log 2>&1" >>/var/spool/cron/root
-
替换
interface为配置为接收数据的网络接口(以太网适配器)。通常,这是eth0因为这是为 EC2 实例分配的默认网络接口。 -
如果设置
c6i家庭实例,则需要修改命令以将环形缓冲区设置为8192,而不是16384。
设置内核启动参数(CPU C-State 和接口命名)-影响 CPU 和网络
这些内核启动参数通过设置intel_idle.max_cstate=1 processor.max_cstate=1 max_cstate=1来防止 CPU 空转。CPU 空闲可能会导致在联系开始时丢失数据包。这些参数还包括net.ifnames=0 biosdevname=0,将接收器的网络接口重命名为eth0。与本章中的其他调整步骤一样,这些参数将在中所述的重新启动时生效Reboot。您可以按相对于其他部分的任意顺序应用它们。
grubby用于设置内核参数。这适用于亚马逊 Linux 2023 (UEFI) 和亚马逊 Linux 2,因为grubby可以直接在两者上管理引导加载程序配置。
sudo grubby --update-kernel=ALL --args="console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 intel_idle.max_cstate=1 processor.max_cstate=1 max_cstate=1"
注意
该net.ifnames=0参数将在下次启动时将eth0网络接口重命名为。其他调整部分和代理配置目标eth0,因此建议使用这些参数并重新启动。如果您选择不应用这些参数,则接口将保留其默认名称(例如,ens5在 Amazon Linux 2023 上)。在这种情况下,请使用本指南使用的任何地方替换实际的接口名称ip link show(通过运行找到的)eth0。
保留入口端口-影响网络
预留您的 AwsGroundStationAgentEndpoint 入口地址端口范围内的所有端口,以防止与内核使用发生冲突。端口使用冲突将导致联络和数据传输失败。
echo "net.ipv4.ip_local_reserved_ports=${port_range_min}-${port_range_max}" >> /etc/sysctl.conf
-
示例:
echo "net.ipv4.ip_local_reserved_ports=42000-43500" >> /etc/sysctl.conf。
Reboot
成功应用所有优化后,重启实例才能使优化生效。
sudo reboot
附录: interrupt/RPS Tune 的推荐参数
本部分确定了在“优化硬件中断和接收队列:影响 CPU 和网络”优化部分中使用的推荐参数值。
| 系列 | 实例类型 | ${interrupt_core_list} | ${rps_core_mask} |
|---|---|---|---|
|
c7i |
|
|
|
|
c6i |
|
|
|
|
c5 |
|
|
|
|
c5n |
|
|
|
|
m5 |
|
|
|
|
r5 |
|
|
|
|
r5n |
|
|
|
|
g4dn |
|
|
|
|
p4d |
|
|
|
|
p3dn |
|
|
|