0

在具有良好 CPU、6 GB RAM 和快速主干 Internet 连接的 Debian Web 服务器 (VPS) 上,我运行 PHP 应用程序。PHP 以“prefork”模式运行(包括 APC opcache),因为每当您搜索 PHP 和 MPM worker 时,都会有大量关于线程安全的警告。PHP 应用程序非常大,因此每个服务器进程需要大约 20 到 30 MB RAM。应用程序处理了敏感数据,因此,与 Apache 服务器的所有连接都经过 SSL 加密。

通常,应用程序不显示或显示很少的图像(每个请求大约 1-3 个文件,包括 CSS 和 JS),并且用户每 1 分钟(30 秒到 4 分钟,取决于用户)发送一个新请求。

最近,这个应用程序面临着用户请求的大风暴(计划中,没有 DoS,大约 2.500 个并发用户)。虽然 CPU 运行良好(<50% 的使用率),但我的服务器很快就耗尽了插槽。关键是 - 在 prefork 模式下 - 每个插槽都需要内存,而 6 GB 对于“MaxClients”大约 200 个插槽来说足够了)。

问题 1:根据 Apache 服务器状态,大多数插槽都被“..reading..”占用。有时读取 10 秒甚至更长时间,而 PHP 处理需要 0.1 到 2 秒。用户发送的数据很少,所以我猜这实际上是 SSL 握手。当然,这会占用很多插槽(我还启用并配置了 mod_reqtimeout 以丢弃非常慢的客户端 - 根据http://unhandledexpression.com/2013/01/25/5-easy-tips-to-accelerate-ssl / - 使用 SSLHonorCipherOrder 使用更快的加密密码,SSLCertificateChainFile 也被传输)。

问题 2:如果我启用 KeepAlive(仅 1 或 2 秒)以减少 SSL 开销,插槽将保持打开状态,因此占用的时间是 PHP 处理所需的两倍。

问题 3:如果我真的想为 2.500 个用户提供服务,并且想使用 KeepAlive 来加速 SSL,我需要 2.500 个插槽。但是,我不会有一台具有 32 GB RAM 的机器。

在服务器上有足够多的用户时,为了测试它的限制,我被困在每秒大约 110 个请求,四核系统上大约 50% 的 CPU 负载(最大 400%)。如果我(重新)启用 KeepAlive,则请求/秒会减少。现代网络服务器上的 110 req/sec - 这看起来很荒谬!我不敢相信这实际上是 Apache、PHP 和 SSL 可以执行的。

我的想法有重大失误吗?我是否遇到了 prefork 模式的基本限制?我是否忽略了显而易见的事情?SSL真的是一个性能消耗者吗?感谢您的任何提示!

4

1 回答 1

0

我是那篇关于 SSL 性能的文章的作者。我不认为握手是造成 8 秒以上读取时间的原因。您可以使用http://www.webpagetest.org/获得有用的信息。当请求被标记为“已连接”时,握手完成。

我的猜测是,具有大量并发用户的 PHP 应用程序的缓慢处理可能会使一些用户等待更多时间。

以下是获得更好性能的一些想法:

  • 如果每个客户每分钟都发出一个请求,我认为 KeepAlive 不是一个好主意。
  • 您可以启用 SSL 会话票证以减少握手开销。
  • MPM-Worker 适用于许多不同的设置,因此我鼓励您尝试一下。
  • 如果客户端每次都收到不同的响应,缓存可能对您没有帮助。
  • 你应该测试 PHP-FPM,这可以加速 PHP 代码。
  • 此外,测试 APC,以缓存预编译的 PHP 代码。
  • 我对您的应用程序的架构一无所知,但您可以推迟发送结果:从客户端获取数据,立即发送答案(“处理数据......”或类似的东西),处理数据一个后台进程,然后在下一个请求中,发送计算得到的答案。
于 2013-05-18T12:22:45.063 回答