我的公司遇到了一个网络性能问题,似乎让我们正在与之合作的所有“专家”(VMWare 支持、RHEL 支持、我们的托管服务托管提供商)都陷入了困境。
问题是我们的虚拟机(甚至是驻留在同一物理主机上的虚拟机)之间的网络延迟会随着网络吞吐量的增加而增加——高达 100 倍或更多!例如,在没有任何网络负载的情况下,延迟(通过 ping 测量)可能约为 0.1 毫秒。开始传输几个 100MB 的文件,延迟增长到 1ms。在两个 VM 之间启动一堆(大约 20 个左右)并发数据传输,VM 之间的延迟可以增加到 10 毫秒以上。
这对我们来说是个大问题,因为我们有应用服务器虚拟机托管进程,每小时可能会针对数据库服务器(不同的虚拟机)发出 100 万次左右的查询。因此,为每个查询添加一两毫秒会大大增加我们的运行时间——有时会使我们的预期持续时间增加一倍或三倍。
我们已经有了我认为非常标准的环境:
- ESXi 6.0u2
- 4 个 Dell M620 刀片,配备 2 个 Xeon E5-2650v2 处理器和 128GB RAM
- SolidFire SAN
我们的基本虚拟机配置包括:
- RHEL7,最小安装
- 为 /boot、/、/var/log、/var/log/audit、/home、/tmp 和 swap 的挂载点配置了多个 LUN
- 除/boot 以外的所有分区都使用 LUKS 加密(通过 LVM)
我们的数据库服务器虚拟机正在运行 Postgres 9.4。
我们已经尝试了以下方法:
- 将虚拟网卡从 VMNETx3 更改为 e1000 并返回
- 调整 RHEL 以太网堆栈设置
- 为虚拟机使用 ESXi 的“低延迟”选项
- 将我们的主机和 vCenter 从 ESX 5.5 升级到 6.0u2
- 创建准系统虚拟机(使用 LUKS 等进行上述设置,但没有我们的任何生产服务)用于测试
- 将数据存储从 SSD SolidFire SAN 移动到本地(刀片上)旋转存储
这些都没有改善网络延迟。唯一显示预期(非恶化)延迟的测试是当我们设置第二对没有LUKS 加密的准系统 VM时。不幸的是,我们需要完全加密的分区(我们为其管理密钥),因为我们正在处理受监管的敏感数据。
我不明白 LUKS——就其本身而言——在这里应该受到责备。相反,我怀疑使用 ESX、我们的托管硬件和/或我们的 VM 硬件配置的某种组合运行的 LUKS 是罪魁祸首。
我在一个更简陋的环境中进行了测试(MacBook Pro、i5、8GB RAM、VMWare Fusion 6.0、Centos7 虚拟机配置与 LVM 上的 LUKS 和相同的测试脚本类似)并且无法重现延迟问题。无论我在虚拟机之间发送多少网络流量,延迟都保持稳定在 0.4 毫秒左右。这是在一台笔记本电脑上,发生了很多事情!
任何指针/提示/解决方案将不胜感激!