我在 HP 服务器上安装了 Citrix XenServer 6.1(1x Intel Xeon E5630 @ 2.53GHz(4 核,8 线程,RAM:752MB 用于 dom0,55286MB 用于客户机)。该服务器有 2 个 scsi 镜像磁盘,用于开发/测试。
主机运行 5 个客户机,我在测试期间打开或关闭了这些客户机。大多数性能测试结果都不太好。但我想调整 Xen:例如,“dd if=/dev/zero ...” 在主机上提供 130MB/s,但在单个客户机上仅提供 75MB/s。
如果我在客户机上运行dd if=/dev/urandom
,CPU 就会饱和,并且我得到 7MB/s。
通过tune-vcpus
,我设法为 dom0 分配了 8 个 vCPU,但性能却有所下降。默认值为 4 个 vCPU,我想只为 dom0 分配 1 个 vCPU,但这样做不行。
以下是我尝试过的:
- 编辑
/etc/sysconfig/tunes-vcpus
> NR_DOMAIN0_VCPUS=1 和 MAX_NR_DOMAIN0_VCPUS=1 /etc/init.d/tune-vcpus
开始分钟- 重启主机
我也试过
/opt/xensource/libexec/xen-cmdline -set-dom0 blkbk.reqs=256
为了从存储中获得更多性能,它不会改变任何东西。
我在 VBD 上启用了 Qos,并为进行测试的 VBD 赋予最高优先级。
经过所有这些,我的 I/O 性能并没有得到任何提升。还有其他办法吗?
答案1
您可以尝试为 max_sectors_kb 找到一个合适的值。默认情况下,它设置为 512 或 1024。例如,您可以将其设置为 128,然后再次测试(dom0 以及 domU)。
echo 128 > /sys/block/[your blockdevice]/queue/max_sectors_kb
此设置不是永久的。将条目放入 /etc/rc.local 以在启动时进行设置。
请发布您的结果。
答案2
您可以尝试添加的一件事是将虚拟机中的 io 调度程序切换到截止时间,并在那里实际禁用 io 合并。这应该会总体上减少 io 延迟,并且它可能与 Xen 的 IO 环结构配合得更好。
echo 1 > /sys/block/$dev/queue/nomerges
我的理由和经验是,Linux 的块代码其实并不智能,但它认为自己很智能。因此,它会尝试将所有 IO 请求合并为一个,然后再将它们传递给磁盘驱动程序。在 Xen 的情况下,下一步将是将它们分开,以便它们适合环形缓冲区。然后它们位于 dom0 中,而那里的磁盘驱动程序可以更好地找出需要合并的内容,因为它不需要利用单个单独的 VM 知识来进行对齐。
如果没有帮助,则撤消更改,但这是我在尝试了所有其他方法后要查看的地方。
也许你的服务器早已被废弃,但我认为这仍然会帮助其他人。
答案3
听起来你指的是来自客户的存储吞吐量。这只是众多性能指标之一。I/O 吞吐量是带宽和潜伏。这意味着,为了实现高吞吐量,您需要最小化延迟并最大化带宽(即随时传输大量数据,并尽快满足对这些数据的请求)。
当您处于虚拟化环境中时,您不可避免地会增加延迟来处理您的请求。这意味着 domU 很难达到您在 dom0 中看到的吞吐量。希望通过允许更多数据随时传输(通过让许多虚拟机执行 I/O 或通过有足够大的请求)来最大限度地减少这种影响。
考虑到您的硬件和您所指的速率(~150 MB/s),如果您无法从具有dd
正确参数的客户机上看到类似的吞吐量,我会感到非常惊讶。
从你的“dom0”和“domU”尝试一下(下面的命令将写入 500MB 的数据delete.me
:
dd if=/dev/zero of=delete.me bs=1M count=500 oflag=direct
确保oflag=direct
这些写入将绕过虚拟机(dom0 和 domU)缓冲区缓存。
另外,请参阅以下文档以更好地了解 XenServer 6.1.0 如何实现虚拟化存储及其任何性能影响(包括针对 vCPU 数量和固定的调整建议):