ファイルサーバに使っている OmniOS の入ったマシン上で DTrace を使って smb へのアクセスをリアルタイムに見てみました。
OmniOS CE は元々は OpenSolaris ということもあって DTrace が使えるので、こういうことはやろうと思えばすぐにできることは知っていたんですが、使われている言語がちょっと特殊なのでこれまで重い腰が上がらなかったんですよね。今回は[Dtrace SMB-related snippets] All things SMB #tags: smb, dtrace, io に掲載されている smb-read-write-lat-by-path.d を少し改造させてもらいました。
smb-read-write-lat-by-path-rt.d
dtrace -qn 'char m[string];BEGIN { m["smb_fsop_read"] = 0x52; m["smb_fsop_write"] = 0x57;}::smb_fsop_read:entry,::smb_fsop_write:entry { self->arg0 = args[0]; self->node = args[2]; self->t = timestamp;}::smb_fsop_read:return,::smb_fsop_write:return /self->arg0/ { this->delta = timestamp - self->t; this->a_family = self->arg0->session->ipaddr.a_family; this->l_a_family = self->arg0->session->local_ipaddr.a_family; this->addr = &self->arg0->session->ipaddr.au_addr.au_ipv4; this->l_addr = &self->arg0->session->local_ipaddr.au_addr.au_ipv4; printf("%Y\tsrc: %s\tdst: %s\t(%c) %s\t%d\n", walltimestamp, inet_ntop(this->a_family, this->addr), inet_ntop(this->l_a_family, this->l_addr), m[probefunc], stringof(self->node->vp->v_path), this->delta/1000); self->arg0 = 0; self->t = 0; self->node = 0;}/* tick-1200sec { exit(0); } */END {}'
実際にこれを走らせたときのログはこんな感じ。
これでファイルサーバの負荷やレイテンシをリアルタイムに見ることができるようになりました。
2020 Sep 20 13:02:38src: 192.168.1.1dst: 192.168.100.100(W) /path/to/file1322020 Sep 20 13:02:38src: 192.168.1.2dst: 192.168.100.100(W) /path/to/file2312020 Sep 20 13:02:38src: 192.168.1.2dst: 192.168.100.100(W) /path/to/file3182020 Sep 20 13:02:38src: 192.168.1.2dst: 192.168.100.100(W) /path/to/file4112020 Sep 20 13:02:38src: 192.168.1.4dst: 192.168.100.100(W) /path/to/file5172020 Sep 20 13:02:40src: 192.168.1.1dst: 192.168.100.100(W) /path/to/file6202020 Sep 20 13:02:40src: 192.168.1.3dst: 192.168.100.100(W) /path/to/file8182020 Sep 20 13:02:40src: 192.168.1.3dst: 192.168.100.100(W) /path/to/file9102020 Sep 20 13:02:40src: 192.168.1.3dst: 192.168.100.100(R) /path/to/file1032020 Sep 20 13:02:40src: 192.168.1.3dst: 192.168.100.100(R) /path/to/file1142020 Sep 20 13:02:40src: 192.168.1.3dst: 192.168.100.100(R) /path/to/file1222020 Sep 20 13:02:40src: 192.168.1.3dst: 192.168.100.100(R) /path/to/file1362020 Sep 20 13:02:40src: 192.168.1.3dst: 192.168.100.100(R) /path/to/file1412020 Sep 20 13:02:40src: 192.168.1.3dst: 192.168.100.100(R) /path/to/file1552020 Sep 20 13:02:40src: 192.168.1.3dst: 192.168.100.100(R) /path/to/file1622020 Sep 20 13:02:40src: 192.168.1.3dst: 192.168.100.100(R) /path/to/file1732020 Sep 20 13:02:40src: 192.168.1.3dst: 192.168.100.100(R) /path/to/file1812020 Sep 20 13:02:40src: 192.168.1.3dst: 192.168.100.100(R) /path/to/file1932020 Sep 20 13:02:40src: 192.168.1.3dst: 192.168.100.100(R) /path/to/file2012020 Sep 20 13:02:40src: 192.168.1.3dst: 192.168.100.100(R) /path/to/file215