【问题标题】:Is it worth using Perl CGI::Fast on Apache 2?在 Apache 2 上使用 Perl CGI::Fast 是否值得?
【发布时间】:2012-01-19 13:58:38
【问题描述】:

我知道这听起来像是向ServerFault 提出的问题,但我知道当服务器陷入困境时开发人员经常会受到指责,因此我认为此处的帖子可能对仍在网络上使用Perl 的人有用。

故事:

我们的旧 Apache 服务器上的已失效进程存在严重问题,因此我们决定迁移到 Apache 2。不可否认,新服务器的性能要好得多。然而,测试表明,在重负载(每分钟约 100 个用户)下,失效的进程开始在服务器上快速启动,并且使用 SSH 很明显这些进程正在使用 CPU。为了克服这些问题,我们决定实现CGI::Fast,它是Perl 中FastCGI 的一种类型。有了这个,僵尸就消失了,但是服务器的性能并没有更好。

结果让我认为,如果 Apache 2 无论如何都能有效地回收资源,那么实现 CGI::Fast 真的没有意义。

你们有没有得出不同的结论?

【问题讨论】:

  • 你在说什么还是。在 Perl 中创建了许多 NEW 网站。以The Lacuna Expanse 为例。
  • 我是说 Perl 不像 10-15 年前那样广泛使用,这是事实。今天从学校出来的新一代程序员甚至都不知道 Perl 的存在。现在有更流行的语言,例如 Ruby 和 .NET。我并不是说 Perl 是“坏的”,它只是过时了……仅此而已。 :)

标签: perl apache fastcgi


【解决方案1】:

在我看来,除了您提到的任何其他细节之外,在 2011 年,除了基于 PSGI/Plack 的解决方案之外,没有任何价值。

【讨论】:

  • 谢谢达西姆!这真的很有趣,我一定会试一试。
【解决方案2】:

FastCGI 比普通 CGI 更快,因为 Apache 不必为每个新请求加载 perl。但是,需要重新编写脚本以消除对每个请求执行一次的假设。 FastCGI 脚本的核心通常代表某种类型的事件循环,在请求进入时对其进行处理。

您可以将 CGI::Fast 用于纯 CGI 脚本,而无需围绕事件循环重新编写脚本,但是这样会丢失 FastCGI 的“Fast”部分,因为 perl 仍然需要为每个脚本运行一次。

如果您的 CGI 脚本的最大部分是加载 perl 或执行一次性代码,FastCGI 也只会提供很大的好处。对于许多 Web 应用程序来说,这是真的。但是,如果您的脚本需要为每个请求执行大量工作,从而加载 perl 的开销很小,那么使用 FastCGI 将不会看到很大的性能优势。

【讨论】:

  • 在我们的例子中,测试场景很简单;使用 CGI::Fast,我们在循环外建立了与 MySQL 的连接,而在循环内,我们处理查询返回的值,并将其与执行相同但没有 CGI::Fast 循环的普通 CGI 脚本进行比较。我们的测试表明,CGI::Fast 循环通过保持持久性并为通过同一连接工作的各个请求提供服务,确实为我们提供了优势。正如您所说,问题在于“使用值”部分在某些情况下往往很大......我想我们将不得不重新考虑这些脚本的工作方式:)
  • 很抱歉听到这个消息。祝你好运找到代码中的真正瓶颈。
【解决方案3】:

CGI

除了小型网站之外,这对于其他任何东西来说都太低效了。 CGI 为每个传入请求生成一个新进程以执行脚本,这是一种资源密集且效率低下的处理方式。难怪随着 Web 应用程序变得越来越复杂,它随着时间的推移逐渐消失。

FastCGI 的引入是为了避免在 Apache 进程中运行语言的一些问题,以及避免 CGI 的低效率。

FastCGI 应用程序在 Web 服务器(Apache 或其他方式)之外执行,并使用套接字等待来自 Web 服务器的请求。 Web 服务器和 FastCGI 应用程序甚至可以位于不同的物理机器上并通过网络进行通信。

因为 Web 服务器和应用程序进程是分开的,所以可以更好地隔离。

【讨论】:

  • 在这种情况下,我的问题实际上是关于 CGI::Fast 的,它是 CGI 的扩展。 CGI::Fast 是持久的,因此它不应该为每个请求生成一个新进程。我们的服务器上没有 FastCGI 支持,所以目前不支持。
猜你喜欢
  • 2011-05-26
  • 2013-05-02
  • 1970-01-01
  • 2012-07-05
  • 2013-10-26
  • 2015-05-22
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多