|
Производительность операции присваивания в Pl/PgSQL
|
|||
---|---|---|---|
#18+
Столкнулся с тем, что 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.
Первая процедура просто выполняет присваивание в цикле, вторая вызывает первую pCount раз и считает время. Если интересно, немного подробнее изложил тут . Этому есть какое-нибудь объяснение? Может, блокировки какие или что-то ещё? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 15:05 |
|
Производительность операции присваивания в Pl/PgSQL
|
|||
---|---|---|---|
#18+
кросслинк https://www.postgresql.org/message-id/flat/CAN%3DgQ4Bc-CRKh91q38ApZd%2BB2iyB7ZDwusEPVq%2BiK8b8AMSG1A%40mail.gmail.com#CAN=gQ4Bc-CRKh91q38ApZd+B2iyB7ZDwusEPVq+iK8b8AMSG1A@mail.gmail.com]на hackers дискуссию ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 15:46 |
|
Производительность операции присваивания в Pl/PgSQL
|
|||
---|---|---|---|
#18+
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, просто не успел построить график. На графике - количество присваиваний в секунду в зависимости от количества потоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 16:12 |
|
Производительность операции присваивания в Pl/PgSQL
|
|||
---|---|---|---|
#18+
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 ошибку почему то. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 17:47 |
|
Производительность операции присваивания в Pl/PgSQL
|
|||
---|---|---|---|
#18+
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 блокировках, которые используются для работы с ними, тогда параллельное выполнение простого запроса даст такой же спад производительности - надо это проверить. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 18:29 |
|
Производительность операции присваивания в Pl/PgSQL
|
|||
---|---|---|---|
#18+
[quot Maxim Boguk]bff7755aпропущено... PS: ссылка из обсуждения с графиками у меня дает 500 ошибку почему то. Telegra.ph сегодня некстати сломался (см. твит ). Статья доступна по этой ссылке. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 18:58 |
|
Производительность операции присваивания в Pl/PgSQL
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 03:35 |
|
Производительность операции присваивания в Pl/PgSQL
|
|||
---|---|---|---|
#18+
Maxim Bogukbff7755a, Тогда просто perf в руки и изучать. Пока вышло вот что: Картинка для 2 потоков: Картинка для 10 потоков: Я, если честно, большой разницы пока не вижу. Также с помощью dtrace удалось узнать, что на каждое выполнение берётся одна легковесная блокировка, но ожиданий освобождения блокировок нету, даже если количество потоков превышает количество ядер CPU. Это наводит на мысль о приближении к пределу пропускной способности шины. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 15:52 |
|
Производительность операции присваивания в Pl/PgSQL
|
|||
---|---|---|---|
#18+
bff7755a, Посмотрите на эту темку, возможно она была спровоцирована вашим письмом: https://postgr.es/m/32589.1513706441@sss.pgh.pa.us]https://postgr.es/m/32589.1513706441@sss.pgh.pa.us ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 23:51 |
|
|
start [/forum/topic.php?fid=53&msg=39572244&tid=1996027]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
222ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 280ms |
total: | 616ms |
0 / 0 |