Отчёт воркера выглядел образцово: каждый прогон — полный бюджет рендеров, ошибок нет, замок снимается. А очередь из 32 659 ячеек таяла так медленно, что первый клик посетителя попадал на холодное: 0,8–1,0 с вместо 0,12 с на повторе.
Это тридцать девятая часть цикла «Кэш страниц без MISS».
Где пряталось время
Прогон работал 40 секунд и в конце ставил следующий запуск через 60 секунд — от конца прогона. А системный крон дёргает WordPress раз в минуту. Следующий запуск оказывался чуть позже очередного тика и ждал ещё одного. В итоге воркер работал 40 секунд из каждых 120.
Каждый прогон честно отрабатывал полный бюджет — поэтому счётчики и выглядели отлично. Простой был между прогонами, а его никто не мерил. С таким темпом очередь растаяла бы за 2,5 часа.
Лечение
| Параметр | Было | Стало |
|---|---|---|
| следующий запуск | через 60 с | через 5 с |
| длина прогона | 40 с | 50 с |
| пауза между рендерами | — | 0,07 с |
| повтор при замке | — | через 15 с |
Темп вырос в 2,1 раза: примерно с 170 до 350 ячеек в минуту.
Потолок этого приёма
Даже с запуском «через 5 секунд» реальный интервал между прогонами вышел около 85 секунд: внешний планировщик, который дёргает крон, по всей видимости, отсчитывает минуту от конца предыдущего запуска. Дальше ускорять через wp-cron нельзя — следующий шаг уже выносить прогрев в отдельный постоянный процесс.
Что мерить
Мерьте интервал между временами последних прогонов, а не только число рендеров за прогон. Полный бюджет каждого прогона ничего не говорит о том, сколько прогонов в час.
// в конце прогона
$prev = (int) get_option('warm_last_run');
update_option('warm_last_gap', $prev ? time() - $prev : 0, false);
update_option('warm_last_run', time(), false);
Прогрев идёт, а холодного не становится меньше?
Пришлите адрес — посчитаю реальный темп воркера, а не его отчёт.
// загружаю комментарии…