Увеличьте скорость вставки данных в PostgreSQL - PullRequest
0 голосов
/ 28 сентября 2018

Я застрял в проблеме, из-за которой запись данных в PostgreSQL идет очень медленно.

Я разработал свое приложение на Java (с использованием JDBC) для вставки данных в базу данных PostgreSQL.Это хорошо работает на нашем удаленном сервере разработки.Однако после развертывания на производственном сервере возникает проблема.

Скорость вставки PostgreSQL на рабочий сервер составляет всего ~150 records/s for 200000K records, а на сервере разработки - ~1000 records/s for the same data set.

Во-первых, я попытался изменить конфигурацию в postgresql.confследующим образом:

effective_cache_size = 4GB
max_wal_size = 2GB
work_mem = 128MB
shared buffers = 512MB

После того, как я изменил конфигурацию и перезапустился, это влияет только на скорость запроса, в то время как скорость вставки не изменяется (~ 150 записей / с).

У меня естьпроверил информацию о памяти моего сервера, там много свободной памяти ~ 4Гб.Устройство вставки использует только 0,5% от 8 ГБ (~ 40 МБ).

Итак, мои вопросы:

Является ли это проблемой диска хранения, например, SSD и HDD, виртуального и физического и т. Д.?Почему скорость вставки все еще очень низкая, хотя я изменил конфигурацию?Есть ли способ увеличить скорость вставки?

Примечание: проблема не связана со структурой запроса вставки.Я использовал тот же запрос в том же состоянии в другом месте (я настроил среду на 2 серверах таким же образом).Я не знаю, почему сервер DEVELOPMENT (4 ГБ) работает лучше, чем сервер PRODUCTION (8 ГБ).

1 Ответ

0 голосов
/ 28 сентября 2018

Единственный из ваших параметров, который влияет на производительность INSERT, - max_wal_size.Высокие значения предотвращают частые контрольные точки.

Используйте iostat -x 1 на сервере базы данных, чтобы увидеть, насколько заняты ваши диски.Если они очень заняты, вы, вероятно, узкие места ввода / вывода.Может быть, подсистема ввода-вывода на вашем тестовом сервере лучше?

Если вы выполняете INSERT s во многих небольших транзакциях, вы можете быть узко поставлены fsync в WAL.Симптомом является занятый диск с небольшим количеством операций ввода-вывода.

В этом случае пакетируйте INSERT в более крупных транзакциях.Различие, которое вы наблюдаете, может быть вызвано другой конфигурацией: возможно, вы установили synchronous_commit или (horribile dictu!) fsync на off на тестовом сервере.

...