В init-скрипте squid останавливается командой "stop_daemon --pidfile "$PIDFILE" --lockfile "$LOCKFILE" --expect-user squid -- $SQUID", из-за чего при повторном запуске он заново проверяет свой кэш. В процессе проверки squid не обслуживает запросы пользователей, а при достаточно большом объеме кэша проверка занимает значительное время (десятки минут). Вместо этого squid рекомендуется останавливать командой squid -k shutdown (в .service-файле для systemd, кстати, именно так и сделано) - при этом состояние кэша записывается на диск корректно и squid начинает работать без его проверки при старте.
В 3.2.13-alt2 вроде бы исправил. Когда дойдёт до репозитория посмотрите, пожалуйста, устраивает ли такое поведение (stop и restart)
squid-3.2.13-alt2 -> sisyphus: * Tue Jul 30 2013 Led <led@altlinux> 3.2.13-alt2 - squid.init: fixed stopping service (ALT#29236)
Спасибо, поведение сильно лучше, чем раньше. :) Есть пара мыслей по этому поводу: 1. Есть смысл ввести обработку SQUID_SHUTDOWN_TIMEOUT из /etc/sysconfig/squid. В текущем варианте, если процесс squid помирать откажется (по разным причинам - сбой диска, например), мы получим бесконечное ожидание при его завершении. Предлагаю ждать определенное время, настраиваемое в /etc/sysconfig/squid. 2. Возможно, есть смысл обработать cache_effective_user из /etc/squid/squid.conf аналогично pid-файлу, и использовать полученное значение, вместо жесткого задания в squid.
Created attachment 5906 [details] Патч на squid.init Вариант патча для squid.init, реализующий таймаут при остановке и обработку cache_effective_user
Переоткрою багу, так как думаю, что обработка таймаута при остановке squid все-таки нужна.
(В ответ на комментарий №4) > Created an attachment (id=5906) [details] > Патч на squid.init > > Вариант патча для squid.init, реализующий таймаут при остановке и обработку > cache_effective_user С SQUIDUSER - согласен. С SQUID_SHUTDOWN_TIMEOUT=60 - не очень. Таймаут задаётся в конфиге параметром shutdown_lifetime - его и нужно использовать (или дефолтные 30 секунд, если не задан), а не абстрактные 60 секунд. Плюс 5 секунд накидываем сверху "на всякий случай" (по тестам получается, что нужно сверх 1-3 секунды). См. http://git.altlinux.org/people/led/packages/?p=squid.git;a=commit;h=89d9197e7d5217a775c3264f63d0a338165f266b Ну и следующий за ним http://git.altlinux.org/people/led/packages/?p=squid.git;a=commit;h=9b5cb51a1c09333a780686a3ace00bd375c12e6b в котором опять всё упрощаем и используем для остановки по таймауту стандартный stop_daemon(). При этом, если не дождались (почему-то), процесс прибивается с -9. Если конструктивных возражений не будет, этот вариант и пойдёт на сборку.
По-моему, в http://git.altlinux.org/people/led/packages/?p=squid.git;a=commit;h=9b5cb51a1c09333a780686a3ace00bd375c12e6b все упростили настолько, что потеряли собственно цель - гасить squid с помощью squid -k shutdown. :) Предлагаю "упростить" только цикл остановки по таймауту, а функцию stop() начать с чего-то типа if start-stop-daemon -q --pid "$PIDFILE" --user $SQUID_USER --stop --test >/dev/null; then msg_stopping $"squid" $SQUID -f "$SQUID_CONF" -k shutdown *** далее остановка по таймауту *** fi
(В ответ на комментарий №7) > По-моему, в > http://git.altlinux.org/people/led/packages/?p=squid.git;a=commit;h=9b5cb51a1c09333a780686a3ace00bd375c12e6b > все упростили настолько, что потеряли собственно цель - гасить squid с помощью > squid -k shutdown. :) stop_daemon() делает ровно то же, что и "squid -k shutdown" - посылает процессу с указанным pid'ом сигнал TERM. Просто без --retry он, не дожидаясь, посылал сразу же KILL. Поэтому разницы никакой, зато на порядок проще и "стандартнее".
(В ответ на комментарий №8) > stop_daemon() делает ровно то же, что и "squid -k shutdown" - посылает процессу > с указанным pid'ом сигнал TERM. Просто без --retry он, не дожидаясь, посылал > сразу же KILL. > Поэтому разницы никакой, зато на порядок проще и "стандартнее". Если так - тогда возражений нет.
squid-3.2.13-alt3 -> sisyphus: * Wed Aug 14 2013 Led <led@altlinux> 3.2.13-alt3 - squid.init: use config values for shutdown timeout and effective squid user (ALT#29236)
(В ответ на комментарий №6) > (В ответ на комментарий №4) > С SQUID_SHUTDOWN_TIMEOUT=60 - не очень. > > Таймаут задаётся в конфиге параметром shutdown_lifetime - его и нужно > использовать (или дефолтные 30 секунд, если не задан), а не абстрактные 60 > секунд. Плюс 5 секунд накидываем сверху "на всякий случай" (по тестам > получается, что нужно сверх 1-3 секунды). А как Вы считаете, не следует ли абстрактные 5 секунд, накинутые сверху, заменить переменной типа SQUID_EXTRA_SHUTDOWN_TIMEOUT (вместо SQUID_SHUTDOWN_TIMEOUT, которую вообще убрать из /etc/sysconfig/squid), и дать возможность настраивать эти "на всякий случай накидываемые" секунды, с умолчанием в те же 5 секунд например? Случаи разные могут быть, 5 секунд может и не хватить (пример - параллельная остановка нескольких контейнеров OpenVZ, squid в одном из них. 5 секунд может не хватить для корректной остановки). PS Состояние баги не меняю, так как она таки RESOLVED. Если этот пакет скопировать в p7, то я его протестирую и базу закрою/переоткрою.
(В ответ на комментарий №11) http://git.altlinux.org/people/led/packages/?p=squid.git;a=commit;h=5b12e87c8a54916050aa3ce675ebe844c6c15fd2 * Fri Aug 16 2013 Led <led@altlinux.ru> 3.2.13-alt4 - squid.init: made SQUID_EXTRA_SHUTDOWN_TIMEOUT configurable
Спасибо, работает замечательно.