Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / быстродействие postgres_fdw / 15 сообщений из 15, страница 1 из 1
20.01.2020, 11:51
    #39916265
tm123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
Здравствуйте.

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

Главный сервер - 40 ядер, 64GB оперативки, 3 tablespace, важные данные на RAID5 из 3 SSD дисков, индексы лежат на отдельном SSD, разные кэшданные рассчитываемые на лету потерять которые не жалко ибо всегда могут быть пересчитаны - еще один SSD.

Разных тестов в разных режимах провел много, вот один из них.

Имеется SQL запрос, insert 3 bigint чуть больше 40K записей, размер запроса около 800kB.

Вставляю его в базу, время работы 200-500ms.

Далее делаю внешние сервера и внешние таблицы ровно точно такой же структуры и делаю ровно тот же insert только в эти внешние таблицы, результаты такие

Вставка в другую базу на том же самом сервере - 3.5-4 сек - уже непонятно с чего такое замедление

Вставка на виртуалку в той же физической и логической сети на 1Gb, 2 ядра, 12GB оперативки, одна tablespace на SAS дисках, RAID или нет не знаю. Время работы 23.7 сек. Замедление тоже непонятно, хотя должно быть, все таки не столько мощи и передача по сети.

Вставка на другой физический сервер доступный по сети, до канала 1Gb - канал 100Mb - от канала 1Gb, эффективная скорость между серверами 35-44Mb, 40 ядер, 64GB оперативки, 2 tablespace важные данные на RAID5 из 3 SSD дисков, индексы лежат на отдельном SSD. Время работы 28 мин 40 сек. Вообще нет никаких предположений с чем связано такое замедление.

Первое на что подумано было - сеть, все проверили - загрузку канала, роутинги, как ни крути при эффективной скорости канала между 2-мя сервера в 44Mb, по скорости исполнения запроса получается всего 9-11Mb, что крайне сомнительно, есть основания полагать, что либо что-то не то в настройках одного или обоих PG, либо сам postgres_fdw видя что сервер из другой подсети начинает умничать и бить данные на пакеты не эффективно, которые плохо сочетаются с настройками сетевого оборудования.

Похожая описанной ситуация и при чтении данных, т.е. чтение данных с удаленных серверов, при чтении с самого себя время увеличивается на 1-2%, при чтении с виртуалки на 15-20%, при чтении с удаленного сервера время чтения в 3-5 раз больше, чем надо на то, чтобы ответ пропихнуть по каналу. Исходя из описаний устройства самого postgres_fdw ничего не указывает на причины такого замедления.

Ради интереса исследовали предположение, что возможно postgres_fdw запрос вида

insert values (),(),() бьет по каким-то причинам на 3 запроса вставки по одной записи, тест со вставкой в ту же таблицу сразу 10 записей работает в 2 раза медленее на удаленном сервере, чем в одном запросе подать 10 запросов по вставке одной записи. Это вообще вызывает кучу вопросов, должно быть все наоборот или хотя бы так же, если бы предположение было верным.
...
Рейтинг: 0 / 0
20.01.2020, 12:54
    #39916300
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
tm123,

Для начала покажите ping от базы до "Вставка на другой физический сервер доступный по сети"
скорее всего в network latency упираетесь... она всетаки на 3-6 порядков медленее чем доступ в локальную оперативную память.

А так - на коротких запросах замедление через fdw на 1-2 порядка штатное и нормальное явление иначе бы все давно на кластерах бы сидели.

Ну и вопрос как именно ваш sql запрос выглядит.
...
Рейтинг: 0 / 0
20.01.2020, 13:03
    #39916304
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
tm123,

Конкретно любой insert в FDW в реальности делается на fdw сторону ПОСТРОЧНО.
Поэтому 40.000 строк - 80.000*network latency между серверами времени только на сетевой обмен.
...
Рейтинг: 0 / 0
20.01.2020, 13:05
    #39916305
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
tm123,

Скорость чтения с fdw через сеть СИЛЬНО определяется параметром fetch_size
как например разобрано в https://www.cybertec-postgresql.com/en/foreign-data-wrapper-for-postgresql-performance-tuning/
(если конечно вам много читать надо)
...
Рейтинг: 0 / 0
20.01.2020, 13:32
    #39916321
tm123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
Maxim Boguk,

PING 10.125.3.235 (10.125.3.235) 56(84) bytes of data.
64 bytes from 10.125.3.235: icmp_seq=1 ttl=62 time=18.1 ms
64 bytes from 10.125.3.235: icmp_seq=2 ttl=62 time=21.6 ms

insert into groupe_tree_cache (parent_id, child_id, groupe_tree_cache_id) values
(1, 2, 3),
(1, 2, 3),
(1, 2, 3),
еще 40000 подобных строк
...
Рейтинг: 0 / 0
20.01.2020, 13:34
    #39916322
tm123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
Maxim Boguk,

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

P.S. Про работу с INSERT
...
Рейтинг: 0 / 0
20.01.2020, 14:00
    #39916342
tm123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
Maxim Boguk
tm123,

Скорость чтения с fdw через сеть СИЛЬНО определяется параметром fetch_size
как например разобрано в https://www.cybertec-postgresql.com/en/foreign-data-wrapper-for-postgresql-performance-tuning/
(если конечно вам много читать надо)



Большое спасибо, с чтением данных очень сильно помогло, с другого удаленного железного сервера на том же канале 140K записей, ответ в виде CSV размером примерно 30MB с настройками по умолчанию чтение идет 24 сек, с установкой fetch_size=1000000 чтение идет 9 сек, если это читать просто с помощью PgAdmin на прямую то чтение данных идет 7.5 сек, если подать запрос на прямую с основного сервера через psql, то 7-7.5 сек - это приемлемое замедление, 10-15% на фоне удобства разработки появляющихся новых возможностей - это хорошо.

По поводу изменения данных хорошо бы почитать где это написано, а так будем думать.
...
Рейтинг: 0 / 0
20.01.2020, 14:33
    #39916360
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
tm123
Maxim Boguk
tm123,

Скорость чтения с fdw через сеть СИЛЬНО определяется параметром fetch_size
как например разобрано в https://www.cybertec-postgresql.com/en/foreign-data-wrapper-for-postgresql-performance-tuning/
(если конечно вам много читать надо)



Большое спасибо, с чтением данных очень сильно помогло, с другого удаленного железного сервера на том же канале 140K записей, ответ в виде CSV размером примерно 30MB с настройками по умолчанию чтение идет 24 сек, с установкой fetch_size=1000000 чтение идет 9 сек, если это читать просто с помощью PgAdmin на прямую то чтение данных идет 7.5 сек, если подать запрос на прямую с основного сервера через psql, то 7-7.5 сек - это приемлемое замедление, 10-15% на фоне удобства разработки появляющихся новых возможностей - это хорошо.

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


Память оно при таких настройках виде конечно на хосте-приемнике будет конкретно подьедать. Впрочем она дешевая ноне.
...
Рейтинг: 0 / 0
20.01.2020, 14:37
    #39916363
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
tm123
Maxim Boguk,

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

P.S. Про работу с INSERT


Это внутренние детали реализации.
bulk insert в fdw не реализован, может когда то и сделают...

ps:
Если надо INSERT с удаленными данными - то надо fdw разворачивать так чтобы insert локально выполнялся а данные подтягивались для него с удаленного сервера (используя удачно подобранный fetch_size).
А если надо без удаленных данных вставлять прямо из кода - то возникает вопрос почему это не вставить прямо на нужном сервере.
...
Рейтинг: 0 / 0
20.01.2020, 16:39
    #39916427
tm123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
Maxim Boguk

Это внутренние детали реализации.
bulk insert в fdw не реализован, может когда то и сделают...

ps:
Если надо INSERT с удаленными данными - то надо fdw разворачивать так чтобы insert локально выполнялся а данные подтягивались для него с удаленного сервера (используя удачно подобранный fetch_size).
А если надо без удаленных данных вставлять прямо из кода - то возникает вопрос почему это не вставить прямо на нужном сервере.


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

P.S. А где вы прочли про внутреннюю реализацию?
...
Рейтинг: 0 / 0
20.01.2020, 16:48
    #39916445
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
tm123
Maxim Boguk

Это внутренние детали реализации.
bulk insert в fdw не реализован, может когда то и сделают...

ps:
Если надо INSERT с удаленными данными - то надо fdw разворачивать так чтобы insert локально выполнялся а данные подтягивались для него с удаленного сервера (используя удачно подобранный fetch_size).
А если надо без удаленных данных вставлять прямо из кода - то возникает вопрос почему это не вставить прямо на нужном сервере.


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

P.S. А где вы прочли про внутреннюю реализацию?


В исходниках.
...
Рейтинг: 0 / 0
20.01.2020, 17:02
    #39916456
tm123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
Maxim Boguk,

Большое спасибо за советы и ответы.

В исходники было бы интересно слазить, да начальство меня пристрелит на месте за это :)

P.S. Не ожидал такого быстрого ответа на такой не простой вопрос, мои вопросы обычно остаются без ответов, почему и не хожу практически на форумы.
...
Рейтинг: 0 / 0
20.01.2020, 17:09
    #39916461
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
tm123,

https://github.com/postgres/postgres/blob/REL_11_STABLE/contrib/postgres_fdw/postgres_fdw.c#L1773
и вот этот раздел документации чтобы примерно представлять что есть что в FDW: https://www.postgresql.org/docs/11/fdwhandler.html
...
Рейтинг: 0 / 0
21.01.2020, 09:44
    #39916653
tm123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
Melkij
tm123,

https://github.com/postgres/postgres/blob/REL_11_STABLE/contrib/postgres_fdw/postgres_fdw.c#L1773
и вот этот раздел документации чтобы примерно представлять что есть что в FDW: https://www.postgresql.org/docs/11/fdwhandler.html


Если я правильно понял, то построчная обработка запросов на изменение данных - это не особенность реализации postgres_fdw, это вообще реализация fdw механизма и надо как минимум ждать доработки самого механизма, а потом уже доработку postgres_fdw, что скорее всего произойдет одновременно.
...
Рейтинг: 0 / 0
21.01.2020, 10:55
    #39916697
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
быстродействие postgres_fdw
ну поскольку есть callback'и BeginForeignModify и EndForeignModify - то принципиально возможно, например, собирать таплы в memory context и отправлять пачками по мере заполнения. Или сделать один COPY (но надо что-то решить со случаем если в ForeignModify будут намешаны insert/update/delete).
Далее надо проверить насколько это легально с точки зрения ожиданий поведения этого API. Лучше письмом в pgsql-hackers спросить.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / быстродействие postgres_fdw / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]