Ton*_*yer 15 optimization memory spam spamassassin
我在 Debian 上使用 SpamAssassin(禁用 Pyzor、AWL 和 Bayes 并启用 sa-compile 的默认配置),并且每个 spamd 子进程在 32位服务器,在 64 位服务器上大约是这个(逻辑上足够)的两倍。通常有两个子进程,但在繁忙时间可能有五个(最多)正在运行。
ISTM 认为 200 到 600MB 是这项任务的大量内存。我想继续使用 SA 作为过滤结构的一部分,但越来越难以证明如此多的内存是合理的。
有没有办法减少每个子进程使用的内存量?(或者,让单个子进程如此之快,以至于我可以将最大子进程设置为 2 之类的东西?)。我愿意考虑任何选项,包括会或可能会导致准确性降低的选项。
我已经阅读了 SA wiki 上的“内存不足问题”页面;没有任何用处。不使用 SA 扫描大于 5 MB 的邮件。
我认为您误解了 Linux 报告内存使用情况的方式。当一个进程分叉时,它会导致第二个进程与原始进程共享大量资源。其中包括内存。但是,Linux 为此使用了一种称为写时复制 (COW) 的技术。这意味着每个分叉的子进程将在内存中看到与原始进程相同的数据,但是每当该数据发生更改(由子进程或父进程)时,更改都会被复制,然后才指向新位置。
在其中一个进程对该数据进行更改之前,它们共享同一个副本。结果,我可以有一个使用 100MB RAM 的进程,并将其 fork 10 次。这些分叉进程中的每一个都将显示 100MB 的 RAM 正在使用,但是如果您查看盒子上的总体内存使用情况,它可能只显示正在使用 130MB 的 RAM(进程之间共享 100MB,加上几 MB 的开销, 再加上十几 MB 或两个用于系统的其余部分)。
作为最后一个例子,我现在有一个运行着 30 个 apache 进程的盒子。每个进程都显示使用了 22MB 的 RAM。但是,当我运行free -m以显示我的整体 RAM 使用情况时,我得到:
topher@crucible:/tmp$ free -m
total used free shared buffers cached
Mem: 349 310 39 0 24 73
-/+ buffers/cache: 212 136
Swap: 511 51 460
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这个盒子甚至没有足够的 RAM 来运行 30 个进程,每个进程都使用 18MB 的“真实”RAM。除非你真的用完了 RAM 或者你的应用程序正在大量交换,否则我不会担心。
更新:此外,检查出这个工具叫SMEM,通过提到jldugger在回答关于Linux的内存使用另外一个问题在这里。