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

Добрый день. Есть ли какой-то примерный порядок поиска источника ошибки

out of memory (куда копать)?
Сегодня начала падать ошибка сначала в запросе мониторинга select size, twice_used, dirty from mamonsu.buffer_cache() затем, буквально через пару минут, начали валиться самые разные запросы и так продолжалось в половине сессий из пула вплоть до рестарта БД. Возможно, какое-то из расширений течёт, но как выяснить, какое?
Ошибки в логах примерно такие:
TopMemoryContext: 354816 total in 12 blocks; 65144 free (230 chunks); 289672 used
... (детализация памяти)
Grand total: 85437656 bytes in 13128 blocks; 23729928 free (3503 chunks); 61707728 used
2022-04-05 14:59:44 MSK [15654]: [49-1] ERROR: out of memory
2022-04-05 14:59:44 MSK [15654]: [50-1] DETAIL: Failed on request of size 5064 in memory context "ExecutorState".
2022-04-05 14:59:44 MSK [15654]: [51-1] STATEMENT: ... (запросы падают самые разные)
Версия postgresql 12.10. Настройки БД примерно такие:
shared_buffers=6GB
work_mem=64MB;
shared_preload_libraries=pg_stat_statements, pg_wait_sampling;
Используемые расширения: btree_gin, btree_gist, dblink, lo, pg_background, pg_trgm, pgcrypto, plpgsql, plpgsql_check, plpython3u, tablefunc, pg_buffercache, pg_stat_statements, pg_wait_sampling
Всего на сервере 16Гб, в момент появления массовых ошибок, судя по мониторингу, на сервере оставалось доступно 4Гб.

17 ответов

109 просмотров

cat /proc/sys/vm/overcommit_memory

Radist
2

ну вот и причина. попробуй 0 :)

Mikhail Zhilin
ну вот и причина. попробуй 0 :)

Не надо такое советовать на СУБД.

Mikhail Zhilin
ну вот и причина. попробуй 0 :)

эм… там всё как надо, собственно. если сделать 0, то придёт OOM и сложит всю базу

Скорее всего, память сильно фрагментирована, при попытке выделись целым куском, ОС показывает СУБД кукиш. Соответственно, надо поиграться с huge pages (сам не игрался, деталей по этому не подскажу).

ЗЫ. Праздного интересу для вопрос: вот этот весь список - он реально необходим, или обсуждаемый инстанс - он для разработки и прочих поиграться?

Radist- Автор вопроса
Михаил Шурутов
ЗЫ. Праздного интересу для вопрос: вот этот весь с...

Если вы про расширения, то: btree_gin, btree_gist, pgcrypto, lo, pg_background, pg_trgm, plpgsql, plpython3u - используются напрямую в проекте в той или иной степени plpgsql_check - нужна, чтобы не развернуть кривой код (настроен триггер, который проверяет код при create function) dblink, tablefunc - вот эти, наверное, относятся к устаревшему функционалу pg_buffercache, pg_stat_statements, pg_wait_sampling - ну а это мониторинг На разработческом инстансе еще пара расширения стоит (включая pldbgapi)

Михаил Шурутов
Скорее всего, память сильно фрагментирована, при п...

Для ликвидации безграмотности подскажите пожалуйста что такое фрагментация памяти и как ее измерить?

Виктор Егоров
эм… там всё как надо, собственно. если сделать 0, ...

Возможно. Хотя ведь и сейчас базе и так приходит ошибка, хотя память ещё свободная есть. Какой может быть совет в данном случаи? Поднимать уровень оверкоммита?

Mikhail Zhilin
Возможно. Хотя ведь и сейчас базе и так приходит о...

сейчас обламывается один запрос. когда придёт OOM — сложится вся база (перезапуск с восстановлением из транзакционного лога от последней контрольной точки) надо смотреть на кол-во памяти, настройки и сам запрос

Виктор Егоров
сейчас обламывается один запрос. когда придёт OOM ...

Это похоже на какоето преуменьшение проблемы. Человек пишет что 30 минут база просто лежала, и помог только рестарт. Откуда информация про один запрос? 🤔

Mikhail Zhilin
Это похоже на какоето преуменьшение проблемы. Чел...

а что значит “просто лежала”? если основные запросы падали с ошибкой, то могло выглядеть как отказ базы для приложения. а что происходило на сервере с базой? какие там, помимо самой базы, программы работают? как долго сессии в базе живут? что происходит в сессиях — есть ли курсоры? если ли prepared statement-ы? используются ли временные таблицы?

Radist- Автор вопроса
Виктор Егоров
а что значит “просто лежала”? если основные запрос...

на сервере кроме СУБД только мониторинг и системные сервисы. Когда проблема началась, в htop процесс postgres: checkpointer занимал 38% памяти. БД, вроде, работала (мне кажется, простые запросы даже проходили, но запросы посложнее - нет). С БД работают около 10 разных пулов подключений, в каждом пуле в пределе может быть от 5 до 25 подключений (25 только в двух из них). idle-сессии из пулов прибиваются, но поддерживается минимум по 2-5 подключений, так что, в теории, могут быть сессии, живущие по много дней. Явно объявленные курсоры не используются. Prepared statement-ы могут создаваться (вроде, jdbc-драйвер их создаёт только после пары запусков одинакового запроса). Да, есть несколько запросов с текстом длиннее 20кб (если это имеет значение)

Михаил Шурутов
Скорее всего, память сильно фрагментирована, при п...

Впервые слышу, что такое возможно. Ну, по идее: фрагмениацыя до отсутствия contiguous segment у 64 бит виртуальной памяти — просто невозможна. Неуспеть, да и не забить дажэ самыми маленькими сегментами. А фрагментацыю физической на 4к страницы — так их всегда можно перетасовать как угодно (дажэ вообще в своп выгрузить).

В момент — хорошо бы strace напустить на процэсс. Посмотреть, что он там не можэт — brk() иои mmap /dev/zero, или что-то ещё. Можэт, там open обламывается и дескрипторов нехватает! Плюс, лимиты процэсса посмотреть.

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

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

Скажите, можно ли как-то "переместить" динамический массив из одной переменной в другую? Скажем, переместить из TList<> в TArray<>. Именно переместить, а не скопировать. Если ...
Eugene Krasnikov (ᴊɪɴ x)
37
Вот еще криповенькая штука. uMain.pas(517,3) Warning: Case statement does not handle all possible cases И ЧО? 😂
Александр (Rouse_) Багель
20
комрады, че-та лыжы не едут var tmpFont: TFont; begin tmpFont:= TFont.Create; try case rgFontColor.ItemIndex of 0: tmpFont.Color:= clWindowText; 1: tmpFo...
Ed Doc
34
.model small .stack 100h .data a db 'Hello, World!', '$' ; исходная строка b db 20 dup(?) ; строка b с запасом на максимальную длину .code main: ...
Алексей -man
3
Интересно, нет ли какого-то способа получить из dll не адрес самой метки, а адрес со смещением?
The Bird of Hermes
54
вопрос, кого посмотреть в ютубе или где почитать про указатели чтобы раз и навсегда запомнить зачем они нужны и как правильно ими пользоваться? поделитесь хорошими ресурсами, ...
-
14
М-да. Почему бы просто со stringlist не работать?
Michael Longneck
23
Is there a digital way to cut the electricity from a usb in linux? It sounds weird, but it's exactly what I need to do. I tried to simulate the unplug/replug but is not the ...
Eduard Rivas
15
Редактор листа Excel, по сути двумерный массив ячеек. Ячейка - это экземпляр класса, у нее всякие свойства, методы. Проблема в том, что количество используемых строк и колоно...
Sergey Bodrov
2
Всем привет. Подскажите пожалуйста, как решить вопрос с подсветкой синтаксиса в vscode. Уже и разные плагины установил, и пробовал пошаманить в json settings, ничего не получ...
EEv9ENN 🤖
6
Карта сайта