What You See Is What You Get Element

如何利用 Oracle VM Server for SPARC 实现最佳性能

作者:Jon Anderson、Pradhap Devarajan、Darrin Johnson、Narayana Janga、Raghuram Kothakota、Justin Hatch、Ravi Nallan 和 Jeff Savit

如何利用 Oracle VM Server for SPARC 确保 Oracle Solaris 实现最佳虚拟网络性能。


2014 年 8 月发布


简介

本文介绍一组可用于提高 Oracle VM Server for SPARC 上虚拟网络性能的最佳实践。

想对本文发表评论吗?请将链接发布在 Facebook 的 OTN Garage 页面上。有类似文章要分享?请将其发布在 Facebook 或 Twitter 上,我们来进行讨论。

请注意,除非在虚拟网络性能的特定上下文中,逻辑域 (LDOM) 的配置和安装不在本文讨论范围内。本文所含信息并不能取代 Oracle VM Server for SPARC 官方文档和硬件特定文档,只是一个补充。

关于 Oracle VM Server for SPARC

Oracle VM Server for SPARC(以前称为 Sun Logical Domains)为 Oracle SPARC T 系列服务器和受支持的 Oracle M 系列服务器提供了高效的企业级虚拟化功能。

Oracle VM Server for SPARC 允许您在一个系统上创建多个虚拟服务器,利用受支持的 SPARC 服务器和 Oracle Solaris 操作系统 (OS) 提供的大规模线程。本文介绍的所有虚拟化功能均为 Oracle Solaris 的标准组成部分,无需额外费用。

Oracle VM 网络和性能

CPU 和内存性能在控制和逻辑(来宾)域中受到的影响最小。但是,I/O 和网络性能很可能受 I/O 域开销的影响。我们鼓励您根据负载要求,评估 Oracle VM I/O 和网络性能。

:此处提供的所有信息均与 Oracle SPARC T4 和 SPARC T5 平台和 10 GbE IXGBE 接口有关。

此外,Oracle 还建议平衡多个来宾域、硬件 I/O 和计算资源之间的网络负载。

根据经验,对于 Oracle VM Server for SPARC 3.1 或更高版本,建议每个 10 Gb/秒以太网设备至少 使用一个完整内核(SPARC T4 和 SPARC T5 平台)。但为了实现最高性能,建议采用两个完整内核。此数目在内部经验测试中确定。理想情况下,应为域分配自己的 CPU 内核,以免产生域内 CPU 资源竞争。

Oracle VM 提供了灵活的域 I/O 资源分配,特别是在网络领域。凭借这种灵活性,产生了多种性能可能。本文致力于就最适合特定负载的配置提供指导。

Oracle VM 支持的网络特性允许执行以下操作:

  • 创建 I/O 域 — 独立于可直接连接到各种 PCIe 物理设备的控制域 — 从单个 PCIe 端口(I/O 域)到 PCIe 根复合体(根域)。其他域可以使用虚拟网络设备连接到 I/O 域。这提供了 PCIe 根复合体级或端点设备级的粒度。有关详细信息,请参见“I/O 域概述”。
  • 创建与系统中 PCIe 端点设备数相同的 I/O 域,因为 Oracle VM 支持直接 I/O (DIO)。在域中,创建一个虚拟 PCIe 块设备和交换机,可以直接连接到各 PCIe 设备。为实现此功能,必须启用 PCIe I/O 虚拟化;请参见 ldm(1M) set-io iov=on。有关详细信息,请参见“通过分配 PCIe 端点设备创建 I/O 域”。
  • 将 PCIe 设备单独分配到各个域,无需 CPU 或虚拟机管理程序干预。这是因为多个域可以通过 PCIe 单根 I/O 虚拟化 (SR-IOV) 特性共享一个 PCIe 设备。有关详细信息,请参见“通过分配 PCIe SR-IOV 虚拟功能创建 I/O 域”。

Oracle VM 网络提供了以下好处:

  • 直接访问各域广泛共享的硬件
  • 潜在减少所需适配器、交换机端口、接线和电力成本
  • 减少或消除对主域 I/O 的依赖性

配置了这些特性的域可以在运行时迁移,无需中断活动。

:SR-IOV 虚拟功能 (VF) 使用时的实时迁移仅适用于 Oracle VM Server for SPARC 3.1 中引入的动态 SR-IOV 特性。Oracle VM Server for SPARC 的早期版本支持混合 I/O 特性。这允许每个 NIU(nxge 驱动程序)最多三个虚拟网络设备拥有直接分配的直接内存访问 (DMA) 资源。在最新的 Oracle VM 软件中,此特性被 SR-IOV 取代,仅支持基于 UltraSPARC T2 CPU 的平台。

一般来说,建议您运行 Oracle VM Server for SPARC 的最新可用版本,并保持更新系统软件 固件。Oracle 强烈建议控制域和 I/O 域运行最新版本的 Oracle Solaris 11.1 (SRU9+),而非 Oracle Solaris 10,实现最佳功能和性能。

虽然 Oracle Solaris 10 和 Oracle Solaris 11 均可用作来宾操作系统,但为了获得最佳性能和使用其他特性,建议您部署 Oracle Solaris 11.1(SRU9 或更高版本)。

Oracle VM 中的虚拟网络

Oracle VM 中的虚拟网络涉及两个基本组件:

  • 虚拟交换机 (vsw):虚拟交换机类似于以太网交换机。它运行在 I/O 或服务域中,通过逻辑域通道 (LDC) 交换以太网数据包。
  • 虚拟网络设备 (vnet):虚拟网络设备接入来宾域。它类似于非虚拟化环境中的物理网络设备,电缆的一端插入网络端口,另一端插入交换机。在虚拟环境中,同样如此;为逻辑域创建一个虚拟网络设备,将其连接到 I/O 或服务域中的虚拟交换机。

虚拟网络的性能取决于所涉及的两个域:I/O 或服务域和来宾域。数据包传输涉及数据复制,必然需要 CPU 周期。如果没有数据移动,就不会占用 CPU 周期。制定 CPU 资源预算时,应考虑给定域上希望支持的最高带宽。应定期监视资源消耗,确保最佳性能。

虚拟网络资源管理

Oracle 提供以下建议:

  • 对于控制域(如果其支持高 I/O)和 I/O 或服务域,建议每 10 Gb/秒所需带宽分配 8 GB 内存和至少两个完整 CPU 内核(假定采用 SPARC T4 或 SPARC T5 平台)。这是在域可能供应的其他虚拟服务的资源要求之外。
  • 对于来宾域,建议每个 10GbE 链路 4 GB 内存和两个完整的 CPU 内核。这确保 vnet 设备有足够的扇出能力。对于基于 Oracle Solaris 11 的域,可以使用 dladm show-linkprop <linkname> 命令列出与 vnet 数据链路关联的 CPU 扇出资源,检查有效扇出。

    # dladm show-linkprop net1
    ...
    net1     cpus-effective      r-   0-15
    net1     rxfanout-effective  r-   8
    net1     rxrings-effective   r-   8
    net1     txrings-effective   r-   8
    ...
    

    注意,默认 rxfanout-effective 值为 8,可在 10 GbE 链路上实现最佳性能。

  • 对于需要具有更高带宽的多个 LDOM 的配置,Oracle 建议在内核边界上分配域虚拟中央处理单元 (vCPU)。请参见 ldm(1M) add-coreset-coreadd-domainset-domain 子命令和整体内核约束。整体内核约束支持的 LDOM 数依赖于底层平台。如果需要更细粒度的资源分配,Oracle 建议在最佳配置的 LDOM 中使用 Oracle Solaris 区域。
  • 对于性能敏感的配置,Oracle 建议采用整核分配,尽量减少不同虚拟内存区域共享执行上下文时可能存在的“缓存污染”影响。这意味着具有不同数据访问模式的不同执行上下文可能导致缓存行提前失效。根据应用的不同,缓存污染可能会显著影响性能。

Oracle VM Server for SPARC 中的域内通信通过名为逻辑域通道 (LDC) 的点对点接口执行。每个虚拟资源连接使用一个 LDC。通过虚拟网络,每个 vnet 由 LDC 链接到 vsw,默认情况下,还直接链接到附连到 vsw 的其他每个 vnet。所需 LDC 数随附连的每个 vnet 设备呈指数增长。虽然可用 LDC 数有限,但这通常不是问题,除非 LDOM 配置极其复杂。在这种情况下,可以通过禁用交换机上的 inter-vnet-link 属性减少 vnet/vsw LDC 消耗。请参见 ldm(1M) 手册页,了解更多详细信息。

禁用交换机上的 inter-vnet-link 属性导致来自一个域的通信被路由到服务域(托管 vsw),这对域内通信性能有明显影响。因此,为实现最佳整体性能,强烈建议启用 inter-vnet-link 属性(这是默认设置)。

您可以使用 ldm list-bindings -e 命令从控制域查看系统上的 LDC 使用情况。还可以使用 kstat -p|grep ldc 命令大致了解。

虚拟网络软件

为实现最佳虚拟网络性能,Oracle 建议使用最新的 Oracle VM Server for SPARC 软件(目前版本为 3.1)。请参考版本说明,确定最低硬件和软件要求。如前所述,为实现最佳功能和性能,Oracle 强烈建议在所有非来宾(控制、IO/服务)域上运行 Oracle Solaris 11.1 SRU9+。要从 vnet 和 vsw 性能上最近的显著改进中受益,请在 I/O 或服务域和来宾域中至少运行 Oracle Solaris 11.1 SRU9。对于 Oracle Solaris 10,请在来宾域上安装 150031-07 或更新补丁。

除了运行推荐软件,还有必要确保在托管虚拟交换机的来宾域和 I/O 或服务域中将 extended-mapin-space 设置为 on。默认情况下,Oracle VM Server for SPARC 软件 3.1 版或更高版本及关联固件将此属性设置为 on。要检查该设置,请运行以下命令:

# ldm ls -l <domain-name> |grep extended-mapin

如果 extended-mapin-space 不是 on(例如,在 Oracle VM Server for SPARC 3.1 软件升级前的 LDOM 中),可以使用以下命令启用该属性:

# ldm set-domain extended-mapin-space=on <domain-name>

extended-mapin-space 属性的更改将触发主域中的延迟重新配置,并需要重启。重启之后,需要停止并重新启动 LDOM。

可以使用 kstat 命令检查 LDC 上配置的模式,例如:

# kstat -p|grep dring_mode
vnet:0:vnetldc0x0:dring_mode    4
vnet:0:vnetldc0x3:dring_mode    4
vnet:1:vnetldc0x1:dring_mode    4
vnet:1:vnetldc0x6:dring_mode    4

以下是可用模式:

#define VIO_TX_DRING            0x1
#define VIO_RX_DRING            0x2
#define VIO_RX_DRING_DATA       0x4

使用最新软件并将 extended-mapin-space 设置为 on 后,dring_mode 应为 4

虚拟网络性能

最新 Oracle VM 和 Oracle Solaris 软件提供的重要性能优势通过提高代码效率和大型发送分流 (LSO) 特性实现。此特性允许 TCP 协议栈将大数据包写入处理分帧的数据链路,将每数据包成本分摊到栈,类似于巨型帧在数据链路层中的做法。可以通过以下 kstat 统计信息观察 LSO。

# kstat -p|grep lso
tcp:0:tcpstat:tcp_lso_disabled  0
tcp:0:tcpstat:tcp_lso_enabled   168
tcp:0:tcpstat:tcp_lso_pkt_out   170173983
tcp:0:tcpstat:tcp_lso_times     32649030
vnet:0:vnetldc0x1:lso_enabled   1
vnet:0:vnetldc0x1:lso_ipackets  0
vnet:0:vnetldc0x1:lso_max_len   8192
vnet:0:vnetldc0x1:lso_opackets  20915690

图 1 至图 3 所示图形旨在展示通过最新软件和分配足够硬件资源的平衡 LDOM 配置能够实现的性能。实际性能可能有所不同,受负载、系统和网络配置的影响。

:这些图形仅用于说明;并不保证现在或将来的性能。

图 1、图 2 和图 3 所示性能测量结果是用以下系统配置获得的。

  • SPARC T4-1 服务器,2.85 GHz
  • 32 VCPU 控制域 (CDOM),32 GB 内存,IXGBE 设备
  • 16 VCPU LDOM,16 GB 内存
  • Oracle Solaris 11.1 SRU11.1(在所有 LDOM 中)
  • uperf,使用 iperf 配置文件 (TCP)
  • 30 秒测试;8 K I/O 大小(读写)
  • 64 K 和 1 M TCP 窗口大小 (WND)
LDOM 到 LDOM 性能测量

图 1. LDOM 到 LDOM 性能测量

LDOM 到外部 (vnet->vsw->IXGBE 10 GbE)* 性能测量

图 2. LDOM 到外部 (vnet->vsw->IXGBE 10 GbE)* 性能测量

 CDOM 到外部(通过 IXGBE 10 GbE)性能测量

图 3. CDOM 到外部(通过 IXGBE 10 GbE)性能测量

在此基准测试中,使用默认的 1500 字节 MTU,网络接口卡 (NIC) 在报告的约 8.7 Gb/秒达到饱和。

如果运行 Oracle Solaris 11 及更高版本,可以使用 dlstat(1M) 命令(如清单 1 所示)查看是如何在与 vnet 设备关联的伪介质访问控制 (MAC) 环上拆分流量的,例如:

dlstat show-link [-r|-t] [-i <interval>] <vnet device>

# dlstat show-link -r -i 1 net1
LINK  TYPE      ID  INDEX    IPKTS   RBYTES    INTRS    POLLS   IDROPS
net1    rx   local     --    	0        0        0        0        0
net1    rx   other     --        0        0        0        0        0
net1    rx      hw      0   38.98K  237.63M   38.98K        0        0
net1    rx      hw      1   65.54K  398.06M   65.54K        0        0
net1    rx      hw      2   13.14K   91.20M   13.14K        0        0
net1    rx      hw      3   23.59K  150.55M   23.59K        0        0
net1    rx      hw      4   31.25K  220.17M   31.25K        0        0
net1    rx      hw      5   57.22K  385.30M   57.22K        0        0
net1    rx      hw      6   67.02K  444.18M   67.02K        0        0
net1    rx      hw      7   57.83K  389.23M   57.83K        0        0

清单 1

I/O 域网络性能

作为对比,图 4 显示使用 SR-IOV 而非 vnet/vsw 时的一些结果。使用 IXGBE 设备创建了一个 SR-IOV 虚拟功能(参见 ldm(1M) create-vf),将它分配给一个四核来宾域。然后,使用 uperf 并用前述系统配置重复同样的 I/O 测试。

LDOM (IODOM) 到外部(通过 ixgbevf)性能测量

图 4. LDOM (IODOM) 到外部(通过 ixgbevf)性能测量

可以看到在这些测试范围内,性能与物理设备几乎相当。主要区别似乎是 MAC 环更少、中断更少(每个环一个 IXGBE 中断)。在单线程性能较低的平台上,这种差异可能更显著。注意,这仍是共享资源;随着此资源利用率的增加,性能预计会下降。所有虚拟功能只基于一个 10 GbE 链路。

系统可调参数

一般来说,来宾域的表现与常规系统大致相同,都应响应特定负载要求(例如 TCP 窗口大小)执行任何特定调优。这完全取决于运行的应用的要求。应用驱动系统行为。

ip_soft_rings_cnt 默认值为 2。推荐值为虚拟 CPU 数。

此参数仅适用于 Oracle Solaris 10。Oracle Solaris 11 及更高版本实现了全新的 MAC 层,其内置的扇出能力取决于平台架构。

ip_soft_rings_cnt 变量确定用于扇出传入 TCP/IP 连接的工作线程数。应根据系统类型及是否使用链路聚合来调优 ip_soft_rings_cnt。开始时最好将此值设置为 vCPU 计数/2。在 sun4v 系统上会在内部将此值乘以 2,因此您需要将期望值除以 2。

/etc/system 中设置此值:

set ip:ip_soft_rings_cnt=8

需要重启。

设置为 8 将导致每设备创建 16 个软环。

巨型帧

在 Oracle VM Server for SPARC 3.1 之前的版本中,巨型帧可提高网络吞吐量,因为每数据传输成本被分摊。Oracle VM Server 3.1(及相关操作系统版本)提供了 LSO 特性,使用 TCP 协议时可提高标准以太网 MTU(1500 字节)性能。这避免了大多数情况下对巨型帧的要求。实际上,因为难以诊断可能发生的路径 MTU 问题,如无特殊需要,不建议您配置巨型帧特性。

对于 Oracle VM 3.1 之前的版本(及必需的 Oracle Solaris 支持),要实现最佳网络吞吐量,无一例外都必需巨型帧。

设置巨型帧

default_mtu 变量应设置为等于或小于网络基础设施(包括任何交换机和路由器)支持的最高 MTU。通常,最大 MTU 大小为 9216 (1024*9),但实际 MTU 大小依赖于各设备的规格。

无论确定为何值,重要的是必须在与该设备关联的所有虚拟交换机上将 MTU 设置为此值。要更改 vnet 中的 MTU,通常只需更改 vsw 设备的 MTU 即可,例如:

# ldm set-vswitch mtu=9000 vsw-10g-priv-primary

需要重启拥有通过此 vsw 的 vnet 的 LDOM。

在 Oracle Solaris 11 上,要更改物理接口的 MTU,请使用 dladm set-linkprop 命令设置物理数据链路的 mtu 属性。在 Oracle Solaris 10 上,要更改物理接口的 MTU,请阅读您的硬件及所运行 Oracle Solaris 版本的相关文档。

巨型帧注意事项

巨型帧的主要注意事项是要求在整个网络基础架构中和虚拟机内部启用帧。通常通过运行带宽测试(如发送 1 MB 消息)并观察挂起来进行验证。

随着 Oracle VM Server for SPARC 3.1(及至少 Oracle Solaris 11.1 SRU9 或 Oracle Solaris 10 版本加 150031-07 或更高补丁)中引入的 vnet/vsw 更改,由于 LSO,使用 TCP 时的虚拟网络性能实际上比不用巨型帧时更好。

在 Oracle Solaris 11 中,可以运行 dladm show-linkprop -p mtu 命令检查支持的 MTU。输出将在 POSSIBLE 列中列出支持的 MTU。Intel 82599 芯片集的虚拟功能 (VF)(例如基于 Niantic 的卡,如 X1109a-z)上不支持非标准 MTU。请参见 /kernel/drv/ixgbevf.conf

链路聚合

链路聚合 (IEEE 802.3ad) 提供了一种机制,可将一个或多个网络链路聚合成一个链路聚合主干。(聚合链路在客户端看来就像一个数据链路。)使用聚合链路上创建的 vsw 完成的网络配置可以实现:

  • 提高近线性带宽,只要有足够的多个同时网络流充满带宽
  • 此 vsw 上创建的 vnet 的高可用性

聚合链路的效率取决于所选择的散列策略。请参见 dladm(1M) 手册页。如果您运行 Oracle Solaris 11 及更高版本,可以使用 dlstat(1M) 命令监视聚合链路的效率,例如:

# dlstat show-aggr -r -i 1 aggr1

注意,要实现全部潜力,链路聚合需要能够饱和聚合带宽的负载。

另请参见

关于作者

Jon Anderson、Pradhap Devarajan 和 Ravi Nallan 是 Oracle 系统 RPE 组的软件开发人员,Darrin Johnson 是该组软件总监,而 Narayana Janga 是该组高级首席工程师。

Raghuram Kothakota 是 Oracle VM 组的软件开发人员,Jeff Savit 是该组首席技术产品经理。

Justin Hatch 是 Oracle SPARC 技术服务中心的高级首席技术支持工程师。

修订版 1.0,2014 年 7 月 24 日

关注我们:
博客 | Facebook | Twitter | YouTube