Назад | Перейти на главную страницу

Рекомендации по настройке PostgreSQL для большого сервера и набора данных

Я работаю с сервером PostgreSQL (8.1) на выделенной машине с 64 ГБ ОЗУ и быстрым RAID-диском. Сам по себе набор данных довольно велик - у нас есть несколько таблиц размером около 200 ГБ, еще больше в диапазоне от 50 до 100 ГБ, и он постоянно растет, при этом вакуумирование происходит за ночь, крупные операции выполняются ранним утром, а затем более мелкие операции над -спрос в течение дня.

В последнее время мы сталкиваемся с некоторыми проблемами производительности, например, когда вакуум не завершается вовремя до начала крупных операций, а затем начинает блокироваться до конца дня. Мы пытались настроить нашу конфигурацию, чтобы воспользоваться нашими ресурсами, но у нас возникли проблемы с некоторыми из более слабо определенных параметров, таких как work_mem. (Один эксперимент заключался в том, чтобы увеличить его до 512 МБ с max_connections, равным 150, что, как оказалось, вызывало некоторые проблемы.)

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

Изменить: я ответил на это в комментариях, но, чтобы сделать его официальным, мы находимся в процессе составления более долгосрочного плана, который будет включать в себя разделение, а также некоторые другие задачи по повторной архитектуре, но прямо сейчас мы пытаемся чтобы получить максимум от того, что у нас есть. Я ищу советы, которые больше похожи на «Параметр work_mem в 32 МБ, вероятно, будет служить вам достаточно хорошо, но вы, вероятно, не увидите значительных улучшений при превышении 64 МБ».

PostgreSQL 8.1 довольно старый, он достиг своего EOL-времени (см. Политика поддержки выпусков PostgreSQL). Я думаю, что более новые версии (например, 9.0) имеют лучшую производительность (особенно лучшую очистку), и, на мой взгляд, это первый шаг (конечно, postgresql.conf и, вероятно, настройки ядра / ulimit тоже важны).

В документации PostgreSQL есть разделение метод описан для таких больших (и постоянно растущих) таблиц. Это могло бы быть полезным решением.

из http://www.day32.com/MySQL/Meetup/Presentations/postgresql_partitioning_short.pdf

Разделение таблицы обычно имеет смысл только тогда, когда размер таблицы превышает физическую память.

Учитывая огромный объем данных и тот факт, что он постоянно растет, никакая настройка не будет достаточно хорошей в долгосрочной перспективе, если вы продолжите использовать только один сервер. Вам следует подумать о перемещении некоторых таблиц на другие серверы и о сегментировании, когда это возможно (чтобы сохранить масштабируемость). Некоторые из них могут даже уместиться в облачном сервисе (например, SimpleDB). В любом случае, я не знаю, может ли сегментирование или решение NoSQL соответствовать вашим потребностям, поскольку я не знаю ваших данных, но во многих случаях при хорошем дизайне это так. Временным решением может быть использование некоторых ведомых устройств чтения и / или фермы memcached, если у вас есть проблемы с производительностью во время дневного использования.