Материал подготовлен в рамках курса «Высоконагруженные системы: архитектура и масштабирование».
Привет, Хабр!
У блокировок в PostgreSQL есть неприятная особенность: пока нагрузки мало, их почти не видно. Транзакции короткие, конкуренции за одни и те же строки нет, всё разбирается за миллисекунды. А потом приходит нагрузка, и оказывается, что одна медленная транзакция держит блокировку, за ней выстраивается очередь, очередь упирается в пул соединений, пул заканчивается — и база, которая по метрикам почти ничем не занята, перестаёт отвечать.
Самое проблемно тут — CPU и диск при этом свободны. База не работает, она ждёт. И если не знать, куда смотреть, диагностика превращается в гадание: запросы вроде те же, что вчера, а сегодня всё стоит.