为什么 domU 的 IO 速度比 dom0 快?

为什么 domU 的 IO 速度比 dom0 快?

我在物理机上安装了debian 7,这是机器的配置:

  • 3块硬盘使用RAID5
  • 条带元素大小:1M
  • 阅读策略:自适应预读
  • 写入策略:直写
  • /启动 200 MB ext2
  • / 15 GB ext3
  • 交换 10GB
  • LVM 剩余(~500GB)

我安装了 postgresql,创建了一个大数据库(超过 1GB)。我有一个 SQL 请求需要很长时间才能运行(SELECT 语句,因此它只从数据库中读取数据)。此请求大约需要 5.5 秒才能运行。然后,我安装了 XEN,创建了一个 domU,带有另一个 debian 发行版。在这个操作系统上,我还安装了 postgresql,带有相同的数据库。相同的 SQL 请求仅需 2.5 秒即可运行。

我检查了 dom0 和 domU 上的内核。uname-a 在两个系统上都返回“Linux debian 3.2.0-4-amd64 #1 SMP Debian 3.2.41-2+deb7u2 x86_64 GNU/Linux”。我检查了内核参数,它们大致相同。对于相关的参数,我使用 sysctl 更改了它们的值,使它们在两个系统上匹配。我没有看到任何变化(请求仍然需要相同的时间)。

此后,我检查了文件系统。我在 domU 上使用了 ext3。仍然没有变化。

我安装了 hdparm,并在两个系统上以及两个系统的所有分区上运行了 hdparm -Tt,得到了类似的结果。

现在,我很困惑,我不知道到底有什么不同,也不知道是什么原因造成了如此大的差异。

附加信息:

  • Debian 在戴尔服务器 PowerEdge 2950 上运行
  • postgresql:9.1.9(dom0 和 domU)
  • xen-linux 系统:3.2.0
  • xen 虚拟机管理程序:4.1

谢谢

编辑

正如 Krzysztof Księżyk 所说,这可能是由于某些文件缓存系统。我运行了 dd 命令来测试读写速度。

这是 domU:

root@test1:~# dd if=/dev/zero of=/root/dd count=5MB bs=1MB
^C2020+0 records in
2020+0 records out
2020000000 bytes (2.0 GB) copied, 18.8289 s, 107 MB/s

root@test1:~# dd if=/root/dd of=/dev/null count=5MB bs=1MB
2020+0 records in
2020+0 records out
2020000000 bytes (2.0 GB) copied, 15.0549 s, 134 MB/s

这是 dom0:

root@debian:~# dd if=/dev/zero of=/root/dd count=5MB bs=1MB
^C1693+0 records in
1693+0 records out
1693000000 bytes (1.7 GB) copied, 8.87281 s, 191 MB/s

root@debian:~# dd if=/root/dd of=/dev/null count=5MB bs=1MB
1693+0 records in
1693+0 records out
1693000000 bytes (1.7 GB) copied, 0.501509 s, 3.4 GB/s

此缓存系统可能是什么原因造成的?我们如何“修复”它?我们可以将其应用于 dom0 吗?

编辑2

我切换了虚拟磁盘类型。为此,我按照本文

我做了dd if=/dev/vg0/test1-disk of=/mnt/test1-disk.img bs=16M 然后在 /etc/xen/test1.cfg 中,我将磁盘参数更改为使用文件:而不是 phy:它应该删除文件缓存,但我仍然得到相同的数字(domU 对 Postgres 来说要快得多)

答案1

这可能是因为文件缓存。即使裸机系统和 domU 中的系统在缓存等方面具有相同的配置,domU 中的某些文件操作也会比裸机上的执行速度更快,因为虚拟机管理程序会透明地缓存来自 domU 系统的 IO 请求。您可以使用 dd 命令进行测试。

答案2

我不知道,但这是非常奇怪的行为。我很好奇为什么 dd 测试 dom0 比 domU 快,而 Postgres 却恰恰相反。

关于 Postgres,我和 Krzysztof Księżyk 的想法一样。当文件系统中的缓存重叠或 RAM 内存出现问题时,就会发生这种情况。在您的测试中,您是否禁用了 Linux 缓存?

分配给 dom0 和 domU 的内存是多少?

相关内容