【必見】ファイルディスクリプタ設定でLinuxをチューニング

当社のように広告システムを運用してると、予想していたよりもトラフィックやデータ量が増大して、パフォーマンスを向上させないといけない場面に出くわすことも珍しくありません。 普及しているLAMPでもapache, mysql, phpなどそれぞれにチューニングする観点はありますが、今回は特にLinuxに焦点をあて、パフォーマンス向上のためのチューニングを解説します。

エラーログで「too many connection・・・」といったエラーが出力されることがありますよね? この場合、単純にapacheなどのmaxclientの設定という可能性もありますが、ファイルディスクリプタの上限である可能性もあります。

ファイルディスクリプタの上限

サーバのリソースを消費すると、ファイルディスクリプタも同時に消費します。 このファイルディスクリプタの上限値がデフォルトで1024です。 つまり、同時にサーバリソースは1024までしか消費ができない、ということです。

※ファイルディスクリプタはプロセスで管理されており、デフォルトでは1プロセスにつき1024が上限です。

この値をチューニングをおこなうにあたりデタラメに設定するわけに行きませんので、まず上限値を確認します。 OS全体でオープン可能なファイルディスクリプタ数は、

$cat /proc/sys/fs/file-max

で確認できます。 チューニングを考慮する際には、(apacheなどで大量リクエストを処理するときなど)同時にこれらの値も検討する必要があります。

ファイルディスクリプタの設定

実際の設定は、「/etc/init.d/****」ファイルで設定すると良いでしょう。 この設定をしておくことで、再起動を行なっても設定が反映されます。

※ chkconfig で適切なランレベルが付与されていることを前提とします。

設定例

ulimit -n 12288

また「/etc/security/limits.conf」の設定もしておきましょう。 この設定はログインしないデーモンプロセスには無効ですが、ログインする度に設定する手間が省けます。

設定例

root    soft    nofile  12288
root    hard    nofile  12288

該当ユーザで「ulimit –a」或いは「ulimit –n」を実行すれば確認することができます。 上記の例では、「12288」と設定されていればOKです。 もし設定されていなければ、一旦ログアウトし再度確認してみましょう。

ファイルディスクリプタをチューニングする際にはユーザプロセスを同時に検討することも多いので、知識の片隅くらいには留めておくと役に立つときが来るかもしれません。