負荷が高いときに断続的にエラー 404 が発生します。(nginx/php/apc/mysql)

負荷が高いときに断続的にエラー 404 が発生します。(nginx/php/apc/mysql)

私は 4GB の RAM を搭載した 4 CPU コアの VPS を持っています。Ubuntu 10.04、nginx/0.7.65、PHP 5.3.2、MySQL を実行しています。nginx との通信には php5-fpm を使用しています。また、php キャッシュを補完する php5-apc も使用しています。

このシステムは 4 つのサイトを運営しており、1 日あたり約 250 万ページビューを記録しています。

問題の概要 - サイトのページの読み込み時に、エラー 404 が断続的に表示されます。これはすべてのページで発生する可能性があり、何度も更新しても、平均して 7 ~ 10 回に 1 回発生します。

試したこと - Ubuntu と nginx を更新し、php と nginx の構成を試しました。この問題は、Ubuntu 11.10 および nginx/1.0.5 でも再現されました。

注目すべきログ - Nginx error.log と access.log には異常は何も示されていませんが、404 が発行されたときにレポートされます。php5-fpm.log には次のように表示されます:
Nov 20 21:47:45.640003 [ERROR] [pool www] unable to retrieve process activity of one or more child(ren). Will try again later.
ただし、以前のセットアップで確認したように、これがこの問題に関連しているとは確信できません。

構成 (スペースを節約するために画像へのリンク) - * APC 設定、フラグメンテーション: 0%、キャッシュ フル カウントは 0 であることに注意してください。https://i.stack.imgur.com/i0TrK.png * nginx.conf

user www-data;
worker_processes  4;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    use epoll;
# multi_accept on;
}
http {
include       /etc/nginx/mime.types;
server_names_hash_bucket_size 64;
access_log off;  #/var/log/nginx/access.log;

sendfile        on;
#tcp_nopush     on;

keepalive_timeout  0;
#keepalive_timeout  65;
tcp_nodelay        on;

gzip  on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
  • nginx.confに含まれる典型的なサイト構成https://i.stack.imgur.com/I3Y4N.png
  • 私の php5-fpm.conf は、pm.max_children = 10 から pm.max_children = 30 に変更されている点を除いてデフォルトです。
  • 私のphp5設定はデフォルトです。編集はsendmail/postfix関連のみです。
  • ulimit -n は 1024 を表示します

役に立つこと - この状況から唯一解放されたのは、2 つの最も忙しいサイトのうちの 1 つを独自の VPS に移動したことです。システムには十分なリソースがあるので、すべてのサイトを 1 つの VPS にまとめたいのは当然です。どこかでオープン ファイルの制限に達しているのでしょうか? PHP 関連の何かと関係があるのではないかと疑っています。

これはどこかの設定の問題であると確信しています。ただし、それが何であるかは確信が持てず、この質問を投稿する前に 48 時間かけて調査しようとしました。

答え1

このバグに遭遇したようですので、PHP >=5.3.4 にアップグレードすると解決するはずです:参考:

関連情報