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 错误日志会报告以下内容:

阿帕奇错误日志:

[警告] [client 127.0.0.1] mod_fcgid: stderr: PHP Fatal error: Uncaught exception 'RedisException' with message 'Redis server away' in /var/www/web1/web/index.php:108

[警告] [客户端 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')

[警告] [client 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}

[警告] [client 127.0.0.1] mod_fcgid: stderr: Next exception 'RedisException' with message 'Redis server away' in /var/www/web1/web/index.php:0

[警告] [客户端 127.0.0.1] mod_fcgid:标准错误:堆栈跟踪:

[警告] [客户端 127.0.0.1] mod_fcgid: stderr: #0 /var/www/web1/web/index.php(172): Redis->__destruct()

[警告] [client 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}

[警告] [client 127.0.0.1] mod_fcgid: stderr: 在第 0 行的 /var/www/web1/web/index.php 中抛出

[警告] [client 127.0.0.1] mod_fcgid: stderr: PHP Fatal error: Uncaught exception 'RedisException' with message 'Redis server away' in /var/www/web1/web/index.php:108

[警告] [客户端 127.0.0.1] mod_fcgid:标准错误:堆栈跟踪:

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

[警告] [client 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}

[警告] [client 127.0.0.1] mod_fcgid: stderr: Next exception 'RedisException' with message 'Redis server away' in /var/www/web1/web/index.php:0

[警告] [客户端 127.0.0.1] mod_fcgid:标准错误:堆栈跟踪:

[警告] [客户端 127.0.0.1] mod_fcgid: stderr: #0 /var/www/web1/web/index.php(172): Redis->__destruct()

[警告] [client 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}

[警告] [client 127.0.0.1] mod_fcgid: stderr: 在第 0 行的 /var/www/web1/web/index.php 中抛出

[警告] [client 127.0.0.1] mod_fcgid: stderr: PHP Fatal error: Uncaught exception 'RedisException' with message 'Redis server away' in /var/www/web1/web/index.php:108

ETC....

重新启动 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上找到了这个:

这可能是由于操作系统没有足够快地清理连接造成的。当 redis-benchmark 禁用 keepalive 时会发出以下警告,但对于运行循环基准测试同样有效:

警告:keepalive 已禁用,您可能需要

echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse 对于 Linux 和

sudo sysctl -w net.inet.tcp.msl=1000 用于 Mac OS X,以便使用大量客户端/请求

我对此进行了测试并有所帮助-但是我仍然遇到很多错误

[warn] [client 127.0.0.1] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server [error] [client 127.0.0.1] 脚本头过早结束:index.php

更新:

已测试 1,000,000 个请求 - 一次 10 个 - 零错误。

于 2012-04-19T03:18:10.003 回答