我在 1and1 上有一个类似这样的 VPS配置(512MB,最高可达 2GB)。我运行一个网络服务,在其中抓取网络数据,当某个在线数据反馈发生变化时,通过电子邮件和短信通知我的用户。
当我发送电子邮件时,我只需让 PHP 循环遍历收件人列表并使用 mail() 函数发送电子邮件即可。每当我尝试发送大量此类消息时,我的服务器就会开始出现异常。有时我甚至无法运行“ls”,因为 shell 告诉我“无法分配内存”。shell 无法使用,但我的网站却运行正常。
Mail.err 包含:
Nov 14 17:30:09 s15351477 postfix/smtp[26000]: fatal: inet_addr_local[getifaddrs]: getifaddrs: Cannot allocate memory
Nov 14 17:30:09 s15351477 postfix/sendmail[25999]: fatal: username(1000): unable to execute /usr/sbin/postdrop -r: Success
Nov 14 18:29:14 s15351477 postfix/smtp[9911]: fatal: inet_addr_local[getifaddrs]: getifaddrs: Cannot allocate memory
Nov 14 18:29:14 s15351477 postfix/sendmail[9910]: fatal: username(1000): unable to execute /usr/sbin/postdrop -r: Success
另外,如果相关的话,我的会计人员是:
Version: 2.5
uid resource held maxheld barrier limit failcnt
53907331: kmemsize 20779422 21041560 31457280 34603008 2989403
lockedpages 0 0 512 512 0
privvmpages 81488 82498 524288 576716 94640
shmpages 2831 2831 32768 32768 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numproc 90 91 128 128 6603
physpages 32692 33531 2147483647 2147483647 0
vmguarpages 0 0 131072 2147483647 0
oomguarpages 32942 33781 9223372036854775807 2147483647 0
numtcpsock 22 23 720 720 0
numflock 27 28 376 413 0
numpty 1 1 32 32 0
numsiginfo 0 1 512 512 0
tcpsndbuf 425888 441064 3440640 5406720 0
tcprcvbuf 369200 376832 3440640 5406720 0
othersockbuf 268000 268464 2252160 4194304 0
dgramrcvbuf 0 8472 524288 576716 0
numothersock 180 182 720 720 0
dcachesize 952146 966231 5242880 5767168 0
numfile 3609 3683 8192 8192 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
numiptent 25 25 200 205 0
有什么方法可以限制 Postfix 以防止它像这样淹没系统?还想知道:为什么电子邮件会占用这么多资源,这些电子邮件只是短文本?
答案1
Postfix 不使用您的内存;即使在负载系统(每天 >100k)下,它也仅消耗大约 100MB RSS,并且电子邮件会不断传送到外部进程。
理论上最耗内存的肯定是 PHP;除非你使用现代方式来使用它,否则它会很快消耗掉你所有的内存。
大多数 PHP 代码也会泄露一些严重的东西。
答案2
减少main.cf中每个服务的默认最大并发进程数:
default_process_limit = 10