php - Apache 服务器插槽、内存、KeepAlive、PHP 和 SSL - 如何加速

标签 php linux performance apache ssl

在具有良好 CPU、6 GB RAM 和快速主干互联网连接的 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 分钟,取决于用户)。

最近,此应用程序面临用户请求的大 Storm (计划中,没有 DoS,大约 2.500 个并发用户)。虽然 CPU 运行良好(<50% 使用率),但我的服务器很快就用完了插槽。关键是 - 在预 fork 模式下 - 每个插槽都需要内存,而 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 个请求——这看起来很荒谬!我无法相信这实际上是 Apache、PHP 和 SSL 可以执行的操作。

我的想法是否存在重大缺陷?我是否遇到了 prefork 模式的基本限制?我忽略了显而易见的事情吗? SSL 实际上是一种性能消耗者吗?感谢您的任何提示!

最佳答案

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

我的猜测是,PHP 应用程序在有大量并发用户的情况下处理速度较慢,这会使一些用户等待更长时间。

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

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

关于php - Apache 服务器插槽、内存、KeepAlive、PHP 和 SSL - 如何加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16624012/

相关文章:

php - 在亚马逊EC2上运行websocket服务器

php - open_basedir 限制生效 Unknown on line 0?

linux - 如何使用 nc 作为扩展回显服务器?

PHP文件上传在centos服务器中不起作用

javascript - 将 jQuery 数据附加为字符串时在 div 上设置它

c# - FirstOrDefault/First 和 OrderByDescending 是否比 LastOrDefault/Last 和 OrderBy 更快?

php - Laravel 中间件在路由中不起作用

javascript - 更改单选按钮和复选框的默认行为

linux - 为什么git创建权限错误的文件?

python - 如何根据索引访问队列元素