Назад | Перейти на главную страницу

Увеличить таймаут для Postfix / Cyrus «Превышен лимит времени команды»?

У меня есть старый OS X Server 10.4.x с Postfix 2.1.5, который настроен на использование cyrus в качестве транспорта почтовых ящиков.

Вот postconf -n:

# postconf -n
alias_maps = hash:/etc/aliases,hash:/var/mailman/data/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
content_filter = smtp-amavis:[127.0.0.1]:10024
daemon_directory = /usr/libexec/postfix
debug_peer_level = 2
enable_server_options = yes
html_directory = no
inet_interfaces = all
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
luser_relay = 
mail_owner = postfix
mailbox_size_limit = 0
mailbox_transport = cyrus
mailq_path = /usr/bin/mailq
manpage_directory = /usr/share/man
maps_rbl_domains = 
message_size_limit = 15728640
mydestination = $myhostname,localhost.$mydomain,livingnow.com.au,localhost
mydomain = livingnow.com.au
mydomain_fallback = localhost
myhostname = server.livingnow.com.au
mynetworks = 127.0.0.1/32,192.168.16.0/24
mynetworks_style = host
newaliases_path = /usr/bin/newaliases
owner_request_special = no
queue_directory = /private/var/spool/postfix
readme_directory = /usr/share/doc/postfix
recipient_delimiter = +
sample_directory = /usr/share/doc/postfix/examples
sendmail_path = /usr/sbin/sendmail
setgid_group = postdrop
smtpd_client_restrictions = permit_mynetworks  reject_rbl_client sbl-xbl.spamhaus.org reject_rbl_client bl.spamcop.net permit
smtpd_pw_server_security_options = cram-md5,login,plain
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination,permit
smtpd_sasl_auth_enable = yes
smtpd_tls_key_file = 
smtpd_use_pw_server = yes
unknown_local_recipient_reject_code = 550

Время от времени ему нужен кикстарт (в ближайшее время он заменит весь сервер), но когда у него возникают проблемы, уведомления о недоставке отправляются с:

Final-Recipient: rfc822; user@host.com
Action: failed
Status: 5.0.0
Diagnostic-Code: X-Postfix; Command time limit exceeded:
   "/usr/bin/cyrus/bin/deliver"

В master.cf эта команда указана как:

# Also specify in main.cf: cyrus_destination_recipient_limit=1
cyrus     unix  -       n       n       -       10      pipe
  user=cyrusimap argv=/usr/bin/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}

Обычно мы обнаруживаем проблему и перезапускаем службы, которые ее решают, но нам потребовался час или два, чтобы обнаружить ее сегодня, и многие отправители получили это уведомление, что далеко не идеально.

Есть ли способ увеличить лимит времени команд?

Этот ответ почти не соответствует теме, но может помочь вам на самом деле исправить ваш Cyrus, если он достаточно древний (v2.1.x или старше) или использует бэкэнд BerkeleyDB вместо Skiplist, который был представлен позже.

Проблема со старым Cyrus IMAPd заключалась в том, что его BerkeleyDB по умолчанию использовал настройки BDB по умолчанию. Значения по умолчанию безумно малы; 256 килобайты кеш-памяти и так далее. Это очень быстро приводит к тупиковой ситуации в BerkeleyDB, если Сайрусу нужно доставить много почты.

Чтобы увидеть ваш текущий статус Cyrus BerkeleyDB:

cd /path/to/your/cyrus/datadir (the dir with mailboxes.db and so on)
db_stat -m *.db

(The db_statкоманда вполне может быть в форме db_XYstat, где XY означает версию BerkeleyDB)

Если это показывает вам очень низкие значения размеров кеша, продолжайте и увеличивайте их по желанию.

Во-первых, остановите Cyrus и сделайте резервную копию этого каталога данных на всякий случай.

Затем в каталоге данных создайте файл с именем «DB_CONFIG» и сделайте так, чтобы он содержал хотя бы эту строку.

set_cachesize    0   16777216  0

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

Убедитесь, что файл DB_CONFIG принадлежит той же учетной записи, что и Cyrus.

Чтобы активировать изменения кеша, запустите команду со страшным названием db_recover (также может быть в форме dbXY_recover. Убедитесь, что вы запускаете команду как пользователь Cyrus, а не, например, root.

Перезагрузите Cyrus, посмотрите, работает ли, запустите db_stat -m *.db еще раз, чтобы увидеть, изменились ли значения.