【问题标题】:Apache Server Slots, Memory, KeepAlive, PHP and SSL - how to speed upApache 服务器插槽、内存、KeepAlive、PHP 和 SSL - 如何加速
【发布时间】: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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回复! WebPageTest 在 1.5 秒内完成。 (3 个文件),实际上 SSL 握手只需要 0.4 秒 - 与“第一个字节的时间”处理时间大致相同。这比将连接保持几秒钟“浪费”的时间要少得多……很高兴知道!我已经使用(并且喜欢)APC - 所以,我似乎应该让自己习惯 PHP-FPM 和 MPM-Worker。谢谢:)
    • PS:你不知道,为什么有些用户“..reading..”这么久(如果不是SSL握手)?如果我正确理解了这个状态,那么此时 PHP 处理甚至还没有开始?!
    • 这取决于您的代码的工作方式。重要的是“第一个字节的时间”。如果您的 PHP 代码立即发送数据,但下载需要时间,则 PHP 代码很慢。如果连接在“第一个字节的时间”和下载结束之间没有花费太多时间,那么要么 PHP 很慢,要么并发用户太多(有些必须等待轮到他们)。检查您的服务器日志,同时为多少用户提供服务。
    猜你喜欢
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 2022-01-08
    • 2015-08-10
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多