主机监控工具报告的 CPU 利用率数字与 NSX Advanced Load Balancer SE 使用的实际 CPU 可能不同。CPU 利用率的这种差异是设计使然。本文介绍了值存在差异的原因。您还可以通过 NSX Advanced Load Balancer UI 和 CLI 模式进行故障排除。
行为原因
为了最大程度地减少 NSX Advanced Load Balancer SE 中的端到端延迟,CPU 调度程序周期会积极探测相应数据路径接口(轮询模式驱动程序 (Poll Mode Driver, PMD))中的所有队列。当管理员发出 top 或 htop 命令时,这会在底层主机操作系统上显示为 CPU 利用率高。
在此场景中,底层物理主机的监控工具显示实际 CPU 利用率超过 95%,尤其是 vCPU0 和 vCPU1,如下所示:
物理主机的相应实时 CPU 统计信息还显示 vCPU 利用率超过 95%,如下所示:
NSX Advanced Load Balancer 数据路径旨在根据可用的 CPU 内核数进行扩展。这就是出现多个 se_dp(服务引擎数据路径)进程的原因。NSX Advanced Load Balancer 通过在主机或虚拟机的所有可用 CPU 内核上运行每个 se_dp 进程,来尝试利用所有 CPU 内核,以获得最大性能。这可以帮助 NSX Advanced Load Balancer 在用户空间中通过最少的锁定和上下文切换进行扩展,因为其中每个都是不同的进程上下文。
在同一时间段内,NSX Advanced Load Balancer 控制器显示 CPU 使用情况正常且未过度利用,如下所示:
NSX Advanced Load Balancer SE 架构
NSX Advanced Load Balancer 服务引擎容器或虚拟机 (Virtual Machine, VM) 在每个内核上运行 se_dp 进程,以根据 CPU 内核数进行扩展(不仅在主机或虚拟机内,而且在 SE 虚拟机或主机之间)。除专有进程(如 se_dp 进程与控制器的连接)、SE 日志代理(向控制器报告流量日志)等以外,NSX Advanced Load Balancer SE 虚拟机运行底层 Linux 进程。Linux 主机上报告的 CPU 利用率将整合所有 Linux 进程和 NSX Advanced Load Balancer SE 专有进程。
SE DP 进程利用率的核算基于 se_dp 进程在处理数据包和无操作周期(空闲周期)中花费的滴答计时数或周期数。将在显式统计信息中分别为每个 se_dp 进程完成此核算。要查看此状态,请使用 show serviceengine *service engine name* cpu
。或者,您也可以从 NSX Advanced Load Balancer UI 中查看统计信息(所有 se_dp 处理的平均值)。
使用 NSX Advanced Load Balancer UI 进行故障排除
NSX Advanced Load Balancer 用户界面可准确显示可用于处理的有用 CPU,并可用作验证 SE 可用 CPU 的证明源。最佳做法是,SE 的 CPU 利用率(如用户界面中报告的利用率)不得超过 95%。当 CPU 以非常高的级别运行时,SE 可能会增加网络流量的延迟。
有关详细信息,请参阅 Hypervisor 报告 SE CPU 利用率高的原因。
使用 CLI 进行故障排除
要查看 SE 的实际 CPU 利用率(在 NSX Advanced Load Balancer shell 中),请执行以下步骤:
使用 SSH 登录到控制器,然后输入 shell 提示符。
使用命令
show serviceengine
查看当前控制器下的活动 SE,如下所示:[admin]:> show serviceengine +-----------------------+---------------+-------------+----------+-------------+ | Name | SE Group | Mgmt IP | Cloud | Oper State | +-----------------------+---------------+-------------+----------+-------------+ | ****** |Default-Group |********* |********* | OPER_UP | +-----------------------+---------------+-------------+----------+-------------+
使用 Iscpu 命令(需要 sudo 特权)了解物理主机拥有的 vCPU 内核数,如下所示:
[root@se-linux-17 ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 2 On-line CPU(s) list: 0,1 Thread(s) per core: 1 Core(s) per socket: 1 Socket(s): 2 NUMA noes(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 85 Model name: Intel(R) Xeon(R) Gold 6130 CPU @ 2.10GHz Stepping: 4 CPU MHz: 2100.000 BogoMIPS: 4200.00 Hypervisor vendor: VMware Virtualization type: full L1d cache: 32K L1i cache: 32K L2 cache: 1024K L3 cache: 22528K
cat /proc/cpuinfo
按 vCPU 提供信息。
要查看所选 SE 的实际 CPU 利用率,请使用 show serviceengine *SE_name*cpu
命令,如下所示:
[admin:]: > show serviceengine ***** cpu +---------------------------+---------------------------------------+ | Field | Value | +---------------------------+---------------------------------------+ | se_uuid | se-*****-avitag-1 | |total_linux_cpu_utilization|25.3150057274 | |total_cpu_utilization |0.006010782570367 | |total_memory |3881336 | |free_memory |399176 | |idle_cpu |74.68499427726 | |process_cpu_utilization[1] | | | process_name |se_agent | | process_cpu_usage |0.2 | | process_memory_usage |1.59161690717 | |process_cpu_utilization[2] | | | process_name |se_dp0 | | process_cpu_usage |0.0120356514073 | | process_memory_usage |5.67876628048 | |process_cpu_utilization[3] | | | process_name |se_dp1 | | process_cpu_memory_usage |0.0 | | process_memory_usage |0.589796915289 | |process_cpu_utilization[4] | | | process_name |se_log_agent | | process_cpu_usage |4.6 | | process_memory_usage |1.00903400272 | |process_cpu_utilization[5] | | | process_name |se_hm | | process_cpu_usage |0.00344827586207 | | process_memory_usage |0.251872035814 | |process_cpu_utilization[6] | | | process_name |idle0 | | process_cpu_usage |100.00 | | process_cpu_ewma |99.9993500642 | |process_cpu_utilization[7] | | | process_name |1dle1 | | process_cpu_usage |100.0 | | process_cpu_ewma |99.998530399 | +---------------------------+---------------------------------------+
字段 |
描述 |
_process_name_ |
主动运行进程的名称。 |
_process_cpu_usage_ |
进程使用的 CPU 量占总 CPU 使用情况的百分比 (%) |
_process_memory_usage_ |
进程使用的内存量占总内存使用情况的百分比 (%)。 |
_total_linux_CPU_utilization_ |
底层主机操作系统使用的总实际 CPU。 |
_total_memory_ |
分配给虚拟机或容器的物理内存总量。 |
_free_memory_ |
当前可用且未由虚拟机或容器使用的内存量。 |
_idle0_ 和 _idle1_ |
相应 CPU 的 CPU 闲置量。 |
讨论的示例是来自具有两个 vCPU 的同一主机的输出。我们提供了分组信息列表,如正在运行的进程、CPU 利用率(以百分比表示)。
由于存在两个 vCPU,因此可以使用调度程序进程,例如分别与 vCPU 0 和 vCPU 1 对应的 se_dp0 和 se_dp1。
只有分配给容器或 SE 的内核才会出现在 NSX Advanced Load Balancer SE CLI 输出中。
属于物理主机的其他 vCPU 内核不会包含在 NSX Advanced Load Balancer SE CLI 输出中。
引入了字段 dispatcher_dp_cpu_util 和 proxy_dp_cpu_util,以提高报告 CPU 利用率的精确度。
服务稳定性建议
考虑到 SE 组自动缩放或冗余池,建议具有硬件冗余。
要启用 TSO、RSS 和 GRO 等选项,请确保选择了相应的硬件网卡。
NSX Advanced Load Balancer 可以手动配置所需数量的调度程序和代理内核,以及配置专用调度程序的选项。如果需要高吞吐量,建议配置专用调度程序。