Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


5.4.1.13 ネットワークプローブ

ネットワークプローブは、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)