最近、自鯖が妙にディスクIOが重いようなので調査してみました。
zabbixでもディスクIOを監視する方法(https://blog.apar.jp/zabbix/1405/)があったので導入していたのですが、分単位での計測なので散発的な書き込みは拾えないらしく役に立ちませんでした(spsというセクタ単位でしか拾えないのも面倒)。
dstatというvmstatの上位版の様なツールを使ってリアルタイムで確認(yumでdstatをインストール)すると、何故か大量に書き込みされている(ちなみにdstat、ターミナルの背景を黒くしていると–nocolorを付けないと単位表示が消えるので注意)ようです。
動かしているのはmysqlとnginxとphpくらいで、大したアクセスもないサイトなのでおかしいと思い、iotopや
pidstat -d | head -3; sudo pidstat -d | grep nginx
でnginxプロセスの読み書き量をチェック(pidstatはyumでsysstatをインストール)すると、nginxがなにか大量に書き込んでいる模様。
ll /proc/[pid]/fd
すると、大半がsocketに対するアクセスかのように見えましたが、よく見ると
こんな行が。fastcgi_tempディレクトリにアクセスしている様です。
inotifywait -r -m /var/cache/nginx/fastcgi_temp/
このコマンドでディレクトリ内の読み書きをチェックすると猛烈な勢いで書き込みが行われています(inotifywaitはyumでinotyfi-toolsをインストール)。
Nginxの設定
見た通りfastcgiのキャッシュディレクトリの様ですが、自環境のnginxのconfファイルでは一切fastcgiの設定はしていませんでした(大したシステムでもないのでgzipなど最低限の設定位しかしていませんでした)。
ドキュメントを見た所、どうやらデフォルトでONになっているようです。試しにfastcgi_cacheを止めてみる事にしました。fastcgi_buffering off;にすると止まります(部分的にlocationなどで止めるにはfastcgi_no_cache 1;を置けばいい筈です)。
止めてからdstatおよびinotifywaitで確認した所、やはり問題はfastcgi_cacheだったらしくHDDの書き込みは収まりました。しかしキャッシュが無効化されているので当然のことながら今度は目に見えてディスクからの読み込みが増えました。
RAMディスクの割当
fastcgi_cacheは再度有効にし、キャッシュディレクトリをRAMディスクに割り当てる事にします。メモリ上でならどれだけ読み書きしてもディスクにダメージはありません。
service nginx stop mount -t tmpfs -o size=1g /dev/shm /var/cache/nginx service nginx start vi /etc/fstab /dev/shm /var/cache/nginx tmpfs defaults,size=10G 0 0
改めてチェックすると、サーバのHDD書き込み量が収まっている事を確認しました。
ちなみに余談ですが、dstatを始めとしたツールってHDDとRAMディスクの読み書きが区別されてるか否かってどう確認するんでしょうか?OSにとって記録デバイスは透過的に扱ってるだろうから区別なし?
コメント