Re: после yum update остались активны два мастер-процесса nginx
Konstantin Pavlov
thresh на nginx.com
Чт Мар 30 19:07:57 UTC 2017
On 30/03/2017 19:59, Gena Makhomed wrote:
> On 30.03.2017 17:26, Konstantin Pavlov wrote:
>
>>> в файле /var/run/nginx.pid записано 26112
>>> в файле /var/run/nginx.pid.oldbin записано 603
>>>
>>> при обновлении nginx с версии 1.11.10 на версию 1.11.12
>>> через yum update он ругнулся, что во время обновления произошла
>>> ошибка и остались висеть оба мастер-процесса со своими воркерами.
>
>> Сообщения какие-нибудь остались в терминале?
>
> Только это: "Binary upgrade failed, please check nginx's error.log"
>
> Но судя по pid-файлам, "Starting new master nginx" получилось сделать,
> а операция "Graceful shutdown of old nginx" вообще не была выполнена.
>
>> Что либо есть в error log'ах в эпсилон-окрестности времени обновления?
>
> В /var/log/nginx/error.log пусто, проверка nginx -t проходит без ошибок.
>
>> Сколько по времени занимает проверка конфигурационного файла (nginx -t)?
>
> Около секунды, но иногда - проверка конфига занимает 6 или 11 секунд.
> Наверное сказывается нагрузка на диски другими контейнерами сервера.
>
> А насколько я понял исходники nginx - он создает pid-файл
> только после успешного чтения конфигурационного файла. (!)
>
> Причина глюка видимо в том, что за секунду ни разу не выполнилось
> условие if [ -f ${oldbinpidfile} -a -f ${pidfile} ], потому что
> нового ${pidfile} просто еще не было на тот момент на диске.
Да, именно поэтому я и спросил про время.
> Может быть имеет смысл сделать UPGRADEWAITLOOPS побольше, так чтобы
> максимальное время ожидания было не 1 секунда, а 30 секунд например?
>
> Это будет очень актуально для конфигураций с большим количеством
> включаемых файлов на серверах с нагруженной дисковой подсистемой.
>
> А так как сейчас есть - получается race condition.
> Собственно именно это и наблюдалось в моем случае.
Мы посчитали, что секунды по-умолчанию должно быть достаточно для всех =)
В инит-скрипте для centos/rhel 5-6 используется вот такое для переопределения администраторами:
30 sysconfig=`/bin/basename $initscript`
31
32 if [ -f /etc/sysconfig/$sysconfig ]; then
33 . /etc/sysconfig/$sysconfig
34 fi
...
42 UPGRADEWAITLOOPS=${UPGRADEWAITLOOPS-5}
43 CHECKSLEEP=${CHECKSLEEP-3}
Соответственно администратор может переназначить значения переменных так, как подходит для его системы.
Для systemd-based исправим, чтобы тоже можно было переопределить аналогичным образом.
Спасибо!
--
Konstantin Pavlov
Подробная информация о списке рассылки nginx-ru