Увеличение времени ожидания для Postfix/Cyrus "Превышено ограничение времени выполнения команд"?

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

Вот постконф -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}

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

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

1 ответ

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

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

Чтобы увидеть ваш текущий статус 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 еще раз, чтобы увидеть, изменились ли значения.

Другие вопросы по тегам