如何在 Solaris ZFS 上查找具有顶级 io 的文件?

如何在 Solaris ZFS 上查找具有顶级 io 的文件?

我有一台基于 Solaris 10 ZFS 的 NFS 服务器。物理磁盘或多或少处于其最大 io 速率。性能非常差 - 因此我们将添加主轴。NFS 仅用作 XenServer Hypervisor 的存储。

我想知道哪些 VM 磁盘(即存储上的 .vhd 文件)产生了大部分负载。我如何查询文件系统或 nfsd 以获取带有文件名和读取/写入的 iostat 或 top 之类的输出。数字可以是绝对的,也可以是相对的。

我试过iosnoop。它肯定朝着正确的方向发展。不幸的是,它似乎无法获取 ZFS 文件系统上的文件名。我没有使用 dtrace 的经验。也许已经有一个脚本了?

答案1

您需要使用 dtrace 来进行该级别的自省。以下是来自的 nfsv3fileio.d 示例https://wikis.oracle.com/display/DTrace/nfsv3+Provider,但已更新以实时运行(我想,我的测试很少)。同一页面还有更多示例。您也可以在 Google 上搜索“nfssvrtop”。

#!/usr/sbin/dtrace -s

#pragma D option quiet

dtrace:::BEGIN
{
        trace("Tracing.. hit CTRL-C to end. Updates every 5 seconds.\n");
}

nfsv3:::op-read-done
{
        @bytes_read[args[1]->noi_curpath] = sum(args[2]->res_u.ok.data.data_len);
}

nfsv3:::op-write-done
{
        @bytes_written[args[1]->noi_curpath] = sum(args[2]->res_u.ok.count);
}

profile:::tick-5sec
{
        trunc(@bytes_read, 15);
        trunc(@bytes_written, 15);
        printf("\n%15s   %15s   %s\n", "Bytes Read/5s", "Bytes Written/5s", "Pathname");
        printa("%@15d   %@15d   %s\n", @bytes_read, @bytes_written);
        trunc(@bytes_read);
        trunc(@bytes_written);
}

答案2

您的设置中是否有任何级别的 NVRAM 写入缓存?在 ZFS 的情况下,它将存在ZIL 设备? 如果不是,那可能就是您性能问题的关键。

相关内容