我有一个用 virsh 创建的 KVM guest 虚拟机。主机是Ubuntu 18.04,访客机是Ubuntu 18.04。两者都运行Linux maus 5.3.0-59-generic
内核,并且我正在使用我拥有的 Intel CPU 提供的硬件虚拟化。直到最近,这种方法还运行良好。
该来宾的网卡连接到我的家庭网络和电缆调制解调器。它充当 NAT 设备,允许本地计算机通过电缆调制解调器访问互联网。
我通常运行大量 iptables 规则和tc
命令来提高互联网连接的整体可用性。我tc
目前禁用了这些东西,所以我fq_codel
只使用 ubuntu 运行时提供的默认 qdisc。
当我使用机器作为 NAT 网关时,我会遇到间歇性网络卡顿的情况。基本上网络流量暂停,然后一切都会赶上。通过直接插入电缆调制解调器(使用我的笔记本电脑)确认的其他故障排除表明互联网连接工作正常。
从主机上,我可以 ping 访客机。请注意,我的主机和访客之间没有任何类型的虚拟化网络。物理机中安装了一个额外的 NIC,并桥接至来宾。所以这必须通过我的本地交换机传输。我运行以下命令:ping -i 0.22 192.168.12.90
从主机。
典型延迟小于 1 毫秒。然而突然出现延迟
4 bytes from 192.168.12.90: icmp_seq=340 ttl=64 time=0.710 ms
64 bytes from 192.168.12.90: icmp_seq=341 ttl=64 time=0.323 ms
64 bytes from 192.168.12.90: icmp_seq=342 ttl=64 time=0.234 ms
64 bytes from 192.168.12.90: icmp_seq=343 ttl=64 time=0.542 ms
64 bytes from 192.168.12.90: icmp_seq=344 ttl=64 time=0.382 ms
64 bytes from 192.168.12.90: icmp_seq=345 ttl=64 time=0.253 ms
64 bytes from 192.168.12.90: icmp_seq=346 ttl=64 time=0.361 ms
64 bytes from 192.168.12.90: icmp_seq=347 ttl=64 time=0.360 ms
64 bytes from 192.168.12.90: icmp_seq=348 ttl=64 time=1374 ms
64 bytes from 192.168.12.90: icmp_seq=349 ttl=64 time=1151 ms
64 bytes from 192.168.12.90: icmp_seq=350 ttl=64 time=928 ms
64 bytes from 192.168.12.90: icmp_seq=351 ttl=64 time=704 ms
64 bytes from 192.168.12.90: icmp_seq=352 ttl=64 time=480 ms
64 bytes from 192.168.12.90: icmp_seq=353 ttl=64 time=257 ms
64 bytes from 192.168.12.90: icmp_seq=354 ttl=64 time=34.8 ms
64 bytes from 192.168.12.90: icmp_seq=355 ttl=64 time=0.285 ms
64 bytes from 192.168.12.90: icmp_seq=356 ttl=64 time=0.351 ms
64 bytes from 192.168.12.90: icmp_seq=357 ttl=64 time=0.400 ms
64 bytes from 192.168.12.90: icmp_seq=358 ttl=64 time=0.341 ms
我还直接插入虚拟机使用的网卡并看到相同的行为,因此问题不在于我的本地交换机。
在主机中,我运行stress -c 4 -m 4
以产生尽可能多的 CPU 负载。这不会改善或使问题变得更糟。
我最终注意到,journald
当卡顿发生时,通常会做一些简短的 IO。在来宾中我运行了这样的内容dd if=/dev/zero of=./fstest bs=4096 count=25000
:这会导致口吃问题立即发生。显然,我已经确定来宾中的磁盘 IO 导致了问题。
dd
在主机中运行相同的命令不会导致问题。这让我觉得不知何故客人的状态变得很糟糕。
这是我非常简单的磁盘配置的全部
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none' io='native'/>
<source dev='/dev/corona/gateway_ii'/>
<backingStore/>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</disk>
该设备/dev/corona/gateway_ii
是主机中使用LVM创建的设备
--- Logical volume ---
LV Path /dev/corona/gateway_ii
LV Name gateway_ii
VG Name corona
LV UUID xlpkI2-3qW1-7Jld-N30q-Vl05-nR9I-8jgijJ
LV Write Access read/write
LV Creation host, time maus, 2020-03-29 18:31:31 +0000
LV Status available
# open 2
LV Size 30.00 GiB
Current LE 7680
Mirrored volumes 2
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:9
我将虚拟机升级为分配两个 CPU,但这完全没有区别
所以我的问题是
- 如果磁盘写入似乎使来宾虚拟机基本持平,可能会发生什么情况?
- 接下来我应该去哪里进行故障排除?