Apache ab 测试并失败 — Apache 或 PHP 配置问题?

Apache ab 测试并失败 — Apache 或 PHP 配置问题?

我使用 PHP 和 Restler 库编写了一个 RESTful Web 服务作为移动应用程序的骨干。它运行在我的开发服务器上,该服务器运行 Windows Server 2008 R2、PHP 5.3.5、Apache 2.2.17 和 MySQL 5.5.8。为了好玩,我决定对我的开发服务器进行基准测试,结果遇到了一个可能的配置问题

如果我ab -k -n 1000 -c 50 http://myproductionserver.com/something/restful通过 Windows CLI 运行,通常会在 300-700 个请求之间停止。错误显示“apr_socket_recv:远程主机强制关闭现有连接。(730054)。总共完成 X 个请求。”

我想我应该检查一下我的 Apache 错误日志。但毫无帮助。这是我用 ab 调用的错误:

[Fri Feb 24 17:23:27 2012] [notice] Parent: child process exited with status 255 -- Restarting.
[Fri Feb 24 17:23:27 2012] [notice] Apache/2.2.17 (Win32) PHP/5.3.5 configured -- resuming normal operations
[Fri Feb 24 17:23:27 2012] [notice] Server built: Oct 18 2010 01:58:12
[Fri Feb 24 17:23:27 2012] [notice] Parent: Created child process 768
[Fri Feb 24 17:23:28 2012] [notice] Disabled use of AcceptEx() WinSock2 API
[Fri Feb 24 17:23:28 2012] [notice] Child 768: Child process is running
[Fri Feb 24 17:23:28 2012] [notice] Child 768: Acquired the start mutex.
[Fri Feb 24 17:23:28 2012] [notice] Child 768: Starting 64 worker threads.
[Fri Feb 24 17:23:28 2012] [notice] Child 768: Listening on port 80.

因此,当我回到家时,我使用本地 IP 运行了相同的测试 - 认为这可能是网络问题。同样的事情发生了。我已经搜索了很长时间,但没有太多答案。我发现了一个非常相似的问题,解决方案是在 httpd.conf 文件中使用“Win32DisableAcceptEx”,说明该问题实际上是 PHP .dll 的一个错误。我禁用了除基本 MySQLi 之外的所有 MySQLi。从上面的日志可以看出,两者都没有起到什么作用。

有人知道吗?我发送 1000 个请求真的会让服务器崩溃吗?如果您需要更多信息,请告诉我!我知道这只是一个放在家里的开发服务器 - 但它模仿了我的生产服务器。我需要先解决这个问题,然后再继续。非常感谢您的帮助!

答案1

你可能要看看最大客户数设置和服务器限制您的 apache 实例的设置,可能低于您的预期,以确保这不是 apache 施加的限制。但是快速查看文档表明两者的默认值都是 256,小于您的 ab 施加的 50 个连接限制。

服务器是否真的崩溃了,即您需要重新启动 httpd 还是在负载消除后它是否会继续处理请求?


我会设置日志级别 debug 和 httpd.conf,尝试使用更少的连接数和总 n,然后增加测试次数。我还会查看 RLimitCPU RLimitNPROC
RLimitMEM 的值

因为它们也是 apache 可能开始终止进程​​/线程/连接等的限制。

相关内容