Pull to refresh

Comments 18

Мы [давно] сравнивали с pg_repack, он показался как-то попроще и поэффективнее тогда. Деталей, за давностью лет, уже не припомню.

А для аналогичной по смыслу методики «апдейти хвост, отрезай пустое VACUUM'ом» есть самописные скрипты для тех серверов, куда контриб не хочется вкатывать.

С точки зрения метрик вы сделали офигенно. -60% нагрузки. С точки зрения понятности архитектуры: теперь есть cron скрипт, после смерти которого нагрузка вырастет на 166% и никто (без его пересоздания посредством повторения исследования из этого поста) ничего не сможет сделать. Т.е. это классический админский костыль на которых всё и держится. Они очень хорошо работают, но не очень хорошо сопровождаются.


Каким образом и когда вы узнаете, что он сломался? И как человек, который "что-то заподозрит" поймёт, что дело в нём?

Когда «что-то» ломается, то каждый сработавший триггер отсекает набор возможных причин. И если «админский костыль» (а чем он хуже программерского?) — часть инфраструктуры, то и мониториться он должен по аналогичным правилам.

Навскидку, в данном примере, резкое увеличение количества одновременных автовакуумов в течение суток явно укажет на этот скрипт.
Слушайте, а почему у вас ротация сделана ночью, а не днем? Ну просто это вроде важная операция, которую неплохо бы иметь возможность отлаживать во вменяемом состоянии, если вдруг оно упадет?
Если посмотреть на последнюю картинку, то там есть такой нехилый пик до 80% в 00:15-00:30 — это вот ровно этот скрипт. И это те самые +80%, которые в течение дня наблюдать совсем не хочется.
А если оно «вдруг упадет», то система не станет мгновенно работать в разы хуже — то есть запас по времени на устранение последствий достаточен.
Странно, что простая вроде бы операция занимает 15 минут. Я подобный трюк проводил с мускулем лет 5 назад, там был банальный drop partition для достаточно старых partition-ов, и это вроде не было так уж дорого… Хотя конечно, как и сколько может тут занимать перестройка индексов — достойный ответа вопрос, так что похоже на ваших данных — вы правы.
Там идет обработка порядка 100-150GB данных за предыдущие сутки — с физическим переупорядочиванием и перестроением индексов.

Программерский костыль ещё хуже админского, потому что зарыт глубже. Но, не всё, что пишут программисты и админы — костыли.


Я к тому, что если у вас есть критическое улучшение инфраструктуры (рост утилизации ресурсов СУБД на 166% — это вполне близко к "критическое" при указанных нагрузках), то оно должно быть отражено в описании инфраструктуры. То есть есть два сервера: на одном поправлено, на другом нет. Чем они отличаются, кроме "последствий"?


Ответ должен включать какую-то инструментацию: тесты, декларативное описание, доказательства работы (кроме быстрой производительности).


Кстати, почему крон, а не таймер systemd? Вот я таймера я адекватную инфраструктуру проверки работы могу себе представить, а вот для крона — только если несколько слоёв баша намазать...

В цепочке «процесс < — тот, кто контролирует процесс < — тот, кто контролирует процесс, который контролирует < — ...» где-то есть разумное ограничение, когда стоит остановиться. И инструкция, и описание, и «скрипт, проверяющий скрипт» — все это звенья этой цепи, а ее длина обычно определяется ценностью проверяемого процесса и его последствий.

В цепочке контроля обычно всё заканчивается на тестах. Вот меня сейчас попросили для продукта, который мы предоставляем (попользоваться) дать запросы в пром на простейшие метрики (для показа в UI). Вместо того, чтобы отдать примеры запросов и забыть про задачу, у нас есть задача "проверять запросы". CI, который тестирует продукт, теперь (когда задачу сделают) будет проверять, что каждый запрос отдаёт то, что ожидается. Во-первых мы уверены тогда в смысле запросов, во-вторых, если что-то поменяют (например, номер порта прома) без учёта в остальной инфраструктуре, оно обсыпется с грохотом.


Т.е. в нашем случае тесты являются финальным якорем для решений (и костылей). Что-то поменяли и сломали костыль? Оно просто не попадёт в мастер.

Мы же вроде не про CI и «сломали в версии»? А про мониторинг самой работоспособности этого скрипта — например, сам cron-демон по каким-то причинам сбойнул «на бою» и наш скрипт не запустил.

И если «админский костыль» (а чем он хуже программерского?) — часть инфраструктуры, то и мониториться он должен по аналогичным правилам.
В этом контексте под «мониториться» надо понимать и весь CI-цикл.

Я немного про другое. Если есть проверка, которая следит за таймером и соответствующим сервисом (не крон. пожалуйста, не крон!), то она работает на слепой вере. 99.9% времени она работает хорошо (сообщает, что проблемы нет), в оставшийся 0.1% она работает плохо (не сообщает о том, что проблема есть). Откуда вы знаете, что ваша проверка ловит проблему?


Хотя мы лезем в детали реализации. В хорошей инфраструктуре наличие этого таймера и его проверки будет частью маленькой и хорошо проверенной сущности, а не всего проекта. У этой сущности должно быть своё название и понимание, что вы используете её, а не что-то другое.

99.9% времени она работает хорошо (сообщает, что проблемы нет), в оставшийся 0.1% она работает плохо (не сообщает о том, что проблема есть). Откуда вы знаете, что ваша проверка ловит проблему?
А откуда мы знаем, что остальные 99.9% она работает действительно хорошо? Ах, это нам сообщил непогрешимый проверочный скрипт?.. Или таки проверочный скрипт тоже надо проверять?

Ровно про это я и говорю, что количество степеней проверки определяется ценностью проверяемой операции.

Ну, достоверно сломать проще, чем сделать достоверно работающее. В соответствующем скрипте у нас написано:


  • проверить, что работает
  • сломать
  • проверить, что срабатывает
  • починить
  • проверить, что работает

Вот эта часть "сломать" — она чаще всего тривиальна, и в сочетании "проверить, что срабатывает" верифицируется в силу маловероятности синхронных двух одновременных багов в обоих проверках ("маловероятность" тут следует читать в одном ряду с "маловероятной коллизией рандомных uuid'ов").


Для совсем параноиков есть мутационное тестирование. Хотя в целом, в модели тестов говорится, что тесты должны быть такими простыми, что их можно верифицировать "глазами".

Никто не мешает подцепить метрику и алертинг на промежуточные сигналы типа того же autoANALYZE на таблички, помеченные как append-only. А к ним в документацию — ссылочку на пост-мортем от этого исследования, чтобы когда оно сломается и разбудит инженера все было под кончиками пальцев.

Я не знаю что у проекта "снизу" (как всё развёртывается/тестируется), так что не могу сказать достаточно этого или нет. Если просто добавлен руками алерт в мониторинг с ссылкой на статью, то это ещё один костыль, который подпирает предыдущий костыль.

Sign up to leave a comment.