Всем привет. Я надеюсь призвать в этот тред богов постгреса, которые подскажут мне секреты его тюнинга.
Итак, есть сервер, который будет обслуживать чисто каталог bacula (который на mysql с innodb занимал 120Гб, из которых 95Гб было в одной таблице), на postgresql.
В сервере установлен не слабый CPU:
Intel(R) Core(TM) i7-3820 CPU @ 3.60GHz
1 package(s) x 4 core(s) x 2 SMT threads
и 64Gb RAM
Требования у bacula таковы:
- очень сложные многоэтажные селекты, для примера:
SELECT Path.Path, Filename.Name, T1.FileIndex, T1.JobId, LStat, DeltaSeq FROM ( SELECT FileId, Job.JobId AS JobId, FileIndex, File.PathId AS PathId, File.FilenameId AS FilenameId, LStat , File.DeltaSeq AS DeltaSeq, Job.JobTDate AS JobTDate FROM Job, File, ( SELECT MAX(JobTDate) AS JobTDate, PathId, FilenameId, DeltaSeq FROM ( SELECT JobTDate, PathId, FilenameId, DeltaSeq FROM File JOIN Job USING (JobId) WHERE File.JobId IN(3401,3532,3614,3694,3774,3858,4048,4127,4215,4297,4377,4568,4652,4751,4833) UNION ALL SELECT JobTDate, PathId, FilenameId, DeltaSeq FROM BaseFiles JOIN File USING (FileId) JOIN Job ON (BaseJobId = Job.JobId) WHERE BaseFiles.JobId IN(3401,3532,3614,3694,3774,3858,4048,4127,4215,4297,4377,4568,4652,4751,4833) ) AS tmp GROUP BY PathId, FilenameId, DeltaSeq ) AS T1 WHERE (Job.JobId IN ( SELECT DISTINCT BaseJobId FROM BaseFiles WHERE JobId IN (3401,3532,3614,3694,3774,3858,4048,4127,4215,4297,4377,4568,4652,4751,4833)) OR Job.JobId IN(3401,3532,3614,3694,3774,3858,4048,4127,4215,4297,4377,4568,4652,4751,4833)) AND T1.JobTDate = Job.JobTDate AND Job.JobId = File.JobId AND T1.PathId = File.PathId AND T1.FilenameId = File.FilenameId ) AS T1 JOIN Filename ON (Filename.FilenameId = T1.FilenameId) JOIN Path ON (Path.PathId = T1.PathId) WHERE FileIndex > 0 ORDER BY T1.JobTDate, FileIndex ASC
- ну и многочисленные параллельные insert-ы во время выполнения ежесуточного бекапа большого количества файлов;
Интересует, как бы оптимальнее настроить postgres для такой вот единственной базы? Пока остановился на следующем:
max_connections = 150 # в bacula director стоит max concurrent 150
shared_buffers = 15GB
temp_buffers = 8GB
wal_buffers = 16MB
work_mem = 512MB
maintenance_work_mem = 1GB
effective_cache_size = 42GB
fsync = off
synchronous_commit = off
wal_sync_method = fsync
random_page_cost = 2.0
cpu_tuple_cost = 0.001
cpu_index_tuple_cost = 0.0005
track_counts = on
update_process_title = off
autovacuum = on
autovacuum_vacuum_threshold = 5000
autovacuum_analyze_threshold = 2500
default_statistics_target = 50
constraint_exclusion = on
checkpoint_segments = 16
Что в этом конфиге кажется вам диким? Или просто неоптимальным? Подскажите, т.к не имею большого опыта в настройке Постгреса. Версия PG: postgresql-server-9.2.1
Все это стоит на FreeBSD, там установил вот что:
kern.ipc.shm_use_phys=1
kern.ipc.semmni=256
kern.ipc.semmns=1024
kern.ipc.somaxconn=4096
kern.ipc.shmmax=17179869184
kern.ipc.shmall=15395266600
kern.maxfiles=256000
kern.maxfilesperproc=240000
kern.maxvnodes=500000
kern.threads.max_threads_per_proc=4096
vm.pmap.shpgperproc=4900
vm.pmap.pv_entry_max=32000000
Опять же, может с чем переборщил, или забыл что важное? Скорректируйте с высоты вашего опыта =) Буду благодарен любым замечаниям.