5.8.1.13 网络探针

网络探针监视通过网络从 MySQL 服务器和所有类型的 Client 端进行的信息传输。探针的定义如下:

net-read-start()
net-read-done(status, bytes)
net-write-start(bytes)
net-write-done(status)
  • net-read-start:开始网络读取操作时触发。

  • net-read-done:网络读取操作完成时触发。 status是 table 示操作返回状态的integer0table 示成功,1table 示失败。 bytes参数是一个整数,指定在处理期间读取的字节数。

  • net-start-bytes:将数据写入网络套接字时触发。单个参数bytes指定写入网络套接字的字节数。

  • net-write-done:当网络写操作完成时触发。单个参数status是一个整数,代 table 操作的返回状态,0table 示成功,1table 示失败。

您可以使用网络探针来监视执行期间从网络 Client 端读取和写入网络 Client 端所花费的时间。以下 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));
}

在具有远程 Client 端的计算机上执行上述脚本时,您可以看到执行查询所花费的时间中大约有三分之一与将查询结果写回到 Client 端有关。

St Who                            DB            ConnID       Dur microsec Query
 0 root@::ffff:198.51.100.108      test              31               3495 select * from t1 limit 1000000
Net read: 0 bytes (0 ms) write: 10000075 bytes (1220 ms)