【问题标题】:Using shared memory in mod_perl environment在 mod_perl 环境中使用共享内存
【发布时间】:2014-12-02 05:53:43
【问题描述】:

我有一个要求

  1. 我必须在内存中放置一个数据结构(Perl 哈希),以便每个 HTTP 进程(运行 Perl 脚本)都将使用该哈希。

  2. 哈希结构约为 300 MB。

  3. 环境是mod_perl

我想创建一个在 Apache 启动时加载的模块,该模块在共享区域中创建一个哈希并返回对它的引用。

您能否对这种行为发表评论,或提出替代解决方案。另外请指出一些好的资源来检查示例。

【问题讨论】:

  • 您的问题过于宽泛,尽管您可能会得到有用的答案。您现在知道 Stack Overflow 是关于回答特定编程问题的。
  • Ogata Tetsuji 下面的回答似乎是解决问题的巧妙方法,但实际上,我不得不退后一步重新考虑这个问题。这是一个通过将大型数据结构存储在 Perl 进程之外更常见的问题来解决,例如使用数据库或某种文件结构。即使您使用传统的 SQL 数据库,数据也会很快被移动到 OS 磁盘缓存中,并且查询时间变得非常快。您还可以查看内存中的数据存储,例如 Memcached,它可以提供具有竞争力的响应时间。

标签: perl shared-memory mod-perl


【解决方案1】:

如果你在 mod_perl 内存中放置大量哈希数据, 然后 mod_perl 父进程在服务器启动阶段读取它。

首先,您在@INC 目录上创建Your/HugeData.pm

package Your::HugeData;

our %dictionary = (
    ....
);

接下来,apache 进程在启动时读取这个。

# In apache.conf (or anywhere apache config file)
PerlModule Your::HugeData

那么你的脚本可以使用%Your::HugeData::dictionary作为包变量。

# In mod_perl handler script or ModPerl::Registry (CGI emulate) script.
use Your::HugeData;
...
my $tokyo = $Your::HugeData::dictionary{tokyo};

当您在 Linux Apache 上使用 prefork MPM 时,操作系统更喜欢“写时复制”机制。 因此,如果您只读取数据,则分叉的子进程会看到父进程的数据。 也就是说,内存使用可能不会浪费。

【讨论】:

  • 小心在子进程中引用共享数据——这相当于在页面上“写入”。您可以在此处阅读具体示例:retout.co.uk/blog/2012/12/21
【解决方案2】:

我会考虑通过Storable store 将它发送到一个文件,retrieve 一开始。

如果需要更改,您需要使用flock 来仲裁 IO,并可能使用某种机制来检查它上次更改的时间(例如检查 mtime)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-23
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多