【发布时间】:2013-05-13 12:07:49
【问题描述】:
在具有良好 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 运行良好(
问题 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真的是一个性能消耗者吗?感谢您的任何提示!
【问题讨论】:
标签: php linux performance apache ssl