Улучшение производительности Postgres и контрольный список

Я изучаю ряд вопросов, связанных с производительностью моего приложения, написанного на Java, который имеет около 100 000 обращений в день, и в среднем на каждое посещение приходится от 5 до 10 чтений / записей по двум основным таблицам базы данных (разделенных поровну), мощность которых равна для обеих от 1 до 3 миллионов записей (я доступ к базе данных через спящий режим).

В двух моих основных таблицах хранится пользовательская информация (около 60 столбцов типа varchar, integer и timestamptz), а другая связана с отображаемыми данными (здесь около 30 столбцов, в основном varchar, integer, timestamptz).

Основной проблемой, с которой я столкнулся, могло быть падение производительности моего сайта (давайте поговорим о временных нагрузках более 5 секунд, которые, очевидно , не зависят только от производительности базы данных), это использование FillFactor, которое в настоящее время является значением по умолчанию 100 (что он используется всегда, когда данные не меняются..).

Очевидно, что коэффициент заполнения одинаков по индексу (есть 10 для каждых 2 таблиц типа btree)

В настоящее время на моих основных столах я делаю

  • 40% выбирают операции
  • 30% операций обновления
  • 20% операций вставки
  • 10% удаление операций.

Моя база данных также состоит из 40 других таблиц второстепенной важности (есть только три другие с таким же количеством пользователей).

Мои вопросы:

  • Как вы находите правильное значение коэффициента заполнения, который будет установлен?
  • Что может быть контрольным списком задач, которые нужно проверить, чтобы улучшить производительность базы данных такого рода?

База данных находится на выделенном сервере (16 ГБ ОЗУ, 8 ядер), а хранилище - на SSD-диске (данные резервируются все дни и перемещаются в другое хранилище).

1 ответ

Вероятно, вы достигли "колена" использования памяти, когда весь индекс интенсивно используемых таблиц больше не помещается в разделяемую память, поэтому дисковый ввод-вывод замедляет его. Подтвердите, проверив, является ли дисковый ввод-вывод выше, чем обычно. Если это так, попробуйте увеличить разделяемую память (shared_buffers) или, если она уже максимальна, отрегулируйте размер разделяемой памяти системы или добавьте больше системной памяти, чтобы вы могли увеличить ее. Возможно, вам также придется начать настройку временных буферов, рабочей памяти и памяти обслуживания, а также параметров WAL, таких как checkpoint_segments и т. Д.

На PostgreSQL.org есть несколько советов по настройке, и Google - ваш друг.

Изменить: (чтобы обратиться к первому комментарию) Первый признак нехватки памяти - это значительное падение производительности, все остальное остается прежним. Изменение коэффициента заполнения таблицы не будет иметь значения, если вы столкнетесь с коленом в использовании памяти, если что-то ухудшит время загрузки (что, я полагаю, означает "чтение БД"), потому что информация о строке будет расширяться по нескольким страницам. на диске с пустым пространством на каждой странице, поэтому для сканирования таблицы требуется больше дискового ввода-вывода. Но коэффициент заполнения менее 100% может помочь с операциями UPDATE, но я обнаружил, что настройка параметров WAL может компенсировать большую часть времени при использовании индексов (если вы их уже не оптимизировали). В итоге, вам нужно профилировать все тяжелые запросы, используя EXPLAIN, чтобы увидеть, что поможет. Но на первый взгляд, я уверен, что это проблема с памятью даже при наличии базы данных на SSD. Мы говорим о множестве случайных чтений и случайных записей, и многие SSD на самом деле становятся хуже, чем HDD после большого количества случайных небольших записей.

Другие вопросы по тегам