Re: после yum update остались активны два мастер-процесса nginx

Gena Makhomed gmm на csdoc.com
Чт Мар 30 20:35:26 UTC 2017


On 30.03.2017 22:07, Konstantin Pavlov wrote:

>>> Сколько по времени занимает проверка конфигурационного файла (nginx -t)?
>>
>> Около секунды, но иногда - проверка конфига занимает 6 или 11 секунд.
>> Наверное сказывается нагрузка на диски другими контейнерами сервера.
>>
>> А насколько я понял исходники nginx - он создает pid-файл
>> только после успешного чтения конфигурационного файла. (!)
>>
>> Причина глюка видимо в том, что за секунду ни разу не выполнилось
>> условие if [ -f ${oldbinpidfile} -a -f ${pidfile} ], потому что
>> нового ${pidfile} просто еще не было на тот момент на диске.
>
> Да, именно поэтому я и спросил про время.
>
>> Может быть имеет смысл сделать UPGRADEWAITLOOPS побольше, так чтобы
>> максимальное время ожидания было не 1 секунда, а 30 секунд например?
>>
>> Это будет очень актуально для конфигураций с большим количеством
>> включаемых файлов на серверах с нагруженной дисковой подсистемой.
>>
>> А так как сейчас есть - получается race condition.
>> Собственно именно это и наблюдалось в моем случае.
>
> Мы посчитали, что секунды по-умолчанию должно быть достаточно для всех =)
>

Как мне кажется, задержка в 1 секунду пошла из Makefile,
который генерируется командой ./configure из состава nginx:

upgrade:
         /usr/local/nginx/sbin/nginx -t

         kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
         sleep 1
         test -f /usr/local/nginx/logs/nginx.pid.oldbin

         kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

Но тут никто не ждет появления pid-файла от нового мастера,
одна секунда дается старому мастеру на то чтобы получить
сигнал, переименовать nginx.pid в nginx.pid.oldbin
и запустить новый мастер (без лимита времени на старт)

В скрипте /usr/libexec/initscripts/legacy-actions/nginx/upgrade
логика теперь уже совсем другая, там ожидается что за 1 секунду
новый мастер успеет прочитать конфиг и записать свой pid-файл.

Когда включается много мелких конфигурационных файлов в основной конфиг
и когда дисковая подсистема сервера загружена - легко может получиться
и 11 секунд и даже больше.

Можно ли увеличить значение по-умолчанию переменной UPGRADEWAITLOOPS
до UPGRADEWAITLOOPS=450 ?

Это вполне безопасно и не будет приводить к каким-либо проблемам.

В том же systemd значением по-умолчанию для TimeoutStartSec=
и TimeoutStopSec= является 90 секунд и это не вызывает никаких проблем.

Тут у нас, по сути, счетчик UPGRADEWAITLOOPS играет роль TimeoutStartSec

> В инит-скрипте для 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 исправим, чтобы тоже можно было переопределить аналогичным образом.

Только сделайте, пожалуйста, значение по-умолчанию UPGRADEWAITLOOPS=450

И тогда очень мало кому понадобится менять новое дефолтовое значение 
UPGRADEWAITLOOPS=450 на какое-то другое, 99.999999% пользователей
вполне устроит то, как будет работать новый service nginx upgrade

-- 
Best regards,
  Gena



Подробная информация о списке рассылки nginx-ru