PostgreSQL 8.3: улучшение производительности в разы
Миграция одного из проектов (2GB OLTP база с 150 довольно сложных транзакций в секунду на среднем по производительности сервере), в которых мы принимаем участие, с PostgreSQL 8.2 на 8.3 принесла удивительные результаты: производительность системы улучшилась в разы. Судите сами: около 21:00 (см. самый большой пик на графике чтения/записи) был сделан дамп базы версии 8.2 и восстановление дампа в 8.3. Соответственно на всех графиках в левой части система работает на PostgreSQL 8.2, справа после 21:00 — PostgreSQL 8.3. Нагрузка на сервер баз данных в дневное время (приблизительно с 7:00 до 23:00) слева и справа одинакова — 130-150 TPS. Конфигурация PostgreSQL практически не менялась: custom-настройки старого postgresql.conf были перенесены в новый, остальные параметры остались без изменений. Ниже приведено описание каждой картинки.
Рис. 1. Объем чтения/записи на диск с $PGDATA в сек (с 5-минутным усреднением). Стоит отметить, что WAL вынесен на отдельное устройство и не участвует в формировании картины. Так как объем базы невелик и она укладывается в оперативную память (а именно в shared_buffers), чтение практически отсутствует. Объем записи в 8.2 на порядок превосходит объем записи в 8.3. Самые высокие пики записи справа и слева вызваны checkpoint-ами (контрольными точками). Вблизи 23:30 виден пик, связанный с ежесуточным backup-ом базы.



Причины улучшения производительности
- Читающие транзакции не приводят к проматыванию идентификатора транзакции (xid), соответственно отсутствует запись в pg_clog, которая раньше имела место быть даже при немодифицирующих запросах.
- Распределенные checkpoint-ы. PostgreSQL научился «размазывать» процесс синхронизации буферов с файлами данных на диске, более равномерно распределяя нагрузку на систему.
- Улучшенные seqscan-ы. Речь идет не только о Syncronized Scans, но еще и о том, что раньше seqscan по большой таблице, которая не лежит в shared_buffers, приводил к вытеснению «грязных» буферов из памяти и PostgreSQL вынужден был прямо сразу записывать их на диск (даже при простом немодифицирующем запросе). Начиная с версии 8.3 существует специальный буфер фиксированного размера для последовательных просмотров и PostgreSQL читает данные с диска в него, не вытесняя при этом существенные порции «грязных» данных на диск, как это было раньше.
Результаты
Существенно более гладкое распределение нагрузки на подсистему ввода-вывода и, как следствие, общей нагрузки на сервер c СУБД PostgreSQL; снижение общей загруженности сервера в 2-3 раза. Рекомендуем запланировать миграцию на PostgreSQL 8.3 всех инсталляций PostgreSQL младших версий с повышенной нагрузкой на подсистему ввода-вывода.