Воркеры PHP-FPM, которые съели хост
RSS рос после каждого запроса в каталог. Утечкой оказался copy-on-write, а не забытый unset().
Разборы
Разборы прошлых бизнес-проектов. Какая была цель, какие решения приняли и что изменилось после релиза.
RSS рос после каждого запроса в каталог. Утечкой оказался copy-on-write, а не забытый unset().
Два хранилища, у каждого своя работа. Страницы живут в Memcached. Lock на пересборку живёт в Redis.
Три локали в одной JSON-колонке раздували каждый листинг. Упакованный slab в Memcached срезал кучу воркера вдвое.
Redis забился serialize Eloquent. Очередь тормозила, потому что payload был каталогом.
Vue SSR рендерил русский и всё равно выделял файлы en и de. Изолят рос с каждой страницей.
nginx кэшировал HTML по auth_token. Hit rate умер. Публичным страницам этот ключ в cookie не нужен.
ORDER BY JSON_EXTRACT заполнял временную таблицу. Сорок строк всё равно стоили filesort по пятидесяти тысячам SKU.
PHP-FPM не был медленным. Docker NAT на порт 9000 ронял SYN, когда backlog упирался в 128.
withoutOverlapping жил в Memcached. Вытеснение HTML снимало mutex. Четыре пересборки писали один ключ листинга.
Redis забился блобами laravel_session. Horizon терял reserved job из-за allkeys-lru.
Сервис php монтировал apps/. Каждый запрос делал stat() дерева через virtiofs. Hits в OPcache были шумом.
compose restart php убивал FCGI в полёте. nginx отдавал 502. Полузаписанный ключ Memcached оставался.
ATTR_PERSISTENT на php-fpm, Horizon и schedule. max_connections 151. Too many connections в полдень.
Vue SSR писал 14 Jul в UTC. Клиент писал 13 Jul в Берлине. Гидратация падала, страница рисовалась дважды.
WHERE title->>'ru' ILIKE сканировал пятьдесят тысяч строк JSONB. GIN был для тегов. Каталог платил за extract.
Провайдер вернул 200. Воркер умер до ack. Redis отдал сообщение снова. Unique middleware не закрыл SIGKILL.
Healthcheck Docker стал liveness. Первый запрос компилировал LaraBoom. Kubelet слал SIGKILL. Реплика не стала Ready.
Каталог был Vue SSR. Общий остров крутил React. Даты не сошлись. Страница рисовалась дважды и везла граф CMS.
Cloudflare закэшировал первый HTML для URL. Посетитель de получил разметку ru. Vue гидрировал чужой язык и уходил в навигацию.