PostgreSQL V12 создать временную таблицу не хватает общей памяти, я могу создать на диске? - PullRequest
0 голосов
/ 16 января 2020

Работает на RHEL 7 PostgreSQL Система версии 12 имеет 28 ГБ памяти и 12 ГБ совместно используемой памяти. БД использует более 6 ТБ на диске. Некоторые строки содержат около 300 миллионов строк.

Переместил мою БД из версии 9 в версию 12, и я запускаю тесты на новой БД. У нас есть процесс, который генерирует сводные данные во временной таблице, а затем мы запрашиваем временную таблицу для разных вещей, а затем мы удаляем временную таблицу - гораздо быстрее, чем многократно выполнять очень похожие запросы, поэтому это было сделано.

Их запрос похож на этот:

CREATE TEMPORARY TABLE
        XXX
        AS
        SELECT
        COUNT(t.id) AS count,
        t.tagged AS tagged,
        t.tag_state AS tag_state,
        t.error AS error,
        td.duplicate AS duplicate
        FROM
        ttt t
        INNER JOIN tweet_data td ON (td.tweet_id = t.id)
        GROUP BY
        t.tagged,
        t.tag_state,
        t.error,
        td.duplicate;

Обратите внимание, что это отлично работает на V9, но я не очень внимательно наблюдал за этим на V9, чтобы увидеть, что он делает. На V12 использование общей памяти растет медленно, а затем примерно через 15 минут она резко возрастает, увеличивается до 12 ГБ, а затем пытается увеличить ее и выдает ошибку:

Ошибка: ОШИБКА: не удалось изменить размер общей Сегмент памяти "/PostgreSQL.868719775" до 2147483648 байт: на устройстве не осталось места

По какой-то причине мы выполнили только оператор select без создания временной таблицы, и он также завершился ошибкой при увеличении общей памяти, но в сообщении об ошибке говорится, что он был убит администратором.

В настоящее время я работаю с БД в вакууме, чтобы посмотреть, поможет ли это.

Наибольшее беспокойство вызывает то, что это работает с V9, но не работает на V12. Я также знаю, что механизм запросов у них очень отличается и нов в V12 по сравнению с V9.

У меня была безумная надежда, что поэтапный запуск вакуума будет иметь значение. Данные были перенесены с использованием pg_upgrade.

vacuumdb -U postgres -p 5431 --all --analyze-in-stages

Я не знаю, была ли создана временная таблица или нет, но после запуска вакуума мы снова запустили полный запрос, создав временную таблицу, и она также не удалась.

Есть мысли? Является ли мой единственный выбор, чтобы попробовать больше общей памяти?

1 Ответ

1 голос
/ 16 января 2020

Эти сегменты разделяемой памяти используются для связи между рабочими процессами с параллельным запросом .

PostgreSQL, кажется, нехватка ресурсов, и хотя ошибка является скорее симптомом, чем Причиной проблемы можно улучшить ситуацию, отключив параллельный запрос для этого оператора:

SET max_parallel_workers_per_gather = 0;

Тогда ваш запрос займет больше времени, но использует меньше ресурсов, которых может быть достаточно, чтобы избавиться от проблемы. .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...