在具有良好 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真的是一个性能消耗者吗?感谢您的任何提示!