2013年1月7日月曜日

pt-ioprofileでMySQLのテンポラリテーブルのサイズを測る

Percona-Toolkitのうちの1つにpt-ioprofileというやつがあって、
straceでwriteやread, fsyncのシステムコール呼び出し状況を記録して、
lsofでファイルディスクリプタ番号と紐付けて、集計して出してくれたりする。

一番単純な使い方は多分こんな感じ。



# pt-ioprofile --cell sizes --run-time 60
2013年  1月  6日 日曜日 17:08:03 JST
Tracing process ID 1824
     total       read    pread64   pwrite64      write       open    _llseek filename
      2191          0       1024       1167          0          0          0 /var/lib/mysql/mysql/user.MYI
      1386          0       1386          0          0          0          0 /var/lib/mysql/mysql/proxies_priv.MYD
      1320          0       1320          0          0          0          0 /var/lib/mysql/mysql/db.MYD
       564        512         24         28          0          0          0 /var/lib/mysql/mysql/user.MYD
        81          0          0          0         81          0          0 /var/lib/mysql/bin.000056
         0          0          0          0          0          0          0 /var/lib/mysql/mysql/db.opt


デフォルトの計測時間は30秒。--run-timeで上書き。
デフォルトの集計はI/O`回数'。--cellでsizesを指定するとバイト単位のオペレーション量になる。

1分間でこれらのファイルにこれだけのread, writeが発生してた…というのが測れる。


さてさてさて。
pt-ioprofileを走らせて、おもむろに`converting HEAP to MyISAM'が走る様なクエリを流す。
(tmp_table_sizeを1024に設定して、DISK上に出させる)



# pt-ioprofile --cell sizes --run-time 10

2013年  1月  6日 日曜日 17:22:17 JST
Tracing process ID 4904
     total       read     pwrite      write       open      close      lseek filename
     80400      20100          0      20100          0          0      40200 /tmp/#sql_1328_0.MYD
      1782        328        126       1024          0          0        304 /tmp/#sql_1328_0.MYI



おお、取れた…んだけど、この値合ってんのかな。。
なんか違う気がする。



mysql> DESC t1;
+-------+---------------------+------+-----+---------+----------------+
| Field | Type                | Null | Key | Default | Extra          |
+-------+---------------------+------+-----+---------+----------------+
| num   | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| val   | char(32)            | YES  |     | NULL    |                |
+-------+---------------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

mysql> DESC t2;
+-------+---------------------+------+-----+---------+----------------+
| Field | Type                | Null | Key | Default | Extra          |
+-------+---------------------+------+-----+---------+----------------+
| num   | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| val   | char(32)            | YES  |     | NULL    |                |
+-------+---------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)


mysql> SELECT * FROM t2 LEFT JOIN t1 USING(num) ORDER BY t2.val DESC, t1.val ASC;
+-----+----------------------------------+----------------------------------+
| num | val                              | val                              |
+-----+----------------------------------+----------------------------------+
|  83 | fe9fc289c3ff0af142b6d3bead98a923 | fe9fc289c3ff0af142b6d3bead98a923 |
..
|  27 | 02e74f10e0327ad868d138f2b4fdd6f0 | 02e74f10e0327ad868d138f2b4fdd6f0 |
+-----+----------------------------------+----------------------------------+
100 rows in set (0.05 sec)

mysql> SHOW PROFILE;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.001830 |
| Waiting for query cache lock   | 0.000587 |
| checking query cache for query | 0.000904 |
| checking permissions           | 0.000647 |
| checking permissions           | 0.000546 |
| Opening tables                 | 0.001298 |
| System lock                    | 0.000778 |
| init                           | 0.000812 |
| optimizing                     | 0.004460 |
| statistics                     | 0.000866 |
| preparing                      | 0.000701 |
| Creating tmp table             | 0.001023 |
| executing                      | 0.000597 |
| Copying to tmp table           | 0.003121 |
| converting HEAP to MyISAM      | 0.015940 |
| Copying to tmp table on disk   | 0.005196 |
| Sorting result                 | 0.001541 |
| Sending data                   | 0.000519 |
| end                            | 0.000314 |
| removing tmp table             | 0.001926 |
| end                            | 0.000363 |
| query end                      | 0.000301 |
| closing tables                 | 0.000289 |
| freeing items                  | 0.006751 |
| logging slow query             | 0.000266 |
| cleaning up                    | 0.000558 |
+--------------------------------+----------+
26 rows in set (0.05 sec)



(BIGINT 4バイト + CHAR 32バイト) * 2テーブル結合 * 100行だから、
1行ごとのオーバーヘッド入れても20KiB近くも行かなそうなんだけどな。。

でもtmp_table_sizeを上げながら確認すると、
16KiBだとまだMyISAM変換されて、20KiBだとなくなる。

そんなものなのかぁ。


なおpt-ioprofileはstraceとlsofとpidof(だと思う。動き的に。中身は読んでない)を使ってるだけの
シェルスクリプトなので、


# pt-ioprofile --cell sizes --run-time 10 --profile-process rsyslogd
2013年  1月  6日 日曜日 17:25:44 JST
Tracing process ID 1227
     total      write filename
        46         46 /var/log/messages

こんな真似も可能だったりする。

ただし、
tpcc-mysqlで負荷かけながらmysqldにアタッチしてたら、
スレッドが何本かState: Tでハングって
mysqldが動かなくなったことがあるので、
絶対に本番でやってはダメです。



言われなくてもやりませんね、はい。。

0 件のコメント :

コメントを投稿