Мы запускаем Postgres 9.1.3, и мы недавно начали сталкиваться с серьезными проблемами производительности на одном из наших серверов.
Наши запросы немного прекратились, но по состоянию на 1 августа они резко замедлились. Похоже, что большинство проблемных запросов - это запросы на выбор (запросы с count (*) особенно плохие), но в целом база данных работает очень медленно.
Мы выполнили этот запрос на сервере, и это были изменения, внесенные нами в файл конфигурации по умолчанию (Примечание: сервер работал с этими изменениями раньше, поэтому, они, вероятно, не имеют большого значения):
name | current_setting
---------------------------+---------------------------------------------------------------------------------------------------------------
version | PostgreSQL 9.1.2 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51), 64-bit
autovacuum | off
bgwriter_delay | 20ms
checkpoint_segments | 6
checkpoint_warning | 0
client_encoding | UTF8
default_statistics_target | 1000
effective_cache_size | 4778MB
effective_io_concurrency | 2
fsync | off
full_page_writes | off
lc_collate | en_US.UTF-8
lc_ctype | en_US.UTF-8
listen_addresses | *
maintenance_work_mem | 1GB
max_connections | 100
max_stack_depth | 2MB
port | 5432
random_page_cost | 2
server_encoding | UTF8
shared_buffers | 1792MB
synchronous_commit | off
temp_buffers | 16MB
TimeZone | US/Eastern
wal_buffers | 16MB
wal_level | minimal
wal_writer_delay | 10ms
work_mem | 16MB
(28 rows)
Time: 210.231 ms
Обычно, когда возникают подобные проблемы, первое, что люди рекомендуют, - это пылесосить, и мы это пробовали. Мы вакуумировали большую часть базы данных, но это не помогло.
Мы использовали Explain
по некоторым нашим запросам и заметили, что Postgres прибегает к последовательным сканированиям, даже если таблицы имеют индексы.
Мы отключили последовательное сканирование, чтобы заставить планировщик запросов использовать индексы, но это тоже не помогло.
Затем мы опробовали этот запрос, чтобы узнать, было ли у нас много неиспользуемого дискового пространства, которое проходил Postgres, чтобы найти то, что он ищет. К сожалению, хотя некоторые из наших таблиц имели немного объема, это не показалось достаточно значительным, чтобы замедлить общую производительность системы.
Мы считаем, что замедление может быть связано с I/O, но мы не можем понять специфику. Является ли Postgres просто глупым, и если да, то какая его часть? Что-то не так с VM, или что-то не так с самим физическим оборудованием?
Есть ли у вас другие предложения для вещей, которые мы можем попробовать или проверить?
EDIT:
Мне очень жаль, что раньше не обновлял. Я попался в другое дело.
На этой конкретной машине наша производительность значительно улучшилась, сделав небольшую модификацию настроек виртуальной машины.
Существует настройка, связанная с кэшированием IO. Первоначально он был установлен в положение ON. Мы полагали, что постоянное кеширование вещей замедляет процесс, и мы были правы. Мы отключили его, и ситуация резко улучшилась.
Интересно, что большинство наших других серверов уже отключили эту настройку.
Есть и другие проблемы, и я уверен, что мы возьмем много ваших предложений, поэтому большое спасибо за помощь.