从 10.04 版切换到 12.04 版后,KVM 虚拟机会随机在 Precise 上挂起

从 10.04 版切换到 12.04 版后,KVM 虚拟机会随机在 Precise 上挂起

我有近 140 个虚拟机,它们使用 KVM 在 Ubuntu 10.04 上运行。虚拟机中的操作系统不同,但主要是 10.04 虚拟机。

它们在 10.04 下运行良好。我彻底清除了操作系统磁盘,并引入了所有现有虚拟机,并使用 dirsh 定义其配置文件。我在运行 3-5 个虚拟机的服务器上执行了此操作,效果很好,但这些服务器每个都运行 20-25 个虚拟机。

升级后我注意到以下几点:

  1. 一些虚拟机的时间变得很疯狂。就像它们被启动了,却以为是 2 个月前的事一样。
  2. 执行 du/df 不再显示最初创建的 img 文件有多大。只显示其中使用的内容。因此,当您安装 40G Ubuntu 时,du 中显示为 2G,ls -lh 可以正确显示
  3. 有些(并非全部)虚拟机表现得好像无法写入磁盘,就像空间不足一样,但它们有 55% 以上的可用空间。删除文件后,虚拟机可以再次开始工作。
  4. 虚拟机通常仍可 ping 通,但控制台和 SSH 会失败。输入密码后,某些 SSH 连接会挂起。

磁盘映像位于 XFS 上。

版本信息:

  • 操作系统:Ubuntu 12.04
  • 内核:3.2.0-30-generic
  • kvm 1:84+dfsg-0ubuntu16+1.0+noroms+0ubuntu14.1 从 kvm 到 qemu-kvm 的虚拟过渡包
  • qemu 1.0+noroms-0ubuntu14.1 从 qemu 到 qemu-kvm 的虚拟过渡包
  • qemu-common 1.0+noroms-0ubuntu14.1 qemu 常用功能(bios、文档等)
  • qemu-kvm 1.0+noroms-0ubuntu14.1 在 i386 和 amd64 硬件上完全虚拟化
  • qemu-utils 1.0+noroms-0ubuntu14.1 qemu 实用程序
  • seabios 0.6.2-0ubuntu2.1 旧版 BIOS 实现,可用作 coreboot 有效负载
  • vgabios 0.6c-2ubuntu3 VGA BIOS 软件,适用于 Bochs 和 Qemu 模拟 VGA 卡
  • libvirt-bin 0.9.8-2ubuntu17.5 用于 libvirt 库的程序
  • libvirt0 0.9.8-2ubuntu17.5 库用于与不同的虚拟化系统交互

我也尝试过构建 qemu/kvm 14.7,结果相同。

虚拟机管理程序或 VMS 上的日志(libvirt、qemu、syslog)中没有条目。

<domain type="kvm">
  <name>template</name>
  <uuid>9b5004aa-e4e1-11de-9137-003048dad824</uuid>
  <memory>1048576</memory>
  <currentMemory>1048576</currentMemory>
  <vcpu>2</vcpu>
  <os>
    <type arch="x86_64" machine="pc">hvm</type>
    <boot dev="hd"/>
    <kernel>/kvm/kernels/vmlinuz-2.6.32-24-server</kernel>
    <initrd>/kvm/kernels/initrd.img-2.6.32-24-server</initrd>
    <cmdline>ro root=/dev/vda</cmdline>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset="utc"/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type="file" device="cdrom">
      <target dev="hdc" bus="ide"/>
      <readonly/>
    </disk>
    <disk type="file" device="disk">
      <source file="/kvm/images/template.img"/>
      <target dev="vda" bus="virtio"/>
    </disk>
    <interface type="bridge">
      <mac address="de:ad:3e:5b:47:99"/>
      <source bridge="br2"/>
      <model type="virtio"/>
    </interface>
    <serial type="pty">
      <target port="0"/>
    </serial>
    <console type="pty">
      <target port="0"/>
    </console>
    <graphics type="vnc" port="-1" listen="0.0.0.0" autoport="yes" keymap="en-us"/>
  </devices>
</domain>

在正在运行的虚拟机上执行 strace 时,我看到了以下情况:

read(19, "\2\0\0\0\0\0\0\0\0\0\336\255\276\357\10\353\0\f\333\350\275\0\10\0E\0\0B\214\212@\0"..., 69632) = 90
ioctl(6, KVM_IRQ_LINE_STATUS, 0x7fff290e65f0) = 0
read(19, 0x7f7967430a54, 69632)         = -1 EAGAIN (Resource temporarily unavailable)
select(20, [7 8 11 15 16 17 18 19], [], [], {1, 0}) = 1 (in [8], left {0, 999819})
read(16, 0x7fff290f6710, 16)            = -1 EAGAIN (Resource temporarily unavailable)

任何帮助,将不胜感激。

编辑

我已经从 Ubuntu 升级到最新的内核版本。在仅运行 iozone 时,注意到 AppArmor 出现一些拒绝,因此我完全删除了测试系统上的 apparmor。将 qemu/kvm 和支持库升级到 12.10 中的版本。我还尝试使用 pc-0.12 和 pc-0.14 版本。

启动后一两个小时内所有内容仍被锁定。

答案1

从 KVM 主机的角度来看,似乎有一些东西阻止了虚拟机。可以尝试以下几件事:

  • 发生这种情况时,KVM 主机 CPU 使用率是否会飙升?
  • vmstat显示(运行)什么vmstat 5

示例 vmstat

% vmstat 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 806972 396372 2369348    0    0    13    26   11  197  4  4 90  2  0   
 0  0      0 808908 396380 2367056    0    0     0    18 6453 13546  2  2 95  1  0  
 0  0      0 807508 396380 2370296    0    0     0    22 6438 13662  2  3 95  1  0  
 0  0      0 809892 396392 2367068    0    0     0    56 6273 13189  1  2 95  1  0  
  • iostat显示(运行)什么iostat -dx 5

iostat 示例

% iostat -dx 5
Linux 2.6.35.14-106.fc14.x86_64 (grinchy)   01/28/2013  _x86_64_    (4 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.61    11.29    1.14    4.07    58.12   116.23    33.46     0.17   31.81   7.18   3.74
dm-0              0.00     0.00    0.83    2.38    34.75    19.02    16.77     0.10   31.11   2.17   0.70
dm-1              0.00     0.00    0.00    0.00     0.04     0.00     8.00     0.00    5.30   2.70   0.00
dm-2              0.00     0.00    0.92   12.37    23.18    97.21     9.06     0.79   59.40   2.46   3.27

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00    12.20    0.00    3.00     0.00   112.00    37.33     0.05   16.73  13.87   4.16
dm-0              0.00     0.00    0.00    1.40     0.00    11.20     8.00     0.05   38.29  12.43   1.74
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
dm-2              0.00     0.00    0.00   12.60     0.00   100.80     8.00     0.06    4.37   1.92   2.42

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00    11.60    0.00    2.60     0.00   107.20    41.23     0.04   13.46  13.23   3.44
dm-0              0.00     0.00    0.00    0.60     0.00     4.80     8.00     0.01   15.00  13.00   0.78
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
dm-2              0.00     0.00    0.00   12.80     0.00   102.40     8.00     0.13   10.05   2.08   2.66

在 CentOS 5.x 上运行 KVM 时,我们遇到了类似的问题,但自从迁移到 CentOS 6.x 后,这个问题就再也没有出现过。此外,在调试问题时,它似乎是 Guest VM 特有的。我的意思是,某些 Guest VM 似乎会在整个 KVM Host 中导致此问题。

答案2

我花了一段时间来排查这个问题,发现这与虚拟机本身使用的内核有关。他们使用的是 2.6.32。我们升级到了 2.6.38-10,它修复了一个计时器错误,这似乎是罪魁祸首。他们已经运行了 11 个月,问题从未再次出现。

相关内容