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 mailing list
[email protected]
http://mailman.nginx.org/mailman/listinfo/nginx-ru