Настройка производительности сервера PostgreSQL

Есть сервер:
CPU: Intel(R) Xeon(TM) CPU 3.60GHz
real memory = 2147352576 (2047 MB)

В настоящий момент живёт с почти умолчательным конфигом:

max_connections = 40
shared_buffers = 28MB
max_fsm_pages = 179200
effective_cache_size = 512MB # По умолчанию было 128 и совсем грустно.
log_destination = 'syslog'
silent_mode = on
autovacuum = on
datestyle = 'iso, mdy'
lc_messages = 'C'
lc_monetary = 'C'
lc_numeric = 'C'
lc_time = 'C'

Для случая Мускула с MyISAM на моей задаче размер базы стабилизировался в районе 4.2 гига (для Postrges'а предполагаю что-нибудь в 1.5-2 раза бОльшее).
Производительность (при использовании шаблона my-huge.cnf) на наличном железе была достаточной.
С Postgers'ом при размере базы 2,5G - заметные тормоза. И заметно более интенсивный обмен данными с диском.

Главной причиной, по которой пришлось искать альтернативы Мускулу - табличная блокировка (запросы на зачистку базы выполняются достаточно долго).
Поэтому категорически желательно (и насколько я понял отсутствие блокировки таблиц при выполнении запросов INSERT/DELETE.

Разжёванный конфиг видел, но как/куда крутить реально используемый - пока не представляю.

Сам сейчас

Сам сейчас кручу запихивание как можно большего из БД в оперативку
Прокурил вот что: http://www.revsys.com/writings/postgresql-performance.html


Пожалуйста, не описывайте своё железо в подписи

=

krigstask написал(а):
Прокурил вот что: http://www.revsys.com/writings/postgresql-performance.html

Знакомая ссылка :)
Насколько я её курил - подходящего к моей задачем там не то, чтобы много и явно не компактно :(

--
Live free or die

В общем, как у

В общем, как у себя наковыряю что-нибудь для себя, так тут и отпишусь. Или в Яббер стукнись, если хочешь


Пожалуйста, не описывайте своё железо в подписи

shared_buffers = 28MB Не

shared_buffers = 28MB

Не маловато ли? В жеваном конфиге писано что потолок это 1/3 озу. А помогает при больших количествах соединений (это не про вас, бо 40), больших таблицах, "комплексных" запросах...

А вообще имхо, игрушки все это. Для сервера базы данных 80% выигрыша в производительности даeт правильная индексация таблиц и жесткая оптимизация запросов. К примеру замена or на and в условиях отбора (where) делает из 15 минутного запроса пятисекундный.

.

wi написал(а):
shared_buffers = 28MB

Не маловато ли? В жеваном конфиге писано что потолок это 1/3 озу. А помогает при больших количествах соединений (это не про вас, бо 40), больших таблицах, "комплексных" запросах...

В конфиге про этот параметр написано (если без купюр):

# - Memory -

shared_buffers = 28MB                   # min 128kB or max_connections*16kB
                                        # (change requires restart)

Менять пробовал. При изменении этого значения (даже банально до 32MB) сервер не стартует. Странно как-то... Надо будет разобраться.

wi написал(а):
А вообще имхо, игрушки все это. Для сервера базы данных 80% выигрыша в производительности даeт правильная индексация таблиц и жесткая оптимизация запросов. К примеру замена or на and в условиях отбора (where) делает из 15 минутного запроса пятисекундный.

Ты не забывай про поправку на область применимость "ИМХО" :)
И про то, что от конфигурации сервера таки зависит, и немало.

Но оптимизация самой базы - это основной путь в ситуации, когда база первична.
В ситуации же, когда база вторична (и нет особого желания лезть в неё ручками), например как у меня (SQL-backend для спам-фильтра) очень хочется обойтись оптимизацией сервера.

--
Live free or die

не забыли?

autovacuum = on                 # enable autovacuum subprocess?
                                # 'on' requires stats_start_collector
                                # and stats_row_level to also be on

лгн

Anarchist написал(а):
Менять пробовал. При изменении этого значения (даже банально до 32MB) сервер не стартует. Странно как-то... Надо будет разобраться.

Это ядрёный параметр меньше, чем shared_buffers. Подробнее тут:
http://www.postgresql.org/docs/current/static/kernel-resources.html

Это ещё что, я тут поднял shared_buffers до 128 Мб (всего у меня 1,5 Гб), так только замедлилось. Поднял до 512 Мб — ещё больше замедлилось (-%Е


Пожалуйста, не описывайте своё железо в подписи

.

krigstask написал(а):
Anarchist написал(а):
Менять пробовал. При изменении этого значения (даже банально до 32MB) сервер не стартует. Странно как-то... Надо будет разобраться.

Это ядрёный параметр меньше, чем shared_buffers. Подробнее тут:
http://www.postgresql.org/docs/current/static/kernel-resources.html

Thanks.
Только вот что: Мускул-то [почти совершенно] адекватно работал с тем же ядром.
Так что, думается мне, крутить надо что-то другое...

krigstask написал(а):
Это ещё что, я тут поднял shared_buffers до 128 Мб (всего у меня 1,5 Гб), так только замедлилось. Поднял до 512 Мб — ещё больше замедлилось (-%Е

Вывод: крутить надо что-то другое.

Там есть ещё такой интересный параметр, как work_mem (Specifies the amount of memory to be used by internal sort operations and hash tables before switching to temporary disk files. The value is specified in kilobytes, and defaults to 1024 kilobytes (1 MB). Note that for a complex query, several sort or hash operations might be running in parallel; each one will be allowed to use as much memory as this value specifies before it starts to put data into temporary files. Also, several running sessions could be doing such operations concurrently. So the total memory used could be many times the value of work_mem; it is necessary to keep this fact in mind when choosing the value. Sort operations are used for ORDER BY, DISTINCT, and merge joins. Hash tables are used in hash joins, hash-based aggregation, and hash-based processing of IN subqueries. ), попробуй покрутить его.

В имеющемся у меня примере конфига есть ещё пара буферов (значения не заданы):
temp_buffers ( Sets the maximum number of temporary buffers used by each database session. These are session-local buffers used only for access to temporary tables. The default is eight megabytes (8MB). The setting can be changed within individual sessions, but only up until the first use of temporary tables within a session; subsequent attempts to change the value will have no effect on that session.

A session will allocate temporary buffers as needed up to the limit given by temp_buffers. The cost of setting a large value in sessions that do not actually need a lot of temporary buffers is only a buffer descriptor, or about 64 bytes, per increment in temp_buffers. However if a buffer is actually used an additional 8192 bytes will be consumed for it (or in general, BLCKSZ bytes). )

wal_buffers (Number of disk-page buffers allocated in shared memory for WAL data. The default is 8. The setting need only be large enough to hold the amount of WAL data generated by one typical transaction.)

--
Live free or die

Quote: Только вот

Цитата:
Только вот что: Мускул-то [почти совершенно] адекватно работал с тем же ядром.
Так что, думается мне, крутить надо что-то другое...

Ну вот не факт. Схемы работы у Мускуля и Постгрескуля с памятью могут сильно различаться.

Цитата:
Вывод: крутить надо что-то другое

Я для начала попробую понять, за каким дьяволом она шуршит диском в два раза больше, если дать ей 512 метров оперативки (-:Е


Пожалуйста, не описывайте своё железо в подписи

Пока суть да

Пока суть да дело, первым шагом я решил реализовать возможность разнесения по разным физическим дискам собственно базы данных и журнала транзакций (не забыть посмотреть статистику: кто из них больше грузит диск):

Цитата:
3. Seperate the Transaction Log from the Database:
Assuming that you've already forked out the money for a decent-sized array, there are more intelligent options than throwing everything on a single RAID. For one thing, putting the database transaction log (pg_xlog) on its own, dedicated disk resource (an array or plain disk), makes as much as a 12% difference in performance on databases with high write activity. This is especially vital on small systems with slow SCSI or IDE disks: even in a two-disk server, you can put the transaction log onto the operating system disk and reap some benefits.

PostgreSQL 8.0 Performance Checklist

--
Live free or die

И как

И как результат?
Мне не особо поможет, к сожалению, у меня с чтением проблема


Пожалуйста, не описывайте своё железо в подписи

:(

krigstask написал(а):
И как результат?

Вряд ли смогу ответить на этот вопрос.
Ибо разнесение журнала и собственно базы по разным дискам запланировано в качестве одной из вспомогательных мер.

krigstask написал(а):
Мне не особо поможет, к сожалению, у меня с чтением проблема

Если преимущественно чтение, то почему не Мускул?

--
Live free or die

Ы

Anarchist написал(а):
krigstask написал(а):
Мне не особо поможет, к сожалению, у меня с чтением проблема

Если преимущественно чтение, то почему не Мускул?

Потому что далеко не только чтение. Это сейчас, на конкретном этапе разработке мы застряли на чтении. Пишет-то как раз хорошо, процессор с обработкой запросов не справляется, а в БД-то всё пишется.

Да и InnoDB всё равно понадобится, в MyISAM нету связей между таблицами типа REFERENCE, если я ничего не путаю, а она тоже не скоростная


Пожалуйста, не описывайте своё железо в подписи

По предварительным оценкам

По предварительным оценкам, пиковая интенсивность обмена данными с жёстким диском уменьшилась в среднем где-то на треть (в тяжёлых случаях - может четверть, в оптимистичном раскладе может превышать половину).

И по процессору процентов 20...

Только всё это - полумеры, как изначально и предполагалось... :(

--
Live free or die

Я тут два часа

Я тут два часа посидел на их IRC-канале... Много чего наслушался, но пока не выносил мысли никакой определённой. Но народ старался помочь, рекомендую и тебе попробовать.


Пожалуйста, не описывайте своё железо в подписи

.

krigstask написал(а):
Я тут два часа посидел на их IRC-канале...

Адресочек не подскажешь?

krigstask написал(а):
Много чего наслушался, но пока не выносил мысли никакой определённой.

Сие можно было предсказать заранее.
Потому и не стремлюсь пробовать этот вариант

krigstask написал(а):
Но народ старался помочь, рекомендую и тебе попробовать.

Я тут по ходу выяснил, что у меня затык скорее - в ограничении числа подключений к базе.
Поэтому сейчас я свалился на уровень ОС и системно-специфических фичей.
Разгребусь (попутно попробовав формализовать принцип определения необходимого числа подключений к базе), определюсь с достаточностью - и ждите меня снова :)

--
Live free or die

ß

Anarchist написал(а):
krigstask написал(а):
Я тут два часа посидел на их IRC-канале...

Адресочек не подскажешь?

irc://irc.freenode.net#postgresql , как ни странно (-:Е

Цитата:
Сие можно было предсказать заранее.
Потому и не стремлюсь пробовать этот вариант

А вот, кстати, я понял, что они до меня донести пытались
У меня вся БД не влезала в оперативку, а запрос требовал последовательного сканирования всей таблицы. То есть в кэше лежал хвост таблицы с прошлого запроса, а надо было начинать с самого начала каждый раз. Поэтому всё опять упиралось в скорость винта.

Цитата:
Я тут по ходу выяснил, что у меня затык скорее - в ограничении числа подключений к базе.

Ну это дело проправимое. max_connections там, pgpool наконец


Пожалуйста, не описывайте своё железо в подписи

ну...

krigstask написал(а):
Цитата:
Я тут по ходу выяснил, что у меня затык скорее - в ограничении числа подключений к базе.

Ну это дело проправимое. max_connections там, pgpool наконец

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

:(

evadim написал(а):
krigstask написал(а):
Ну это дело проправимое. max_connections там, pgpool наконец

не всегда

Почему? ИМХО вопрос в ресурсоёмкости и степени исправления.
Но дело скорее поправимое.

evadim написал(а):
в особо запущенных случаях нужно увеличивать колочество портов в системе и прочие штуки.

Да, есть такое. :(
Ну, на сколько необходимо увеличивать эти значения с учётом прочих сервисов - никто кроме меня не скажет.
Но есть ещё такой добрый вопрос: а чем чревато увеличение этих значений?

--
Live free or die

плохая привычка

ты расковырял предложение посередине, я имел в виду что если к базе потребуется 70 000 одновременных подключений то внутренние утилиты базы скорее всего не помогут.
я когда-то читал вот это:
http://www.tigase.org/en/linux-settings-guide

Мониторинг узких мест

По ходу разборок сформулировался следующий вопрос:
Где стоит ждать (искать) затыка и собственно алгоритм определения во что упираешься в данном конкретном примере на текущей итерации?

--
Live free or die

Ну как минимум

Ну как минимум есть EXPLAIN ANALYZE. Из того, что сразу приходит в голову.


Пожалуйста, не описывайте своё железо в подписи

Это - к

Это - к SQL-запросам.
Я же (по крайней мере на данном этапе) оптимизирую производительность сервера...

--
Live free or die

Это покажет, на

Это покажет, на чём затыкается конкретный запрос, что вполне может дать ключ к проблеме медленнодействия сервера (-:Е


Пожалуйста, не описывайте своё железо в подписи

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".