0

パフォーマンスと安定性の理由から、phpredis をテストしてきました。パフォーマンスは優れていますが、継続的なテストの後、「ab」を介して同じスクリプトを実行すると、繰り返し可能なスタック トレース エラーが発生します。

パターンはこのテストを 3 ~ 4 回実行します

ab -n 10000 -c 10 -k "http://localhost:84/index.php rw_app_id=1&code=test&device_id=test"

(ブラウザからリクエストを実行すると、エラーが表示されないように見えますが、プロセスをロードできないためかもしれません。)

通常、3 回目または 4 回目の反復中に、Apache エラー ログは次のように報告します。

Apache エラー ログ:

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: PHP 致命的なエラー: /var/www/web1/web/index.php:108 でメッセージ「Redis server going away」を含む例外「RedisException」がキャッチされない

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: スタック トレース: [2012 年 4 月 18 日水曜日 16:39:49] [警告] [クライアント 127.0.0.1] mod_fcgid: stderr: #0 /var/www/web1/web /index.php(108): Redis->hGet('rw_promo_code:1...', 'unlock_code')

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: #1 /var/www/web1/web/index.php(172): RedeemAPI->redeem()

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: #2 {main}

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: /var/www/web1/web/index.php:0 でメッセージ「Redis server going away」を伴う次の例外「RedisException」

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: スタック トレース:

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: #0 /var/www/web1/web/index.php(172): Redis->__destruct()

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: #1 /var/www/web1/web/index.php(172): RedeemAPI->redeem()

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: #2 {main}

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: 行 0 の /var/www/web1/web/index.php でスローされます

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: PHP 致命的なエラー: /var/www/web1/web/index.php:108 でメッセージ「Redis server going away」を含む例外「RedisException」がキャッチされない

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: スタック トレース:

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: #0 /var/www/web1/web/index.php(108): Redis->hGet('rw_promo_code:1...', 'unlock_code')

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: #1 /var/www/web1/web/index.php(172): RedeemAPI->redeem()

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: #2 {main}

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: /var/www/web1/web/index.php:0 でメッセージ「Redis server going away」を伴う次の例外「RedisException」

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: スタック トレース:

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: #0 /var/www/web1/web/index.php(172): Redis->__destruct()

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: #1 /var/www/web1/web/index.php(172): RedeemAPI->redeem()

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: #2 {main}

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: 行 0 の /var/www/web1/web/index.php でスローされます

[警告] [クライアント 127.0.0.1] mod_fcgid: stderr: PHP 致命的なエラー: /var/www/web1/web/index.php:108 でメッセージ「Redis server going away」を含む例外「RedisException」がキャッチされない

等....

Apache と Redis を再起動し、サイクルを繰り返すことができます。場合によっては、再度接続して一部のリクエストを正常に処理します。

例外をキャッチして再接続を試みることはできますが、プロセスは回復しません。

Ubuntu x86_64 11.10 Redis バージョン 2.4 Apache/2.2.20 (Ubuntu) mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_fcgid/2.3.6 mod_perl/2.0.5 Perl/v5.12.4

4

1 に答える 1

0

https://github.com/antirez/redis/issues/340でこれを見つけました:

これは、OS が接続を十分に高速にクリーンアップしていないことが原因である可能性があります。次の警告は、redis-benchmark でキープアライブが無効になっている場合に発行されますが、ループ ベンチマークを実行する場合も同様に保持されます。

警告: キープアライブが無効になっています。おそらく必要です

echo 1 > Linux の場合は /proc/sys/net/ipv4/tcp_tw_reuse

sudo sysctl -w net.inet.tcp.msl=1000 (Mac OS X の場合、多くのクライアント/リクエストを使用するため)

私はこれをテストしましたが、それは役に立ちました - しかし、私はまだエラーが発生します

[警告] [クライアント 127.0.0.1] (104) ピアによる接続のリセット: mod_fcgid: FastCGI サーバーからのデータ読み取りエラー [エラー] [クライアント 127.0.0.1] スクリプト ヘッダーの途中終了: index.php

アップデート:

1,000,000 件のリクエスト (一度に 10 件) をテストしましたが、エラーはありませんでした。

于 2012-04-19T03:18:10.003 に答える