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的处理速度:
- 复用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连接复用
- 批量打包任务:将多个邮件打包为一个队列任务(例如每次处理50封),减少Redis任务数量与进程切换开销。
- 使用
Mail::pool():Laravel的邮件池功能会自动复用SMTP连接,提升批量发送效率。
四、系统资源调优
- 设置Redis OOM优先级:避免系统内存不足时优先杀死Redis:
echo -17 > /proc/$(pidof redis-server)/oom_adj
- 提升文件描述符限制:避免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
- 实时监控资源:用
htop或top实时查看内存、CPU占用,若内存占用超过80%则减少进程数,若CPU占用低于50%可适当增加进程数。
五、验证与测试
- 先测试小批量任务(例如1000封),观察Redis、内存及CPU状态,微调进程数至最优值。
- 通过Horizon Web面板监控队列长度、进程状态与任务执行时间,及时发现异常。
按此配置,35个Worker进程每分钟可处理200-250封邮件,4小时内可完成6万+邮件发送,同时避免Redis崩溃。
内容的提问来源于stack exchange,提问作者code_anic
相关产品推荐
相关产品推荐

