powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Производительность операции присваивания в Pl/PgSQL
9 сообщений из 9, страница 1 из 1
Производительность операции присваивания в Pl/PgSQL
    #39572062
bff7755a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся с тем, что Pl/PgSQL процедура, котороая не содержит ничего, кроме операции присваивания в цикле, будучи запущенной одновременно в разных подключениях выполняется медленнее, чем в один поток. Тестировал на сервере с 20 ядрами - количество вызовов процедуры за единицу времени уменьшается экспоненциально при увеличении количества потоков:



Код процедур для теста выглядит следующим образом:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE OR REPLACE FUNCTION benchmark_test() RETURNS VOID AS $$
DECLARE
  v INTEGER; i INTEGER;
BEGIN
  for i in 1..1000 loop
    v := 1;
  end loop;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION benchmark(pCount INTEGER) RETURNS INTERVAL AS $$
DECLARE
  v INTEGER; vtTime TIMESTAMP;
BEGIN
  vtTime := clock_timestamp();

  FOR i IN 1..pCount LOOP
    PERFORM benchmark_test();
  END LOOP;

  RETURN clock_timestamp() - vtTime;
END;
$$ LANGUAGE plpgsql;



Первая процедура просто выполняет присваивание в цикле, вторая вызывает первую pCount раз и считает время. Если интересно, немного подробнее изложил тут .

Этому есть какое-нибудь объяснение? Может, блокировки какие или что-то ещё?
...
Рейтинг: 0 / 0
Производительность операции присваивания в Pl/PgSQL
    #39572102
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кросслинк https://www.postgresql.org/message-id/flat/CAN%3DgQ4Bc-CRKh91q38ApZd%2BB2iyB7ZDwusEPVq%2BiK8b8AMSG1A%40mail.gmail.com#CAN=gQ4Bc-CRKh91q38ApZd+B2iyB7ZDwusEPVq+iK8b8AMSG1A@mail.gmail.com]на hackers дискуссию
...
Рейтинг: 0 / 0
Производительность операции присваивания в Pl/PgSQL
    #39572123
bff7755a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkijкросслинк https://www.postgresql.org/message-id/flat/CAN%3DgQ4Bc-CRKh91q38ApZd%2BB2iyB7ZDwusEPVq%2BiK8b8AMSG1A%40mail.gmail.com#CAN=gQ4Bc-CRKh91q38ApZd+B2iyB7ZDwusEPVq+iK8b8AMSG1A@mail.gmail.com]на hackers дискуссию
Спасибо, я постеснялся ).

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



Синяя - 9.2, желтая - 9.3, синяя - 9.5. В 9.6 почти то же, что и в 9.5, просто не успел построить график. На графике - количество присваиваний в секунду в зависимости от количества потоков.
...
Рейтинг: 0 / 0
Производительность операции присваивания в Pl/PgSQL
    #39572203
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bff7755aMelkijкросслинк https://www.postgresql.org/message-id/flat/CAN%3DgQ4Bc-CRKh91q38ApZd%2BB2iyB7ZDwusEPVq%2BiK8b8AMSG1A%40mail.gmail.com#CAN=gQ4Bc-CRKh91q38ApZd+B2iyB7ZDwusEPVq+iK8b8AMSG1A@mail.gmail.com]на hackers дискуссию
Спасибо, я постеснялся ).

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



Синяя - 9.2, желтая - 9.3, синяя - 9.5. В 9.6 почти то же, что и в 9.5, просто не успел построить график. На графике - количество присваиваний в секунду в зависимости от количества потоков.

По факту v := 1; это на самом деле некоторый select 1 into v; и начинаются игры с snapshot И тд.

Гонять вычисления на pl/pgsql нельзя он для склеивания sql Запросов а не для математики.

Для математики есть Pl/v8 pl/r pl/хрен-знает-что и тд на любой вкус.

PS: ссылка из обсуждения с графиками у меня дает 500 ошибку почему то.
...
Рейтинг: 0 / 0
Производительность операции присваивания в Pl/PgSQL
    #39572226
bff7755a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Bogukbff7755aпропущено...

Спасибо, я постеснялся ).

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



Синяя - 9.2, желтая - 9.3, синяя - 9.5. В 9.6 почти то же, что и в 9.5, просто не успел построить график. На графике - количество присваиваний в секунду в зависимости от количества потоков.

По факту v := 1; это на самом деле некоторый select 1 into v; и начинаются игры с snapshot И тд.

Гонять вычисления на pl/pgsql нельзя он для склеивания sql Запросов а не для математики.

Для математики есть Pl/v8 pl/r pl/хрен-знает-что и тд на любой вкус.

PS: ссылка из обсуждения с графиками у меня дает 500 ошибку почему то.

Максим, добрый день, спасибо что ответили ).

Про то, что на каждое присваивание выполняется запрос я в курсе. В hackers я привёл следующую цепочку вызовов:

PLPGSQL_STMT_ASSIGN -> exec_stmt_assign() -> exec_assign_expr() -> exec_eval_expr() -> exec_run_select() -> SPI_execute_plan_with_paramlist() -> _SPI_execute_plan()

Далее действительно идут операции со снапшотами и прочим (PushActiveSnapshot(), PopActiveSnapshot()). Тут бы уже хотелось до истины добраться, просто уже любопытно стало. Хочу попробовать с помощью perf это попробовать выяснить. Если дело в снапшотах и lw блокировках, которые используются для работы с ними, тогда параллельное выполнение простого запроса даст такой же спад производительности - надо это проверить.
...
Рейтинг: 0 / 0
Производительность операции присваивания в Pl/PgSQL
    #39572244
bff7755a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Maxim Boguk]bff7755aпропущено...
PS: ссылка из обсуждения с графиками у меня дает 500 ошибку почему то.
Telegra.ph сегодня некстати сломался (см. твит ).

Статья доступна по этой ссылке.
...
Рейтинг: 0 / 0
Производительность операции присваивания в Pl/PgSQL
    #39572409
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bff7755a,

Тогда просто perf в руки и изучать.

>>Если дело в снапшотах и lw блокировках, которые используются для работы с ними, тогда параллельное выполнение простого запроса даст такой же спад производительности - надо это проверить.

Не даст потому что 10M TPS получить на существующем оборудовании не получится (там задолго до 10M TPS другие лимитирующие факторы вылезут). Тут вопрос сколько раз в секунду сервер позволяет snapshot взять (и я думаю что вы скорее всего в ширину шины памяти упираетесь).

PS: в эту сторону думают в треде https://www.postgresql.org/message-id/flat/a67985f7-c1d2-4133-96b3-978ef9aecd65@email.android.com#a67985f7-c1d2-4133-96b3-978ef9aecd65@email.android.com]https://www.postgresql.org/message-id/flat/a67985f7-c1d2-4133-96b3-978ef9aecd65@email.android.com#a67985f7-c1d2-4133-96b3-978ef9aecd65@email.android.com
...
Рейтинг: 0 / 0
Производительность операции присваивания в Pl/PgSQL
    #39572861
bff7755a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Bogukbff7755a,
Тогда просто perf в руки и изучать.

Пока вышло вот что:

Картинка для 2 потоков:


Картинка для 10 потоков:


Я, если честно, большой разницы пока не вижу.

Также с помощью dtrace удалось узнать, что на каждое выполнение берётся одна легковесная блокировка, но ожиданий освобождения блокировок нету, даже если количество потоков превышает количество ядер CPU. Это наводит на мысль о приближении к пределу пропускной способности шины.
...
Рейтинг: 0 / 0
Производительность операции присваивания в Pl/PgSQL
    #39573174
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bff7755a,

Посмотрите на эту темку, возможно она была спровоцирована вашим письмом:
https://postgr.es/m/32589.1513706441@sss.pgh.pa.us]https://postgr.es/m/32589.1513706441@sss.pgh.pa.us
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Производительность операции присваивания в Pl/PgSQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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