172 похожих чатов

Ребята, привет. Такой вопрос: - Есть таблица размером в 1Tb в

таблице есть поле url TEXT ( PRIMARY KEY ).
В эту таблицу регулярно идет порядка 1k RPS. Запрос один и тот же INSERT INTO (url) VALUES (...) ON CONFLICT DO UPDATE
Периодически вне зависимости от кол-ва RPS запросы начинают долго висеть на LWLock, BufferContent.
Как то можно определить что вызывает эти блокировки?

30 ответов

21 просмотр

1) "Долго" -- это сколько? Как вы это определили? Какие средства использовались? 2) Сколько одновременно при этом запросов? 3) Что ещё делает в тот момент база (что в pg_stat_activity), кроме этих запросов? 4) Что делает остальная система? Какое потребление iops/CPU?

Anton-Kucherov Автор вопроса
Ilya Anfimov
1) "Долго" -- это сколько? Как вы это определили? ...

1) Минуты. Заглянул в pg_stats_activity. И наблюдаю со стороны приложения по метрикам в месте SQL запроса. 2) от 1k до 5k в секунду 3) Еще делает SELECT из этой же таблицы, но эти запросы очень быстро проходят. Собственно в pg_stat_activity висят только эти INSERT в состоянии LWLock, BufferContent 4) Ничего, на сервере больше ничего нету. На сервер стучится только 1 процесс под одним и тем же пользователем. И достоверно известно что именно этот процесс своими запросами вызывает блокировки

Anton Kucherov
1) Минуты. Заглянул в pg_stats_activity. И наблюда...

1) Минуты выполняется один запрос? Вы уверены? 2) Это вообще не ответ на мой вопрос. 3) Этого не можэт быть. У постгреса всегда есть несколько служэбных процэссов, которые вы не сможэт выключить. 4) Это тожэ не ответ на мой вопрос.

Anton-Kucherov Автор вопроса
Ilya Anfimov
1) Минуты выполняется один запрос? Вы уверены? 2) ...

1) now() - pg_stat_activity.query_start AS duration, говорит минуты. 2) Вы спросили сколько одновременно запросов. Я ответил от 1 до 5 тысяч запросов в секунду 3) Я не наблюдаю их в pg_stat_activity в моменты когда происходит просадка производительности. Где их посмотреть если в pg_stat_activity их нет? 4) Что имеется ввиду под системой? iops в районе 5k в секунду. при лимите на железе в 10к. CPU не выше 80%.

Anton Kucherov
1) now() - pg_stat_activity.query_start AS duratio...

1) Неслабо. Вижу два варианта -- или это пришёл checkpoint, и выполняется очень долго. В логе в этом случае должно быть сообщение о начале checkpoint (по-моему, оно включено по умолчанию). Или у запроса сломался план. Второе несложно посмотреть, включив лог планов всех запросов, которые выполняются большэ, допустим, 20 секунд. 2) Количество запросов в секунду -- ничего не говорит о том, сколько одновременно запросов выполняются. 3) Хм. Это что-то очень сломанное, если это так. Но, скорее всего, это неверно. Можэт кинуть pg_stat_activity, например, текущий, например, на pastebin. В 14, например, там 'autovacuum launcher', 'logical replication launcher', 'background writer', 'checkpointer', 'walwriter'

Anton Kucherov
1) Минуты. Заглянул в pg_stats_activity. И наблюда...

А на каких хардах это крутится всё у тебя?

Anton Kucherov
1) now() - pg_stat_activity.query_start AS duratio...

4) iops явно приблизились к своему лимиту. Так что вариант, что bgwriter неуспевает, и запускается checkpointer -- начинает обретать некоторые косвенные подтверждения.

Anton-Kucherov Автор вопроса
Ilya Anfimov
1) Неслабо. Вижу два варианта -- или это пришёл c...

Спасибо за подсказку с чекпоинтом. Проверю. И план тоже гляну. 2) Блин, да. В pg_stats_activity в районе 100-300 висят на этой блокировке. Выходит они одновременно висят? 3) Сброшу как снова случится. Происходит это иногда. Периодичность плавает. Помогает перезагрузка сервера. После нее проблема пропадает 4) Пробовали раздувать БД до больших значений. Случается даже когда по CPU 50% запаса а по IOPS все 70% запаса. Ну важная (не знаю деталь). Речь о CloudSQL for PostgresSQL в Google Cloud

Anton Kucherov
Спасибо за подсказку с чекпоинтом. Проверю. И план...

> Выходит они одновременно висят? Наверняка. >3) Сброшу как снова случится. Я предлагал посмотреть ужэ сейчас -- поскольку там в любом случае будет несколько служэбных процэссов, которые вы почему-то пропустили. >Ну важная (не знаю деталь). Речь о CloudSQL for PostgresSQL в Google Cloud Важная. В таком случае имеет прямой смысл задавать вопрос "почему у меня примитивный запрос висит две минуты" в поддержку Google. Во-первых, они берут деньги за то, чтобы таких факапов не было. Это и есть часть работы DBA, притом конкретно та, которую можно возложыть на массовый сервис. Сообщение о проблемах с производительностью базовой функцыональности. Во-вторых, эти внутри ужэ не совсем Postgres, и у вас к тому жэ нет прав его детально ковырять.

Anton Kucherov
Спасибо за подсказку с чекпоинтом. Проверю. И план...

Кстати, 300 процэссов -- это в любом случае некоторый перебор. И это только "на блокировке висят", сколько у вас там одновременно вы так и не признались.

Anton-Kucherov Автор вопроса
Ilya Anfimov
Кстати, 300 процэссов -- это в любом случае некото...

Если убрать лимит вообще из запроса выше, прямо сейчас 461 строка в pg_stats_activity

Anton Kucherov
Спасибо за подсказку с чекпоинтом. Проверю. И план...

К тому жэ гугл, вроде, имеет какие-то лимиты по суммарным IO -- после которых рубит iops до каких-то базовых значений. Возможно, вы упёрлись во что-то такое. (Мониторинг и средства поддержания информированности у них, кстати, отвратительные совершэнно).

Anton Kucherov
Если убрать лимит вообще из запроса выше, прямо се...

Многовато, лучшэ на нагружэнном сервере большэ 150-200 не иметь.

Anton-Kucherov Автор вопроса
Ilya Anfimov
Многовато, лучшэ на нагружэнном сервере большэ 150...

Это не зависит от кол-ва ресурсов на сервере? Т.е. почему именно 150-200 ? Ну можно наверное этого добиться снизив кол-во max_connections. Но это отразится на клиентах сервиса который данные пишет/читает. Нагрузку то я не могу снизить. Могу скейлить вертикально инстанс. Но это не помогает. Пробовал скейлить до 16vCPU 100GB RAM (Там 20000 IOPS доступно, но выше 8k IOPS не поднимается). Все равно затыкается на этих блокировках. При чем если смотреть метрики. то там запаса достаточно и по CPU и по IOPS. А запросы все равно иногда затыкаются.

Anton-Kucherov Автор вопроса
Ilya Anfimov
Кстати, 300 процэссов -- это в любом случае некото...

Вот такая картина сейчас. Хотя сейчас несмотря на то что некоторые запросы висят на блокировках, БД не умирает. Но некоторые INSERT висят по 30 секунд.

Anton Kucherov
Это не зависит от кол-ва ресурсов на сервере? Т.е....

>Это не зависит от кол-ва ресурсов на сервере? Довольно умеренно. Обычно, на средне-приличном сервере доступ к базе в памяти имеет пик rps в районе 100-200 одновременных запросов. Основное узкое место при это ужэ -- да, на блокировках важных ресурсов в памяти. Понятно, что этот лимит насыщения зависит от количества ядер -- но, на самом деле, не очень критично. Далее, если база активно работает с диском, то количество параллельных клиентов в точке максимума производительности несколько увеличится -- но, на самом деле, обычно диску не так много запросов надо для насыщения. Так что тут или измерять, где у вас реальный максимум rps -- или положыться на число 150 как много раз измеренное и плюс-минус справделивое.

Anton Kucherov
screenshot Вот такая картина сейчас. Хотя сейчас несмотря на ...

с fsync игрались? каждый insert - это маленькая транзакция же по сути...

Anton Kucherov
Это не зависит от кол-ва ресурсов на сервере? Т.е....

>Нагрузку то я не могу снизить. 1) Можэте. Количество воркеров в том жэ nginx ограничить. 2) Или можно пулер перед сервером поставить. 3) И, главное -- от увеличения max_connections после некоторого количества -- максимальный rps перестанет расти. Так что нагрузку всё равно вы таким способом не разгребёте.

Альберт Степанцев
с fsync игрались? каждый insert - это маленькая тр...

Вряд ли гугль это разрешает. Впрочем, при таких нагрузках это ужэ неактуально.

Anton-Kucherov Автор вопроса
Ilya Anfimov
>Нагрузку то я не могу снизить. 1) Можэте. Колич...

1) Ну технически да, но клиенты недовольны будут. У нас наоборот запрос: 1) Починить просадки. 2) Сделать x2 возможный RPS к сервису который и пишет/читает собственно в БД. 2) ну там на стороне сервиса и так пулер. Там как раз пулл на 350 соединений 3) Да, это я замечал. Короче надо судя по всему идти на что то другое и/или менять схему данных. 😕

Anton Kucherov
1) Ну технически да, но клиенты недовольны будут. ...

1) Я вам ещё раз пытаюсь объяснить -- если у сервера будет меньшэ rps, то клиенты не станут от этого довольнее.

Anton Kucherov
1) Ну технически да, но клиенты недовольны будут. ...

Кстати, 10k iops на 1k rps -- это нормально. Не очень много, без особого запаса... Но нормально. На 5k rps -- это вы пролетаете.

Anton Kucherov
1) Ну технически да, но клиенты недовольны будут. ...

>Короче надо судя по всему идти на что то другое Взять, например, дедик, а не непонятночто от гугля. Ну, или яндэкс/амазон хотя бы, если принцыпиально в managed.

Anton-Kucherov Автор вопроса
Ilya Anfimov
1) Я вам ещё раз пытаюсь объяснить -- если у серве...

🙂 Так я же не спорю. Я согласен. Не станут. В этом то моя проблема и есть. Мне надо больше RPS.

Anton Kucherov
1) Ну технически да, но клиенты недовольны будут. ...

Кстати, а какая версия постгрес? Потому, что если 12 -- то опускать количество max_connections можэт помочь прямо вот очень сильно. В 14 -- многое поправили, всё равно лучшэ не превышать, особенно если много обновлений одной записи... Но в общем на 14 я бы роста в разы не ожыдал.

Anton-Kucherov Автор вопроса
Ilya Anfimov
Кстати, а какая версия постгрес? Потому, что если ...

14. Спасибо в общем за советы. Кстати а где вот про эти магические 150-200 в ОЗУ почитать можно?

Ilya Anfimov
Кстати, а какая версия постгрес? Потому, что если ...

В 14 наконец-то добавили "деревянный" ORDER в рекурсивных CTE )) Перевел один проект на днях - счастлив!

Anton Kucherov
14. Спасибо в общем за советы. Кстати а где вот пр...

Примерно любая история борьбы за максимальный rps с графиками с конференцый последней пятилетки.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта