15.9. 使用 Node Tuning Operator 减少 NIC 队列
Node Tuning Operator 有助于减少 NIC 队列以提高性能。使用性能配置集进行调整,允许为不同的网络设备自定义队列。
15.9.1. 使用性能配置集调整 NIC 队列
通过性能配置集,您可以调整每个网络设备的队列计数。
支持的网络设备:
- 非虚拟网络设备
- 支持多个队列的网络设备(通道)
不支持的网络设备:
- 纯软件网络接口
- 块设备
- Intel DPDK 虚拟功能
先决条件
-
使用具有
cluster-admin
角色的用户访问集群。 -
安装 OpenShift CLI(
oc
)。
流程
-
以具有
cluster-admin
权限的用户身份登录运行 Node Tuning Operator 的 OpenShift Container Platform 集群。 - 创建并应用适合您的硬件和拓扑的性能配置集。有关创建配置集的指南,请参阅"创建性能配置集"部分。
编辑这个创建的性能配置集:
$ oc edit -f <your_profile_name>.yaml
使用
net
对象填充spec
字段。对象列表可以包含两个字段:-
userLevelNetworking
是一个必需字段,指定为布尔值标记。如果userLevelNetworking
为true
,则队列数将设置为所有支持设备的保留 CPU 计数。默认值为false
。 devices
是一个可选字段,指定队列设置为保留 CPU 数的设备列表。如果设备列表为空,则配置适用于所有网络设备。配置如下:interfaceName
:此字段指定接口名称,并支持 shell 样式的通配符,可以是正数或负数。-
通配符语法示例如下:
<string> .*
-
负规则的前缀为感叹号。要将网络队列更改应用到排除列表以外的所有设备,请使用
!<device>
。例如!eno1
。
-
通配符语法示例如下:
-
vendorID
:网络设备供应商 ID,以带有0x
前缀的 16 位十六进制数字代表。 deviceID
:网络设备 ID(model),以带有0x
前缀的 16 位十六进制数字代表。注意当指定
deviceID
时,还必须定义vendorID
。与设备条目interfaceName
、vendorID
或vendorID
加deviceID
中指定的所有设备标识符相匹配的设备会被视为一个网络设备。然后,此网络设备的 net 队列数设置为保留的 CPU 计数。当指定了两个或多个设备时,网络队列数将设置为与其中一个设备匹配的任何网络设备。
-
使用此示例性能配置集将所有设备的队列数设置为保留的 CPU 计数:
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,55-103 reserved: 0-2,52-54 net: userLevelNetworking: true nodeSelector: node-role.kubernetes.io/worker-cnf: ""
使用这个示例性能配置集,将所有与任何定义的设备标识符匹配的保留 CPU 数设置为保留的 CPU 计数:
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,55-103 reserved: 0-2,52-54 net: userLevelNetworking: true devices: - interfaceName: "eth0" - interfaceName: "eth1" - vendorID: "0x1af4" deviceID: "0x1000" nodeSelector: node-role.kubernetes.io/worker-cnf: ""
使用这个示例性能配置集,将所有以接口名称
eth
开头的设备的队列数设置为保留的 CPU 计数:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,55-103 reserved: 0-2,52-54 net: userLevelNetworking: true devices: - interfaceName: "eth*" nodeSelector: node-role.kubernetes.io/worker-cnf: ""
使用这个示例性能配置集。将所有设备的队列数设置为保留的 CPU 计数,该接口具有
eno1
以外的任何接口:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,55-103 reserved: 0-2,52-54 net: userLevelNetworking: true devices: - interfaceName: "!eno1" nodeSelector: node-role.kubernetes.io/worker-cnf: ""
使用这个示例性能配置集,将所有具有接口名称
eth0
,vendorID
为0x1af4
、deviceID
为0x1000
的设备的队列数设置为保留 CPU 数:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,55-103 reserved: 0-2,52-54 net: userLevelNetworking: true devices: - interfaceName: "eth0" - vendorID: "0x1af4" deviceID: "0x1000" nodeSelector: node-role.kubernetes.io/worker-cnf: ""
应用更新的性能配置集:
$ oc apply -f <your_profile_name>.yaml
其他资源
15.9.2. 验证队列状态
在这一部分中,一些示例演示了不同的性能配置集以及如何验证是否应用了更改。
示例 1
在本例中,网络队列数为所有支持的设备设置为保留 CPU 数(2)。
性能配置集中的相关部分是:
apiVersion: performance.openshift.io/v2 metadata: name: performance spec: kind: PerformanceProfile spec: cpu: reserved: 0-1 #total = 2 isolated: 2-8 net: userLevelNetworking: true # ...
使用以下命令显示与设备关联的队列状态:
注意在应用了性能配置集的节点中运行这个命令。
$ ethtool -l <device>
在应用配置集前验证队列状态:
$ ethtool -l ens4
输出示例
Channel parameters for ens4: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 4
应用配置集后验证队列状态:
$ ethtool -l ens4
输出示例
Channel parameters for ens4: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 2 1
- 1
- 该组合通道显示为所有支持的设备保留 CPU 的总数为 2。这与性能配置集中配置的内容匹配。
示例 2
在本例中,针对具有特定 vendorID
的所有受支持的网络设备,网络队列数设置为保留 CPU 数(2)。
性能配置集中的相关部分是:
apiVersion: performance.openshift.io/v2 metadata: name: performance spec: kind: PerformanceProfile spec: cpu: reserved: 0-1 #total = 2 isolated: 2-8 net: userLevelNetworking: true devices: - vendorID = 0x1af4 # ...
使用以下命令显示与设备关联的队列状态:
注意在应用了性能配置集的节点中运行这个命令。
$ ethtool -l <device>
应用配置集后验证队列状态:
$ ethtool -l ens4
输出示例
Channel parameters for ens4: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 2 1
- 1
- 带有
vendorID=0x1af4
的所有支持设备的预留 CPU 总数为 2。例如,如果存在另一个网络设备ens2
,其vendorID=0x1af4
也具有总计的网络队列为 2。这与性能配置集中配置的内容匹配。
示例 3
在本例中,针对与任何定义的设备标识符匹配的所有受支持网络设备,网络队列数设置为保留 CPU 数(2)。
命令 udevadm info
提供了有关设备的详细报告。在这个示例中,设备是:
# udevadm info -p /sys/class/net/ens4 ... E: ID_MODEL_ID=0x1000 E: ID_VENDOR_ID=0x1af4 E: INTERFACE=ens4 ...
# udevadm info -p /sys/class/net/eth0 ... E: ID_MODEL_ID=0x1002 E: ID_VENDOR_ID=0x1001 E: INTERFACE=eth0 ...
对于
interfaceName
等于eth0
的设备,以及具有vendorID=0x1af4
的设备,并使用以下性能配置集,将网络队列设置为 2:apiVersion: performance.openshift.io/v2 metadata: name: performance spec: kind: PerformanceProfile spec: cpu: reserved: 0-1 #total = 2 isolated: 2-8 net: userLevelNetworking: true devices: - interfaceName = eth0 - vendorID = 0x1af4 ...
应用配置集后验证队列状态:
$ ethtool -l ens4
输出示例
Channel parameters for ens4: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 2 1
- 1
- 带有
vendorID=0x1af4
的所有支持设备的预留 CPU 总数设置为 2。例如,如果存在另一个带有vendorID=0x1af4
的网络设备ens2
,则其总子网队列也将设置为 2。类似地,interfaceName
等于eth0
的设备会将总网络队列设置为 2。
15.9.3. 与调整 NIC 队列关联的日志记录
详细说明所分配设备的日志消息记录在相应的 Tuned 守护进程日志中。以下信息可能会记录到 /var/log/tuned/tuned.log
文件中:
记录了一个
INFO
信息,详细描述了成功分配的设备:INFO tuned.plugins.base: instance net_test (net): assigning devices ens1, ens2, ens3
如果无法分配任何设备,则会记录
WARNING
信息:WARNING tuned.plugins.base: instance net_test: no matching devices available