KVM 客户机中的 Linux ext4 超时

KVM 客户机中的 Linux ext4 超时

主机操作系统和客户操作系统都是 Debian 8 amd64。客户机是存储在 的原始磁盘映像/srv/machines/web.img。主机有一个备份脚本,计划于每晚 1:55 执行。这是我的备份脚本:

#!/bin/bash

BACKDIR='/srv/backups'
BACKFILENAME='web.img'

# Let's rotate the backups and delete the oldest one
for i in `seq 8 -1 0` ; do
  if [ -f "$BACKDIR"/"$BACKFILENAME"-$i ] ; then
    mv "$BACKDIR"/"$BACKFILENAME"-$i "$BACKDIR"/"$BACKFILENAME"-$(($i + 1))
  fi
done

rm -f "$BACKDIR"/"$BACKFILENAME"-9

# Hold guest writes in a temp COW file
virsh snapshot-create-as --domain web bsnap --diskspec vda,file=/srv/machines/bsnap.qcow2 --disk-only --atomic --quiesce

# Make backup of the guest RAW image
cp -a /srv/machines/"$BACKFILENAME" "$BACKDIR"/"$BACKFILENAME"-0

# commit guest writes to the usual RAW file
virsh blockcommit web vda --active --verbose --pivot

Zabbix CPU I/O 等待图显示备份大约需要 1 小时。在此期间的每个晚上,但在不同的时间,我都会在客户虚拟机中收到内核 oops(不确定它们是否真的是 oops),如下所示:

Jul  4 02:13:59 web kernel: [83400.216115] INFO: task jbd2/dm-0-8:200 blocked for more than 120 seconds.
Jul  4 02:13:59 web kernel: [83400.216485]       Not tainted 3.16.0-4-amd64 #1
Jul  4 02:13:59 web kernel: [83400.216817] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Jul  4 02:13:59 web kernel: [83400.217427] jbd2/dm-0-8     D ffff880efef1dac8     0   200      2 0x00000000
Jul  4 02:13:59 web kernel: [83400.217433]  ffff880efef1d670 0000000000000046 0000000000012f00 ffff880efef87fd8
Jul  4 02:13:59 web kernel: [83400.217437]  0000000000012f00 ffff880efef1d670 ffff880f3fcb37b0 ffff880f3ff7a5e8
Jul  4 02:13:59 web kernel: [83400.217441]  0000000000000002 ffffffff811d7620 ffff880efef87c80 ffff8800bbba8b98
Jul  4 02:13:59 web kernel: [83400.217444] Call Trace:
Jul  4 02:13:59 web kernel: [83400.217454]  [<ffffffff811d7620>] ? generic_block_bmap+0x50/0x50
Jul  4 02:13:59 web kernel: [83400.217460]  [<ffffffff815114a9>] ? io_schedule+0x99/0x120
Jul  4 02:13:59 web kernel: [83400.217464]  [<ffffffff811d762a>] ? sleep_on_buffer+0xa/0x10
Jul  4 02:13:59 web kernel: [83400.217468]  [<ffffffff8151182c>] ? __wait_on_bit+0x5c/0x90
Jul  4 02:13:59 web kernel: [83400.217471]  [<ffffffff811d7620>] ? generic_block_bmap+0x50/0x50
Jul  4 02:13:59 web kernel: [83400.217474]  [<ffffffff815118d7>] ? out_of_line_wait_on_bit+0x77/0x90
Jul  4 02:13:59 web kernel: [83400.217480]  [<ffffffff810a7e90>] ? autoremove_wake_function+0x30/0x30
Jul  4 02:13:59 web kernel: [83400.217498]  [<ffffffffa00c542e>] ? jbd2_journal_commit_transaction+0x175e/0x1950 [jbd2]
Jul  4 02:13:59 web kernel: [83400.217507]  [<ffffffff810a2f21>] ? pick_next_task_fair+0x6e1/0x820
Jul  4 02:13:59 web kernel: [83400.217514]  [<ffffffffa00c8be2>] ? kjournald2+0xb2/0x240 [jbd2]
Jul  4 02:13:59 web kernel: [83400.217518]  [<ffffffff810a7e60>] ? prepare_to_wait_event+0xf0/0xf0
Jul  4 02:13:59 web kernel: [83400.217524]  [<ffffffffa00c8b30>] ? commit_timeout+0x10/0x10 [jbd2]
Jul  4 02:13:59 web kernel: [83400.217530]  [<ffffffff8108809d>] ? kthread+0xbd/0xe0
Jul  4 02:13:59 web kernel: [83400.217534]  [<ffffffff81087fe0>] ? kthread_create_on_node+0x180/0x180
Jul  4 02:13:59 web kernel: [83400.217539]  [<ffffffff81514958>] ? ret_from_fork+0x58/0x90
Jul  4 02:13:59 web kernel: [83400.217543]  [<ffffffff81087fe0>] ? kthread_create_on_node+0x180/0x180

结果,一些随机进程被终止(昨晚是数据库引擎……)。我没有足够的技能来解码这里客户机内核到底发生了什么,但同一行中的这句话120 secondsjbd2我怀疑某种文件系统超时是罪魁祸首。现在,假设我的怀疑方向正确,我猜想主机备份脚本严重干扰了客户机的 I/O 性能。

请注意,主机有 256GB 的 RAM 内存,客户机映像大小为 180GB,几乎整个客户机映像都保存在 RAM 中(vmtouch 显示缓存了 90% 到 98% 的数据)。我无法判断临时 COW 文件的情况,但即使它保存在磁盘上,在我看来,120 秒的时间太长了,对于软件 RAID1 6GB/s 企业级 SATA 磁盘来说,这是不合理的。此外,主机操作系统日志没有显示任何可能让我怀疑磁盘 I/O 性能问题的内容。当时,服务器负载只是备份脚本所做的,没有其他任何事情。

我的备份脚本中是否存在任何可能导致此类问题的内容?

相关内容