M.C.P.C. (Mamesibori Creation Plus Communication)

印刷屋から五反田のWeb屋に転職したCLのブログです。

Linuxの/tmpディレクトリをリアルタイム監視(Perl使用)

Linuxの /tmp ディレクトリには様々なアプリケーションやデーモンが一時ファイルを格納する場所として使うわけで、ここへの書き込みや読み取りが頻繁だとシステムのスループットが下がったりします。

いまどきは、/tmpをLinuxのRAMディスクファイルシステムであるtmpfsに割り当てたり、システムディスク自体をSSDの様な高速なストレージにするみたいな方法でアプリケーション側の改変をせずに高速化できたりしていますが私の目の前にあるのはメモリ的に余裕がなく、なおかつディスクのIOPSがあまりよくない残念なサーバだったりするわけで、あろうことか/tmp に300MBも一気に書き込む奴がいるのでそのタイミングでシステム全体のパフォーマンスが落ちてヤバイ、ていうことになり、犯人捜しをするための、/tmp を監視するスクリプトを作りました。

github.com

実行すると、こんな感じになります。

$ carton exec perl watchtmp.pl
2015-06-28T06:46:44     access  /tmp/#sql_4da_0.MYI     1024    1024.000B
2015-06-28T06:46:44     access  /tmp/#sql_4da_0.MYD     43410900        41.400MB
2015-06-28T06:46:46     access  /tmp/#sql_4da_0.MYD     33128   32.352KB
2015-06-28T06:46:51     access  /tmp/#sql_4da_0.MYI     1024    1024.000B
2015-06-28T06:46:51     access  /tmp/#sql_4da_0.MYD     929760  907.969KB
2015-06-28T06:46:51     access  /tmp/zbxTMP21327        2384    2.328KB
2015-06-28T06:47:01     access  /tmp/#sql_4da_0.MYI     1024    1024.000B
2015-06-28T06:47:01     access  /tmp/#sql_4da_0.MYD     39427836        37.601MB
2015-06-28T06:47:05     access  /tmp/#sql_4da_0.MYI     1024    1024.000B
2015-06-28T06:47:05     access  /tmp/#sql_4da_0.MYD     2097152 2.000MB
2015-06-28T06:47:05     access  /tmp/#sql_4da_0.MYI     1024    1024.000B
2015-06-28T06:47:05     access  /tmp/#sql_4da_0.MYI     1024    1024.000B
2015-06-28T06:47:05     access  /tmp/#sql_4da_0.MYD     1351680 1.289MB
2015-06-28T06:47:05     access  /tmp/#sql_4da_0.MYI     1024    1024.000B
2015-06-28T06:47:06     access  /tmp/#sql_4da_0.MYI     1024    1024.000B
2015-06-28T06:47:06     access  /tmp/#sql_4da_0.MYI     1024    1024.000B
...

PHPのイベント駆動よくわからんかったので慣れたPerlで作ってしまった……

一時ファイルは、生成されてから消えるまでが鬼のように短時間なので、/tmp を watch -n 1 ls -al /tmpで1秒ごと監視していてもテンポラリファイルが観測されることが稀ですが、今回作ったのは、Linuxのinotifyでファイルシステムの変更時にイベントを取るようにしているので、割と引っかかってきます。

アプリケーションによっては、テンポラリの生成のアルゴリズムが違うので調整が必要。具体的にはmodifyで徐々にファイルサイズが成長してきた直後にaccessがくるタイミングを見て表示しています。ですが他のタイミングで見たいならスクリプトの中でいじればいいと思います。

今回は、MySQLが巨大テンポラリファイルを生成しているのが観測されました。そのタイミングでMySQLのPROCESSLISTで怪しいSQL文が特定できたので、それを修正することで対応ができたとさ。

それにしても、巨大テンポラリをHDDのようなストレージに書き出すとどんだけストールするか実感してもらいたいと思って具体的な数字をもって見せてみたのですが、今どきの子は、パソコンを自作していないからHDDの転送速度に関する規模感を持っておらず、何も効果が無かったのでした。