【问题标题】:Scaling a simple Perl CGI to a high volume server将简单的 Perl CGI 扩展到大容量服务器
【发布时间】:2010-08-24 20:52:35
【问题描述】:

我编写了一个 Perl 程序来搜索和操作一个文本文件。这个 CGI 进程将文件直接吞入内存,根据用户的输入操作文件,然后生成 HTML 结果。

它的工作原理是明智的。但是,我知道,一旦我在大容量服务器上部署,它将无法及时响应。我怀疑内存是一个瓶颈。共享该文件的最佳方法是什么,以便在服务器启动后将其读入内存一次,然后再也不读?

我猜的解决方案是一个服务器守护进程,它将文件加载到内存中并为其他进程/线程提供它们的数据。如果是这样,实施 IPC 的最佳方法是什么?

【问题讨论】:

  • 你真的需要文件一次出现在内存中吗?我知道这使编程更容易,但如果你可以通过一次一行/一个块的流式传输来完成你需要做的事情,那么你所有的内存问题都会消失,操作系统的磁盘缓存机制会做得很好。跨度>
  • 这个文件有多大?如果它很小,让磁盘缓存来处理它。搜索有多复杂?您可能希望 SQLite 或 NoSQL 数据存储之类的东西都以有组织的方式保存数据,进行搜索并缓存它们。搜索平面文件无法扩展。

标签: perl cgi ipc


【解决方案1】:

使用FastCGI。它有效地将您的 CGI 程序变成了您的 Web 服务器调用的小型服务器。它很简单,适用于许多不同的 Web 服务器。因为您的 CGI 在其自己的进程中运行,它可以在与您的 Web 服务器不同的机器上运行,并且您可以跨多个应用程序服务器扩展您的程序。它适用于大多数主要的编程语言。

mod_perl 的优势在于它可以让您使用 Perl 深入了解 Apache。如果您不使用它,那就大材小用了。 mod_perl 有很多缺点。它将您与 Apache 联系起来,并且任何版本的 Perl 都被编译到 mod_perl 中。它将所有 Perl 应用程序的配置和内存空间与 Apache 混合在一起,这使配置复杂化并导致内存膨胀。而且mod_perl真的很复杂很难升级。

【讨论】:

  • 此外,mod_perl 可能存在相当“有趣”的数据持久性错误。
  • 这可能是一个实施解决方案,但我们还没有到那个阶段。无论使用什么 CGI 模块等。在编码方面,编写代码以一遍又一遍地读取同一个文件的最佳实践是什么?我正在寻找类似共享内存、mmap、IPC 的东西——使用套接字等。
  • @Face 您可以编写一个服务器来将文件保存在内存中并将其交给其他进程,但如果仅此而已,您实际上就是在复制操作系统的磁盘缓存。很糟糕。最佳做法是不要通过保持进程持久性来一遍又一遍地读取文件。这也节省了重新编译代码和每次命中重做初始化的成本。这就是 FastCGI 给你的。如果您想将一些计算的数据持久保存在内存中以便其他进程可以共享它,请尝试使用 memcached 之类的方法。如果数据复杂,请查看 NoSQL。
  • @Face 可能还不清楚,FastCGI 不仅仅是另一个 CGI 模块,如 CGI.pm vs CGI::Application。它改变了 Web 服务器加载和与 CGI 程序交互的方式。 FastCGI 不是每次点击都编译和运行然后丢弃你的进程,而是将你的 CGI 程序变成一个小服务器,你的 web 服务器与之通信。您的 CGI 进程在命中之间保持持久,避免重新编译和初始化,并允许它缓存数据。这是扩展 CGI 程序必须做的第一件事,它开启了其他扩展技术。
  • @Schwern,假设代码如下:##### open (FH, ' ; sub file_subsection { # 对 $Array 进行一些处理并返回所需的 subsection } sub file_query { # 进行一些搜索,计算出现次数,或者对 $Array 进行查询并返回结果 } sub gen_HTML { # 生成 HTML 响应输出 } close(FH ); #####文件是否只打开一次并复制到内存中一次?如果是这样,FastCGI 是如何知道要持久化什么以及使什么变得易变的?
【解决方案2】:

这就是 mod_perl 创建的原因。

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多