@Destinety

Что можно изменить в настройках?

Здравствуйте. Сначала покажу конфиг PostgreSQL
autovacuum= on
autovacuum_analyze_scale_factor = 0.01
autovacuum_analyze_threshold = 5
autovacuum_freeze_max_age = 200000000
autovacuum_max_workers = 3
autovacuum_multixact_freeze_max_age = 400000000
autovacuum_naptime = 1s
autovacuum_vacuum_cost_delay = 5ms
autovacuum_vacuum_cost_limit = -1
autovacuum_vacuum_scale_factor = 0.01
autovacuum_vacuum_threshold = 50
autovacuum_work_mem = 400MB
bgwriter_delay = 10ms
bgwriter_flush_after = 512kB
bgwriter_lru_maxpages = 1000
bgwriter_lru_multiplier = 10
checkpoint_completion_target = 0.9
checkpoint_flush_after = 256kB
checkpoint_timeout = 30min
checkpoint_warning = 30s
default_statistics_target = 100
effective_cache_size = 7GB
effective_io_concurrency = 200
maintenance_work_mem = 1GB
max_connections = 1000
max_logical_replication_workers = 4
max_parallel_maintenance_workers = 2
max_parallel_workers = 8
max_parallel_workers_per_gather = 2
max_wal_size = 16GB
max_worker_processes = 128
min_wal_size = 1GB
random_page_cost = 1.1
shared_buffers = 4GB
vacuum_cleanup_index_scale_factor = 0.1
vacuum_cost_delay = 0
vacuum_cost_limit = 2000
vacuum_cost_page_dirty = 5
vacuum_cost_page_hit = 0
vacuum_cost_page_miss = 5
vacuum_defer_cleanup_age = 0
vacuum_freeze_min_age = 50000000
vacuum_freeze_table_age = 150000000
vacuum_multixact_freeze_min_age = 5000000
vacuum_multixact_freeze_table_age = 150000000
wal_block_size = 8192
wal_buffers = 16MB

VM (не железный сервер):
RAM = 20 GB
CPU = 8
SSD


Суть проблемы такова. Есть несколько приложений, которые работают с базой. Суммарно в среднем держится 50-60 транзакций в секунду с периодическими скачками до 150-200. Одно из приложений активно изменяет данные в таблицах. В секунду в среднем производя вставку 400-700 новых записей, обновляя - 100-300, удаляя - 400-700.
Приложение считает и работает со счетчиками от 1 минуты до 1 года сроком жизни, поэтому такие цифры.

Сначала, когда в первый раз начались проблемы, то был полностью перенастроен автовакуум. Для особо активно изменяющихся таблиц были выставлены настройки вручную - 'autovacuum_vacuum_scale_factor = 0, autovacuum_vacuum_threshold = 10000'. Таким образом автовакуум проходит намного быстрее и дает меньшую нагрузку.
Но проблема все равно остается, т.к. даже при таких настройках автовакуум длится от 20 до 40 секунд, если он запустился только на одной из таблиц, а если вдруг совпал запуск на 2-3, то время растягивается на 2-3 минуты, и, соответственно, дико вырастает нагрузка и на базу, и на систему, из-за чего начинают подвисать запросы от приложений.

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

Может быть кто из вас может подсказать, что можно изменить и перенастроить, чтобы ни автовакуум, ни что-то еще не замедляло работу базы, не нагружало ее и систему, чтобы не провоцировать деградацию работы приложений?
  • Вопрос задан
  • 223 просмотра
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Мониторьте во что именно вы упираетесь.
Предположу что в диск. Такой cost_limit на такой cost_delay - это надо очень хорошие диски. И если вы думаете, что "SSD" - это хороший диск - то мне придётся вас огорчить. SSD бывают очень-очень разными.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
делайте уборку вручную во время низких нагрузок на базу
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы