cpuのステータスがnfsになって重くなっていた件

過去というか現在も自分のところのwebサーバが悲鳴を上げ続けてて、topしたときのstatusがnfsを連発してることが。

未だに原因は不明ですが、一つのヒントとしての記事が見つかったのでメモ。

これはちょっと限られた事例ですが, sy の CPU利用率が高く b のプロセスも多いケースがありました。
PHP でのセッションファイル共有のための NFSサーバで起こっていたのですが, アクセスが多い時間帯に sy の CPU利用率が高くなり若干重くなっていました。

原因は, 各 Webサーバでのセッションガベージコレクションが走る度に NFSサーバで readdir(2) が呼ばれ, 巨大なディレクトリツリーが転送されていたためでした。
ライフタイムを長めに取っていたこととユーザの増加のせいで, セッションファイルの数が 20~30万と多くなりすぎていて, これらの情報を取得するのにカーネルコード部分で負荷がかかっていたようです。

sy の数値が高かったのは, readdir(2) のシステムコールで CPU時間が取られていたためでしょう。
wa がサポートされている vmstat では, wa の数値も高くなるかもしれません。

対策として, 各 Webサーバの php.ini を session.gc_probability = 0 に変更し, Webサーバ上でガベージコレクションが発生しないようにして, NFSサーバにて cron処理でセッションファイルを削除するようにしました。*4

PHP で複数の Webサーバでセッションを共有する場合, NFSサーバを立ててセッションファイルを共有する方法を取ることも多いかと思いますが*5, Webサーバからのガベージコレクションを行う場合は, 毎回ディレクトリツリー情報の通信が行われることを心に留めておいてください。

セッションファイルは割と頻繁にアクセスされるため, NFSサーバのパフォーマンスを上げるには, noatime オプションをつけて NFSマウントし, ファイルアクセス時刻を更新しないようにするのも有効です。

サーバ診断:vmstat - Y-110's Wiki

コメントを残す