You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

4GB内存服务器下Laravel Horizon批量发6万+邮件的最优配置

4GB内存服务器上Laravel Horizon批量发送6万+邮件的最优配置方案

你的Redis崩溃核心原因是进程数设置过高:4GB内存下,500个Horizon Worker进程(含Redis连接、邮件客户端实例)的内存占用远超服务器上限,直接导致系统内存耗尽、Redis被OOM(内存不足)杀死。以下是兼顾稳定性与发送效率的优化方案:


一、Horizon核心配置调整

将原配置拆分并降低进程数,避免资源过载:

'supervisor-email' => [
    'connection' => 'redis',
    'queue' => ['bulkEmail'], // 拆分批量邮件与定时任务队列,避免互相挤占资源
    'balance' => 'simple', // 替代auto策略,减少进程频繁波动带来的资源消耗
    'processes' => 30, // 初始进程数,4GB内存下的安全起步值
    'tries' => 3,
    'minProcesses' => 5,
    'maxProcesses' => 35, // 最大进程数不超过35,预留内存给Redis与系统
    'balanceMaxShift' => 2, // 每次进程调整不超过2个,降低资源波动
    'balanceCooldown' => 10, // 延长冷却时间至10秒,避免频繁增减进程
    'timeout' => 60, // 邮件发送超时设置为60秒,防止进程挂起
    'memory' => 96, // 单个进程内存限制96MB,超出自动重启
],
// 单独给定时任务配置Supervisor,保障其不受批量邮件影响
'supervisor-cron' => [
    'connection' => 'redis',
    'queue' => ['fastCron'],
    'processes' => 2,
    'tries' => 3,
    'minProcesses' => 1,
    'maxProcesses' => 5,
],

参数说明:

  • 进程数控制:30-35个Worker进程总内存占用约3GB,预留1GB给Redis、系统进程及缓存,避免内存溢出。
  • 内存限制:memory => 96 防止单个进程因内存泄漏耗尽资源,超出限制后Horizon会自动重启进程。
  • 队列拆分:将批量邮件与定时任务隔离,避免批量任务阻塞定时任务执行。
  • 平衡策略:simple 策略会根据队列长度逐步扩容至最大进程数,比auto更稳定,适合资源有限的服务器。

二、Redis配置优化

调整Redis配置,避免因内存不足或连接过载崩溃:
修改redis.conf关键参数:

maxmemory 768mb # 限制Redis最大内存占用,预留足够空间存储队列任务
maxmemory-policy noeviction # 禁止淘汰键,避免队列任务丢失
tcp-keepalive 300 # 清理闲置连接,减少无效资源占用
save "" # 关闭RDB持久化,降低IO开销(若无需任务持久化可开启)
appendonly no # 关闭AOF持久化,提升Redis性能

三、邮件发送效率优化

通过优化邮件发送逻辑,提升单个Worker的处理速度:

  1. 复用SMTP连接:在.env中开启连接复用,避免每个任务新建SMTP连接:
MAIL_DRIVER=smtp
MAIL_HOST=你的SMTP服务器地址
MAIL_PORT=587
MAIL_USERNAME=你的SMTP账号
MAIL_PASSWORD=你的SMTP密码
MAIL_ENCRYPTION=tls
MAIL_KEEP_ALIVE=true # 开启SMTP连接复用
  1. 批量打包任务:将多个邮件打包为一个队列任务(例如每次处理50封),减少Redis任务数量与进程切换开销。
  2. 使用Mail::pool():Laravel的邮件池功能会自动复用SMTP连接,提升批量发送效率。

四、系统资源调优

  1. 设置Redis OOM优先级:避免系统内存不足时优先杀死Redis:
echo -17 > /proc/$(pidof redis-server)/oom_adj
  1. 提升文件描述符限制:避免Redis与Horizon因文件描述符不足报错:
# 临时生效
ulimit -n 65535
# 永久生效,编辑/etc/security/limits.conf
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
  1. 实时监控资源:用htop或top实时查看内存、CPU占用,若内存占用超过80%则减少进程数,若CPU占用低于50%可适当增加进程数。

五、验证与测试

  1. 先测试小批量任务(例如1000封),观察Redis、内存及CPU状态,微调进程数至最优值。
  2. 通过Horizon Web面板监控队列长度、进程状态与任务执行时间,及时发现异常。

按此配置,35个Worker进程每分钟可处理200-250封邮件,4小时内可完成6万+邮件发送,同时避免Redis崩溃。

内容的提问来源于stack exchange,提问作者code_anic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:35:22