問題は、ファイルプロセスが完了するまで、ワーカープロセスが既に処理しているリクエストがそれ以上処理されないことです。 多数の大きなファイルがある場合、これによりワーカーの作業が著しく遅くなる可能性があります。
以前は、ワーカープロセスの数を増やすことでこの問題を解決していました。 現在、代替ソリューションがあります。 :)ただし、ファイルAIOを含める前に、いくつかのニュアンスを検討する価値があります。
まず、新しいバージョンからの生産性の大幅な向上は期待できないという事実に注意を喚起したいと思います。 これは非常に特定の負荷でのみ可能です-同じサーバーが同時にいくつかの小さな静的ファイルと非常に多数の大きなファイルを送信するとき。
第二に、ファイルAIOは、FreeBSD 4.3以降、またはカーネルバージョン2.6.22以降のLinuxでのみ機能します。
第三に、FreeBSDにAIOを含めるのは、FreeBSD-6.4 STABLE、FreeBSD 7、またはそれ以降のバージョンのみです。 以前のバージョンでは、AIOをオンにすると、ネットワークサブシステムはGiant Lockの使用を開始します。つまり、同時に他のシステムコールを行うことはできません。 言い換えれば、非同期性からほとんど利益を得られないということです。
最後に、LinuxでAIOを使用する場合は、directioも有効にする必要があります。 また、Directioを有効にするとsendfileの使用が自動的に無効になるため、Linuxですべてを正しく理解していれば、AIOを使用してsendfileのデータをロードすることはまだできません。
それでも必要だと思われる場合は、AIOが非常に簡単に含まれています。 Linuxの場合、configフラグメントは次のようになります。
aio on; # AIO
directio 512; # O_DIRECT , 512
output_buffers 128 512k; # ,
参照:
NginxドキュメントのAIOの説明
変更履歴