|
作为 I/O 调度的一部分,ZFS 有一个字段叫 'zfs_vdev_max_pending'。该字段限制了在每个页虚拟设备 (vdev) 中我们可以向下发送的 I/O 的最大数量。这并不是每个文件系统或每个池的最大量。当前默认值为 35。对于现在的硬盘驱动器来说,这个数字已经很不错了,但是,对于那些实际上由很多的硬盘组成却作为一个单独设备输出到 ZFS 的存储阵列来说,这显然不够。
如果您的 I/O 负荷很大,就像 Bill 在博客 "ZFS vs. The Benchmark" 中描述的那样,那么这个限制是一件好事。
但是,如果您已经创建了一个双设备镜像池,其中每个设备都是一个由 10 个磁盘组成存储阵列,那么您可能会认为 ZFS 没有为您提供足够的 I/O,下面的脚本将告诉您这是否属实:
#!/usr/sbin/dtrace -s
vdev_queue_io_to_issue:return
/arg1 != NULL/
{
@c["issued I/O"] = count();
}
vdev_queue_io_to_issue:return
/arg1 == NULL/
{
@c["didn't issue I/O"] = count();
}
vdev_queue_io_to_issue:entry
{
@avgers["avg pending I/Os"] = avg(args[0]->vq_pending_tree.avl_numnodes);
@lquant["quant pending I/Os"] = quantize(args[0]->vq_pending_tree.avl_numnodes);
@c["total times tried to issue I/O"] = count();
}
vdev_queue_io_to_issue:entry
/args[0]->vq_pending_tree.avl_numnodes > 349/
{
@avgers["avg pending I/Os > 349"] = avg(args[0]->vq_pending_tree.avl_numnodes);
@quant["quant pending I/Os > 349"] = lquantize(args[0]->vq_pending_tree.avl_numnodes, 33, 1000, 1);
@c["total times tried to issue I/O where > 349"] = count();
}
/* bail after 5 minutes */
tick-300sec
{
exit(0);
}
如果您发现 "avg pending I/Os" 达到了您的 vq_max_pending 限制,您可以适当提高这个限制。过去我们通常需要对每个虚拟设备进行一次这样的操作,但是现在我们有一个方法可以一次性改变对全部虚拟设备的限制。
heavy# mdb -kw
Loading modules: [ unix genunix specfs dtrace cpu.generic cpu_ms.AuthenticAMD.15 uppc pcplusmp scsi_vhci ufs ip hook neti sctp arp usba fctl nca lofs zfs random nfs cpc fcip logindmux ptm sppp ipc ]
> zfs_vdev_max_pending/E
zfs_vdev_max_pending:
zfs_vdev_max_pending: 35
> zfs_vdev_max_pending/W 0t70
zfs_vdev_max_pending: 0x23 = 0x46
> zfs_vdev_max_pending/E
zfs_vdev_max_pending:
zfs_vdev_max_pending: 70
>
上述方法将上限从 35 变为了 70。
由于很难让人们自己进行变量调整,我们最好将 'vq_max_pending' 设置为动态集合,请参见
6457709 vdev_knob values should be determined dynamically。
(2008-05-14 22:51:52.0/2008-05-14 21:00:00.0)
Permalink
Trackback: http://blogs.sun.com/erickustarz/en_US/entry/vq_max_pending1
|