Linuxの/tmpディレクトリをリアルタイム監視(Perl使用)
Linuxの /tmp ディレクトリには様々なアプリケーションやデーモンが一時ファイルを格納する場所として使うわけで、ここへの書き込みや読み取りが頻繁だとシステムのスループットが下がったりします。
いまどきは、/tmpをLinuxのRAMディスクファイルシステムであるtmpfsに割り当てたり、システムディスク自体をSSDの様な高速なストレージにするみたいな方法でアプリケーション側の改変をせずに高速化できたりしていますが私の目の前にあるのはメモリ的に余裕がなく、なおかつディスクのIOPSがあまりよくない残念なサーバだったりするわけで、あろうことか/tmp に300MBも一気に書き込む奴がいるのでそのタイミングでシステム全体のパフォーマンスが落ちてヤバイ、ていうことになり、犯人捜しをするための、/tmp を監視するスクリプトを作りました。
実行すると、こんな感じになります。
$ 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の転送速度に関する規模感を持っておらず、何も効果が無かったのでした。