我曾见过 EXIM 在被来自用户/脚本的数千封电子邮件加载时导致系统崩溃。我想知道是否有办法限制它在系统上的使用并保护系统或服务免受滥用。
答案1
Exim 可以采取一些措施来减轻负载。
- 检测高负载并让 exim 将脚本生成的大量传入消息放入队列,而不是尝试传递它们。以下选项与此相关:
queue_only_load 如果负载高则不立即交付 queue_only_load_latch 不会重新评估每条消息的负载 queue_only_override 允许命令行覆盖
- 您可能习惯使用 grepping 或 exigrep 从 /var/log/exim/main.log 文件(或您的发行版的任何名称)中提取信息。默认情况下,Exim 还会维护此日志的每条消息副本,将每条消息的邮件日志分组到一个文件中,并在消息发送后将其删除。您可以使用“exim -Mvl QUEUEID”查看单条消息的这些内容。或者直接关闭它:
在负载很重的系统上,可能需要禁用每条消息的日志,以减少磁盘 I/O。这可以通过将 message_logs 选项设置为 false 来实现。
- 测试使用 syslog 记录到远程服务器而不是本地服务器。这将稍微减少磁盘 I/O,但我认为与大量创建电子邮件等造成的 I/O 相比,这微不足道。
- 当您将电子邮件注入邮件服务器后,负载将下降。此时,启动一堆队列运行器。众所周知,Exim 从队列中传递消息的速度很慢,但如果负载较低,启动足够的传递进程来运行队列并更快地传递邮件是没有问题的……直到负载变得过高(通常表示磁盘 I/O 利用率已达到饱和状态)。尝试一次创建 10 个队列运行器。我猜您可能可以创建 100 或 150 个而不会出现过大的负载。'iostat -x -d 1' 是您的好帮手,可确保磁盘 I/O 是否是瓶颈。
- 验证您的出站邮件服务器的正向和反向 DNS。验证收件人服务器看到的 IP 是否与您认为的一样,并且该 IP 也必须可正向和反向解析,否则,当收件人对您的 IP 进行 DNS 查找(用于他们的日志等)时,您的速度会变慢。
答案2
我建议您检查工具“nice”和“ionice”,一个用于减少高要求进程对 CPU 使用率的影响,另一个用于减少对 IO 任务的影响。(如果您不想使用 ionice 进行磁盘吞吐量限制,则需要使用 CFQ 调度程序)
或者,您可以检查内核 cgroups 子系统。Cgroups 支持创建硬内存和软内存限制以及限制磁盘使用量。(需要使用 CFQ 调度程序来限制磁盘使用量)
答案3
你也许可以用PAM 限制( /etc/security/limits.conf
) 或 ulimit。