每当发生来宾磁盘 IO 时,KVM 来宾就会停止

每当发生来宾磁盘 IO 时,KVM 来宾就会停止

我有一个用 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,但这完全没有区别

所以我的问题是

  1. 如果磁盘写入似乎使来宾虚拟机基本持平,可能会发生什么情况?
  2. 接下来我应该去哪里进行故障排除?

相关内容