我有近 140 个虚拟机,它们使用 KVM 在 Ubuntu 10.04 上运行。虚拟机中的操作系统不同,但主要是 10.04 虚拟机。
它们在 10.04 下运行良好。我彻底清除了操作系统磁盘,并引入了所有现有虚拟机,并使用 dirsh 定义其配置文件。我在运行 3-5 个虚拟机的服务器上执行了此操作,效果很好,但这些服务器每个都运行 20-25 个虚拟机。
升级后我注意到以下几点:
- 一些虚拟机的时间变得很疯狂。就像它们被启动了,却以为是 2 个月前的事一样。
- 执行 du/df 不再显示最初创建的 img 文件有多大。只显示其中使用的内容。因此,当您安装 40G Ubuntu 时,du 中显示为 2G,ls -lh 可以正确显示
- 有些(并非全部)虚拟机表现得好像无法写入磁盘,就像空间不足一样,但它们有 55% 以上的可用空间。删除文件后,虚拟机可以再次开始工作。
- 虚拟机通常仍可 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 个月,问题从未再次出现。