我有一台带有大量 SAN 磁盘的 Solaris 10 服务器(所有路径上接近 1000 个)。 iostat -En
需要将近 5 分钟才能返回。有没有办法找出导致延迟的原因?truss 帮不上什么忙。
答案1
dtrace 绝对是您正在寻找的工具。您可以使用相对简单的脚本来找出哪个系统调用最耗时。
像这样:
#!/usr/sbin/dtrace -s
syscall:::entry
/execname == "iostat"/
{
self->ts = vtimestamp;
}
syscall:::return
/self->ts/
{
@[probefunc] = sum(vtimestamp - self->ts);
@["- all syscalls -"] = sum(vtimestamp - self->ts);
self->ts = 0;
}
profile:::tick-1sec
/i++ >= 59/
{
exit(0);
}
另外,您可以使用DTrace 工具包,也许你会在那里找到一些现成的、更合适的东西。
一旦确定了卡住的系统调用,您将能够围绕它进行更多调查。