主机操作系统和客户操作系统都是 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 seconds
让jbd2
我怀疑某种文件系统超时是罪魁祸首。现在,假设我的怀疑方向正确,我猜想主机备份脚本严重干扰了客户机的 I/O 性能。
请注意,主机有 256GB 的 RAM 内存,客户机映像大小为 180GB,几乎整个客户机映像都保存在 RAM 中(vmtouch 显示缓存了 90% 到 98% 的数据)。我无法判断临时 COW 文件的情况,但即使它保存在磁盘上,在我看来,120 秒的时间太长了,对于软件 RAID1 6GB/s 企业级 SATA 磁盘来说,这是不合理的。此外,主机操作系统日志没有显示任何可能让我怀疑磁盘 I/O 性能问题的内容。当时,服务器负载只是备份脚本所做的,没有其他任何事情。
我的备份脚本中是否存在任何可能导致此类问题的内容?