MTA PostFix и использование оперативной памяти

MTA PostFix и использование оперативной памяти MTA PostFix может быть серьезной угрозой утечки оперативной памяти если на сайте происходит большая почтовая активность и эта активность может быть вполне легальна, а не аномальна - например отправка подписавшимся в теме сообщений о новых постах, комментариях и т.д..

Анализ некоего сервера показал, что в пики активности пользователей на сайте идет очень активная отправка почты (демон ака postfix) демоном PostFix который пожирает +- 20% оперативной памяти:

top - 19:47:39 up 3 days, 14:43,  2 users,  load average: 0.65, 0.40, 0.57
Tasks: 129 total,   2 running, 127 sleeping,   0 stopped,   0 zombie
Cpu(s): 34.9%us, 37.2%sy,  0.0%ni, 18.5%id,  9.1%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:    502360k total,   440868k used,    61492k free,    26240k buffers
Swap:  2138104k total,    40700k used,  2097404k free,    85792k cached
 
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
15094 jj        20   0  265m  61m 8856 S  0.0 12.5   1:17.05 php-cgi
13805 jj        20   0  264m  60m 8856 S  0.0 12.4   1:46.12 php-cgi
17549 jj        20   0  262m  60m 8720 S 19.9 12.3   0:44.12 php-cgi
18178 jj        20   0  260m  58m 8696 S 21.9 11.8   0:39.35 php-cgi
 2131 root      20   0  297m 9.8m 8088 S  0.0  2.0   0:45.34 httpd
 2024 mysql     20   0  606m 9856 3112 S  2.0  2.0  16:26.89 mysqld
19336 apache    20   0  297m 4232 1760 S  0.0  0.8   0:00.09 httpd
19208 apache    20   0  297m 4204 1776 S  0.3  0.8   0:00.28 httpd
18978 postfix   20   0 79568 3768 2848 S  0.0  0.8   0:00.02 smtp
19006 postfix   20   0 79568 3768 2852 S  0.0  0.8   0:00.01 smtp
18963 postfix   20   0 79568 3764 2848 S  0.0  0.7   0:00.02 smtp
18981 postfix   20   0 79568 3764 2848 S  0.0  0.7   0:00.01 smtp
18986 postfix   20   0 79568 3764 2848 S  0.0  0.7   0:00.02 smtp
19001 postfix   20   0 79568 3764 2844 S  0.0  0.7   0:00.01 smtp
19018 postfix   20   0 79568 3764 2848 S  0.0  0.7   0:00.02 smtp
18970 postfix   20   0 79568 3760 2848 S  0.0  0.7   0:00.01 smtp
18974 postfix   20   0 79568 3760 2848 S  0.0  0.7   0:00.01 smtp
18989 postfix   20   0 79568 3760 2848 S  0.3  0.7   0:00.02 smtp
18994 postfix   20   0 79568 3760 2848 S  0.0  0.7   0:00.01 smtp
18997 postfix   20   0 79568 3760 2848 S  0.0  0.7   0:00.02 smtp
19064 postfix   20   0 79568 3756 2836 S  0.0  0.7   0:00.02 smtp
19014 postfix   20   0 79568 3752 2844 S  0.0  0.7   0:00.01 smtp
19160 postfix   20   0 79568 3752 2836 S  0.0  0.7   0:00.01 smtp
18966 postfix   20   0 79568 3748 2836 S  0.0  0.7   0:00.02 smtp
19031 postfix   20   0 79568 3748 2844 S  0.0  0.7   0:00.02 smtp
19430 postfix   20   0 79568 3740 2832 S  0.0  0.7   0:00.00 smtp
19163 postfix   20   0 79568 3736 2832 S  0.0  0.7   0:00.01 smtp
19428 postfix   20   0 79568 3736 2844 S  0.0  0.7   0:00.00 smtp
19391 postfix   20   0 79640 3696 2744 S  0.7  0.7   0:00.02 cleanup
11316 postfix   20   0 79440 3548 2612 S  0.0  0.7   0:00.20 scache
19381 postfix   20   0 79364 3476 2620 S  0.3  0.7   0:00.01 pickup
19353 postfix   20   0 79372 3448 2596 S  0.0  0.7   0:00.00 trivial-rewrite
....

В приведённом выше примере PostFix откусил на свои нужды оперативной памяти почти 20% (0.7*24=16.8%), а при ещё большей почтовой активности сайта, PostFix отжирает ещё больше оперативки.

Как поубавить аппетиты MTA postfix и понизить число одновременной обработки отправляемых сообщений из очереди можно почитать на странице Postfix Performance Tuning, где упомянуто несколько параметров прямо влияющих на расход оперативной памяти (RAM) сервера:

  • default_process_limit - устанавливает максимальное число запускаемых дочерних процессов и является практически самым важным параметром влияющим на расход оперативной памяти (RAM) сервера. Рекомендуется значение 1 на каждые 100 МВ оперативной памяти (RAM), а т.е. если на нашем сервере общая доступная память равна 1 ГБ, то оптимальным значением будет 10.
  • default_destination_recipient_limit - устанавливает максимальное количество получателей для каждого сообщения пересылаемого lmtp(8), pipe(8), smtp(8)или virtual(8) агентом пересылки. Если пришло для пересылки сообщение адресованное количеству получателей, которое превышает установленный лимит, то оно будет разбито на несколько сообщений и потом отправлено. Можно оставить значение по умолчанию, его можно считать оптимальным - так например "Количество получателей одного сообщения (отправленного пользователем POP или IMAP по протоколу SMTP)" в почтовом сервисе gmail равно 99.
  • smtpd_recipient_limit - устанавливает лимит на принимаемые нашим SMTP сервером сообщения, значение 50 будет вполне оптимальным.

Таким образом оптимальными значениями для сервера с оперативкой в 512 МВ будут следующие:

vi /etc/postfix/main.cf
 
# http://www.postfix.org/postconf.5.html#default_process_limit
# The default maximal number of Postfix child processes that provide 
# a given service. This limit can be overruled for specific services 
# in the master.cf file.
# default: 100
default_process_limit=5
 
# http://www.postfix.org/postconf.5.html#default_destination_recipient_limit
# The default maximal number of recipients per message delivery. 
# This is the default limit for delivery via the lmtp(8), pipe(8), smtp(8) 
# and virtual(8) delivery agents.
# default: 50
default_destination_recipient_limit=50
 
# http://www.postfix.org/postconf.5.html#smtpd_recipient_limit
# The maximal number of recipients that the Postfix SMTP server 
# accepts per message delivery request.
# default: 1000
smtpd_recipient_limit=50
 
service postfix restart

Ссылки по теме:


Комментарии   

Арсений Яковлевич
0 #1 Арсений Яковлевич 28.05.2013 20:43
Да если сервант сильно нагруженный, то на PostFix можно и вовсе выделить только один единственный процесс - мол в очередь с.кины дети :-)
Цитировать

Добавить комментарий


Защитный код
Обновить

4 megabytes