Защита прогрева от перегрузки сервера — правильная идея. Сайт важнее кэша: если сервер задыхается, лишние рендеры ему не помогут. Но защита «если нагрузка выше порога — пропустить прогон» на общем сервере выключила прогрев на часы, и никто этого не заметил.
Это тридцать седьмая часть цикла «Кэш страниц без MISS».
Что произошло
Каталог среднего размера жил на общем сервере с соседями. Один из соседей занимал 331 % процессора, средняя нагрузка — 3,99. Порог «нагрузка на ядро ≥ 3,0» пропускал прогон целиком. Прогрева не было часами, молча: в журнале не было ни ошибок, ни предупреждений.
Симптом: растёт счётчик «пропущено по нагрузке», время последнего прогона застыло. Если такого счётчика нет — вы этого не увидите вообще.
Ступени вместо выключателя
| Нагрузка на ядро | Что делает воркер |
|---|---|
| ниже 1,5 | полный режим |
| 1,5 и выше (мягкий порог) | гасит ускоренный догрев, бюджет прогона — треть |
| 3,0 и выше (жёсткий порог) | один рендер за прогон — 60 ячеек в час, но очередь тает |
| 8,0 и выше (авария) | пропуск с переносом события |
Плюс отдельная остановка по памяти: если процесс занял больше 70 % своего лимита, прогон заканчивается.
function warm_budget(int $full): int {
$load = sys_getloadavg()[0] / max(1, cpu_cores());
if ($load >= 8.0) { warm_count('skipped_load'); return 0; }
if ($load >= 3.0) { warm_count('throttled'); return 1; }
if ($load >= 1.5) { return (int) ceil($full / 3); }
return $full;
}
Главное — на жёстком пороге очередь всё равно движется. Медленно, но посетители рано или поздно получают тёплые страницы, а не MISS навсегда.
Три гипотезы, которые не подтвердились
До того как найти порог нагрузки, мы проверили три очевидных версии — и все оказались ложными:
| Гипотеза | Что показал замер |
|---|---|
| кэш слишком часто сбрасывается | 4 полных сброса за 12 часов — немного |
| обход не успевает | 73 круга за 12 часов — успевает с запасом |
| не хватает памяти | 16 МБ при пороге 717 МБ |
Проверяйте гипотезу замером, прежде чем чинить. Любую из трёх можно было «исправить» — и потратить день на правку, которая ничего бы не изменила.
Прогрев на общем сервере работает рывками?
Пришлите адрес — проверю, как ваш воркер реагирует на нагрузку соседей.
// загружаю комментарии…