ネットワークプローブは、MySQL Server およびすべてのタイプのクライアントからのネットワーク経由での情報の転送をモニターします。プローブは次のように定義されます。
net-read-start()
net-read-done(status, bytes)
net-write-start(bytes)
net-write-done(status)
net-read-start
: ネットワーク読み取り操作が開始されたときにトリガーされます。net-read-done
: ネットワーク読み取り操作が完了したときにトリガーされます。status
は操作の戻りステータスを表すinteger
で、成功した場合は0
、失敗した場合は1
です。bytes
引数は、プロセス中に読み取られたバイト数を指定する整数です。net-start-bytes
: データがネットワークソケットに書き込まれたときにトリガーされます。単一の引数bytes
は、ネットワークソケットに書き込まれるバイト数を指定します。net-write-done
: ネットワーク書き込み操作が完了したときにトリガーされます。単一の引数status
は操作の戻りステータスを表す整数で、成功した場合は0
で、失敗した場合は1
です。
ネットワークプローブを使用して、実行中にネットワーククライアントからの読み取りおよびネットワーククライアントへの書き込みに費やした時間をモニターすることができます。次の D スクリプトでこの例を示します。読み取りまたは書き込みの累積時間とバイト数が計算されます。ネットワークの読み取りまたは書き込み用の個々のプローブが急激に起動されることに対処するために、動的変数サイズが (dynvarsize
オプションを使用して) 増加されていることに注意してください。
#!/usr/sbin/dtrace -s
#pragma D option quiet
#pragma D option dynvarsize=4m
dtrace:::BEGIN
{
printf("%-2s %-30s %-10s %9s %18s %-s \n",
"St", "Who", "DB", "ConnID", "Dur microsec", "Query");
}
mysql*:::query-start
{
self->query = copyinstr(arg0);
self->who = strjoin(copyinstr(arg3),strjoin("@",copyinstr(arg4)));
self->db = copyinstr(arg2);
self->connid = arg1;
self->querystart = timestamp;
self->netwrite = 0;
self->netwritecum = 0;
self->netwritebase = 0;
self->netread = 0;
self->netreadcum = 0;
self->netreadbase = 0;
}
mysql*:::net-write-start
{
self->netwrite += arg0;
self->netwritebase = timestamp;
}
mysql*:::net-write-done
{
self->netwritecum += (timestamp - self->netwritebase);
self->netwritebase = 0;
}
mysql*:::net-read-start
{
self->netreadbase = timestamp;
}
mysql*:::net-read-done
{
self->netread += arg1;
self->netreadcum += (timestamp - self->netreadbase);
self->netreadbase = 0;
}
mysql*:::query-done
{
this->elapsed = (timestamp - self->querystart) /1000000;
printf("%2d %-30s %-10s %9d %18d %s\n",
arg0, self->who, self->db,
self->connid, this->elapsed, self->query);
printf("Net read: %d bytes (%d ms) write: %d bytes (%d ms)\n",
self->netread, (self->netreadcum/1000000),
self->netwrite, (self->netwritecum/1000000));
}
リモートクライアントを持つマシン上で前述のスクリプトを実行すると、クエリーの実行にかかる時間の約 3 分の 1 が、クライアントに戻すクエリー結果を書き込むことに関連していることが理解できます。
St Who DB ConnID Dur microsec Query
0 root@::ffff:192.168.0.108 test 31 3495 select * from t1 limit 1000000
Net read: 0 bytes (0 ms) write: 10000075 bytes (1220 ms)