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