День добрый.
Есть определенная проблема.
Сервер: 2х4 ксеона, рэйд 3 зеркала, диски сата
OS: SuSE 10.2 Ent Server
Postgres: "PostgreSQL 8.3.3 on i686-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.1.1" (от 1С 8.1 patch)
Linux'овый 1С 8.1.13 (Конфигурация не стандартная) на этом же сервере
Настраивал как обычно сервер. Параметры памяти в конфиге крутил. Вообщем в обычном режиме работы база крутиться хорошо. Но предприятие занимается молочной продукцией, и у них есть партионный учёт. И когда они запускают групповую обработку документов, то всё происходит медленее чем было при MS SQL 2005. При этом и сервер приложений 1с 8.1 и postgres ложатся на один виртуальный проц.
Вопрос:
1)Можно ли заставить postgreSQL использовать для обработки определённый физический или виртуальный процессор?
2)Как определить узкое место при обработке?
Включил log_min_duration_statement = 0 - как мне теперь проанализировать данные?
3)Есть ли смысл включать enable_bitmapscan, или выключать fsync?
Выключать fsync
Выключать fsync не советую - целостность данных всё-таки должна быть на 1-м месте.
Надо смотреть какие запросы загружают сервер, смотреть план этих запросов и анализировать их на предмет создания необходимых индексов.
Насколько мне известно, PostgreSQL в распределении нагрузки полагается на операционную систему и такми образом указать какие-то отдельные процессоры не получится.
Далее вопросы: сколько оперативки? какой у вас рейд? На скольки дисках?
Используете ли вы отдельные диски для WAL или и сама база и WAL у вас на одном логическом диске?
Включен ли вообще WAL, оптимальны ли его настройки?
По поводу памяти - что крутили и даёт ли это кручение какой-либо эффект?
Далее советую ещё посмотреть в настройках ОС такие параметры ядра как
vm.dirty_background_ratio
vm.dirty_ratio
Параметры
1csrv:/data/pgsql/data # cat /proc/sys/vm/dirty_ratio
16
1csrv:/data/pgsql/data # cat /proc/sys/vm/dirty_background_ratio
4
4Гб оперативки.
1csrv:/data/pgsql/data # cat /proc/meminfo
MemTotal: 8309724 kB
MemFree: 1014064 kB
Buffers: 39076 kB
Cached: 6817684 kB
SwapCached: 0 kB
Active: 3086112 kB
Inactive: 4062192 kB
HighTotal: 7470336 kB
HighFree: 760280 kB
LowTotal: 839388 kB
LowFree: 253784 kB
SwapTotal: 8393920 kB
SwapFree: 8393788 kB
Dirty: 1024 kB
Writeback: 0 kB
AnonPages: 288460 kB
Mapped: 250408 kB
Slab: 123032 kB
CommitLimit: 12548780 kB
Committed_AS: 2772500 kB
PageTables: 3592 kB
VmallocTotal: 112632 kB
VmallocUsed: 17560 kB
VmallocChunk: 92512 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
Процессоры два - 4-х ядерника:
1csrv:/var/lib/pgsql/data # cat /proc/cpuinfo processor
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
stepping : 10
cpu MHz : 2333.601
cache size : 6144 KB
Рейд - два зеркала - диски сата.
База на отдельном логическом диске.
Все настройки стандартные для патченного постгреса от 1с. Кроме:
shared_buffers = 2GB
work_mem = 1024MB
#самая большая таблица 1598Мб
maintenance_work_mem = 1100MB
synchronous_commit = off
effective_cache_size = 2048MB
checkpoint_segments = 32
Вот долгая операция, если я всё правильно понял:
Какие будут идеи?
Попробуйте
Попробуйте поставить:
dirty_ratio = 60
dirty_background_ratio = 20
может станет чуть получше.
Идея одна - выполняйте на запрос EXPLAIN и смотрите план запроса.
autovacuum включён? проверьте на всякий случай как поведёт себя запрос при ручном выполнении VACUUM на используемые в запросе таблицы.
Чуть лучше
Да чуть лучше стало, если документ проводился 20 секунд, то сейчас 18...
План запроса
Вот такой вот план запроса
Что с VACUUM?
Что с VACUUM?
и с WAL?
on
Он же по умолчанию включен...
autovacuum = on
А какие должны быть параметры
enable_bitmapscan =
enable_hashagg =
enable_hashjoin =
enable_indexscan =
enable_mergejoin =
enable_nestloop =
enable_seqscan =
enable_sort =
enable_tidscan =
Они по умочанию выключены? Может попробывать включить GEQO?
Проверьте РАБОТАЕТ ли
Проверьте РАБОТАЕТ ли он?
Выполните VACUUM на таблицы, использованные в запросе и запустите запрос снова.
Что с WAL?
Сделал вакуум над таблицами
Сделал вакуум над таблицами вручную, повторил запрос. По времени выполняется так же...
Сколько записей в
Сколько записей в таблице?
Что-то из плана запроса не пойму, если индекс на поле
_Document431_Q_000_T_001._Date_Time?
Если да, можно попробовать ещё создать составной индекс на поля
_Document431_Q_000_T_001._Date_Time и _Document431_Q_000_T_001._IDRRef
WAL
WAL включен, логи делаются на другой логический диск без базы.