PDA

Просмотр полной версии : [Проблема] Postgres использует только одно ядро


Ruslan Aliev
07.12.2010, 10:06
ОС Debian Lenny 5.0 AMD64, стоит Postgres 8.3 из репозитариев.
При запуске клиента написанного на C++ (в несколько потоков) создаются несколько потоков Postgres (для каждого клиента отдельный).
Но все потоки используют одно ядро !!!
Перерыл все настройки. Многопоточность включена.
Кто из гуру Postgress может помочь?

Химера
07.12.2010, 10:22
Клиент использует одно ядро или сервер?

Kane
07.12.2010, 10:55
Хмм, а с какой стати вы взяли что используется только одно ядро? Треды у постгреса нативные и шедулятся самой ос. Так что дело не должно быть в постгресе.

Ruslan Aliev
07.12.2010, 11:27
Хмм, а с какой стати вы взяли что используется только одно ядро? Треды у постгреса нативные и шедулятся самой ос. Так что дело не должно быть в постгресе.
Да в общем-то вывод htop показывает что все потоки идут на одном ядре.

Сейчас поставил pgbouncer , может решит проблему. Сижу, наблюдаю.

Ruslan Aliev
07.12.2010, 11:29
Клиент использует одно ядро или сервер?
Клиент на отдельном сервере. Использует одно ядро. Но даже при запуске нескольких клиентов, постгрес всё отрабатывал на одном ядре.

Kane
07.12.2010, 11:59
Да в общем-то вывод htop показывает что все потоки идут на одном ядре. Сейчас поставил pgbouncer , может решит проблему. Сижу, наблюдаю.
Странно, он может грузить ядра немного неравномерно, но чтоб 1 ядро 100% а остальные в 0 это что то непонятное. Сколько видел стандартных инсталлов постгреса такого не встречал.

shumbola
07.12.2010, 20:27
Хмм, а с какой стати вы взяли что используется только одно ядро? Треды у постгреса нативные и шедулятся самой ос. Так что дело не должно быть в постгресе.

Это у какого постгреса треды нативные? И откуда они взялись? ;-)

shumbola
07.12.2010, 20:36
Клиент использует одно ядро или сервер?
Клиент на отдельном сервере. Использует одно ядро. Но даже при запуске нескольких клиентов, постгрес всё отрабатывал на одном ядре.

Первым делом проверьте клиент. Сколько процессов постгрес запущен на сервере? Что за запросы выполняются? Как долго выполняются? Сколько сессий создаются?
Вопросов не мало, но чтобы ответить на ваш вопрос приходиться их задавать.

PostgreSQL используют схему один процесс - одна сессия. В рамках одной сессии используется только один процессор. Для выполнения одного сложного запроса используется один процессор (Oracle, SQL Server, DB2,...) могут распараллелить выполнение такого запроса на все процессора.
В большинстве случаях узкое место не процессор, а I/O, вполне может быть, что достаточно одного процессора. :-)

shumbola
07.12.2010, 20:39
Клиент использует одно ядро или сервер?
Клиент на отдельном сервере. Использует одно ядро. Но даже при запуске нескольких клиентов, постгрес всё отрабатывал на одном ядре.

Вы знаете, что есть в поставке PostgreSQL утилита pgbench? Попробуйте сначала тестировать с ней, а потом уже со своим клиентом.

Kane
07.12.2010, 21:53
Да, это у мускула треды, попутал ;) (как заклинивает на мускуле, когда его видишь по 100 раз на дню :)). У постгреса мультипроцессная модель. Тем более процессы не могут не параллелиться по ядрам (треды еще как то могут быть привязаны к 1 ядру). Единственное объяснение может быть, что 1 запрос лочит другие намертво (что маловероятно).

Это у какого постгреса треды нативные? И откуда они взялись? ;-)

Ruslan Aliev
10.12.2010, 12:13
Да в общем-то вывод htop показывает что все потоки идут на одном ядре. Сейчас поставил pgbouncer , может решит проблему. Сижу, наблюдаю.
Странно, он может грузить ядра немного неравномерно, но чтоб 1 ядро 100% а остальные в 0 это что то непонятное. Сколько видел стандартных инсталлов постгреса такого не встречал.
Да возможно не совсем корректно отписал.

Конечно не 100% на одно ядро.
Но примерно 90% нагрузки приходится на одно ядро.

Это при том что постгресс изначально запускает несколько процессов (writer, autovakuum и т.п.) и они раскиданы по разным ядрам.

Клиент достаточно активно работает c постгрессом, идут как запросы на чтение так и на изменение/удаление/запись. При этом клиент сам может работать в несколько потоков.

На клиенте есть настройка, позволяющая всем потокам использовать одно соединение или открывать своё собственное. В любом случае все запросы отрабатываются на одном ядре.

Хотя само ядро может быть загружено на 10% но load_average может расти до 10.

Ruslan Aliev
10.12.2010, 12:17
Клиент использует одно ядро или сервер?
Клиент на отдельном сервере. Использует одно ядро. Но даже при запуске нескольких клиентов, постгрес всё отрабатывал на одном ядре.

Первым делом проверьте клиент. Сколько процессов постгрес запущен на сервере? Что за запросы выполняются? Как долго выполняются? Сколько сессий создаются?
Вопросов не мало, но чтобы ответить на ваш вопрос приходиться их задавать.

PostgreSQL используют схему один процесс - одна сессия. В рамках одной сессии используется только один процессор. Для выполнения одного сложного запроса используется один процессор (Oracle, SQL Server, DB2,...) могут распараллелить выполнение такого запроса на все процессора.
В большинстве случаях узкое место не процессор, а I/O, вполне может быть, что достаточно одного процессора. :-)


Количество процессов клиента можно свободно реглуировать. Но сейчас получается не более 8 потоков. Причём не важно, запускаю 4 процесса по 2 потока, или 1 в 8 потоков. Всё равно нагрузка идёт на одно ядро. Что удивительно конечно, так как по логике вещей, запросы от разных процессов должны отрабатываться на разных ядрах.

Но это уже не важно. Вопрос решился установкой pg_bouncer.
Утилита является прослойкой между клиентом и постгрессом. Сама контролирует количество соединений.

С её использованием нагрузка стала распределяться более равномерно, так что пока отказываться от неё не собираюсь.

Всем спасибо за то что откликнулись.

Kane
10.12.2010, 14:26
При низких загрузках проца LA растет если процессы ожидают IO (сеть/диск).

Хотя само ядро может быть загружено на 10% но load_average может расти до 10.

shumbola
10.12.2010, 19:36
С её использованием нагрузка стала распределяться более равномерно, так что пока отказываться от неё не собираюсь.

Всем спасибо за то что откликнулись.
И вам спасибо, но вы так и не разобрались с "проблемой". Вы так и не поняли что к чему, и через некоторое время этот вопрос еще всплывет.

И зачем вынесли это на паблик? :shok: