В данном анализе исследуется влияние параметра ядра Linux vm.vfs_cache_pressure на производительность дисковой подсистемы под аналитической (OLAP) нагрузкой PostgreSQL. На основе данных нагрузочного тестирования сравнивается три значения параметра (50, 100, 150) с целью выявления оптимальной настройки для сценариев работы с большими объемами данных.
Глоссарий терминов | Postgres DBA | Дзен
Часть 1 - Общая постановка исследования и результаты производительности СУБД и инфраструктуры.
Часть 2 - Анализ паттернов производительности инфраструктуры
Часть 3 - Анализ производительности подсистемы IO для файловой системы /data
Задача
Проанализировать параметра vm.vfs_cache_pressure на производительность подсистемы IO для дискового устройства, используемого файловой системой /data.
Входные данные для анализа
Сводный отчета по нагрузочному тестированию подготовленный pg_pexpecto по окончании нагрузочного тестирования:
- Метрики iostat для дискового устройства vdd
Анализ корреляций и типа нагрузки
vm.vfs_cache_pressure = 100
- Корреляция скорость–IOPS: слабая (0,4128).
- Корреляция скорость–MB/s: очень высокая (0,8191).
- Тип нагрузки: аналитическая/ETL, так как наблюдается высокая зависимость от пропускной способности диска, а не от IOPS.
Ограничивающий фактор: пропускная способность диска (MB/s).
Дополнительные наблюдения:
- Утилизация диска стабильно высокая (89–94%).
- Задержки чтения/записи умеренные (9–14 мс).
- Нагрузка на CPU в режиме ожидания I/O (wa) составляет 18–29%.
vm.vfs_cache_pressure = 50
- Корреляция скорость–IOPS: отрицательная (-0,2879).
- Корреляция скорость–MB/s: очень высокая (0,8017).
- Тип нагрузки: аналитическая/ETL с выраженной зависимостью от пропускной способности диска.
Ограничивающий фактор: пропускная способность диска (MB/s).
Дополнительные наблюдения:
- Утилизация диска близка к максимальной (95–96%).
- Задержки чтения растут со временем (до 16 мс).
- Отрицательная корреляция с IOPS указывает на возможные проблемы с CPU, блокировками или памятью.
- Нагрузка на CPU в режиме ожидания I/O (wa) достигает 31%.
vm.vfs_cache_pressure = 150
- Корреляция скорость–IOPS: слабая (0,5930).
- Корреляция скорость–MB/s: очень высокая (0,9735).
- Тип нагрузки: аналитическая/ETL с сильной зависимостью от пропускной способности диска.
Ограничивающий фактор: пропускная способность диска (MB/s).
Дополнительные наблюдения:
- Утилизация диска стабильно высокая (89–95%).
- Задержки чтения/записи низкие (6–11 мс).
- Нагрузка на CPU в режиме ожидания I/O (wa) снижается к концу теста (до 16%).
Сводные выводы
1. Все три эксперимента показывают схожую картину:
- Производительность ограничена пропускной способностью диска (MB/s), а не IOPS.
- Нагрузка носит аналитический/ETL-характер (последовательное чтение/запись больших объёмов данных).
2. Влияние vm.vfs_cache_pressure:
- Изменение параметра не оказало значительного влияния на тип нагрузки и ограничивающий фактор.
- Наилучшие показатели задержек и утилизации CPU наблюдаются при значении 150.
3. Рекомендации:
- Увеличить пропускную способность дисковой подсистемы .
- Настроить параметры PostgreSQL для аналитических нагрузок (work_mem, maintenance_work_mem, effective_io_concurrency).
- Рассмотреть использование партиционирования таблиц и параллельного выполнения запросов.
Сравнение метрик диска
Средние значения метрик по экспериментам:
vm.vfs_cache_pressure = 50:
- utilization: 95,1%
- r_await: 13,8 мс
- w_await: 6,6 мс
- IOPS: 3 490
- MB/s: 116,1
- aqu_sz: 43,8
- cpu_wa: 27,3%
vm.vfs_cache_pressure = 100:
- utilization: 92,7%
- r_await: 12,5 мс
- w_await: 7,0 мс
- IOPS: 3 513
- MB/s: 129,6
- aqu_sz: 40,5
- cpu_wa: 25,4%
vm.vfs_cache_pressure = 150:
- utilization: 92,7%
- r_await: 9,8 мс
- w_await: 7,3 мс
- IOPS: 3 570
- MB/s: 137,5
- aqu_sz: 33,5
- cpu_wa: 23,6%
Анализ влияния vfs_cache_pressure:
- Задержки и утилизация диска:
- r_await последовательно снижается с ростом параметра: 13,8 мс (50) → 12,5 мс (100) → 9,8 мс (150)
- w_await незначительно увеличивается: 6,6 мс (50) → 7,0 мс (100) → 7,3 мс (150)
- Утилизация диска максимальна при значении 50 (95,1%), при 100 и 150 стабилизируется на уровне 92,7%
- Наилучшие показатели задержек чтения достигаются при максимальном значении 150
- Связь с пропускной способностью и IOPS:
- Пропускная способность (MB/s) монотонно растёт: 116,1 (50) → 129,6 (100) → 137,5 (150)
- IOPS также увеличивается: 3 490 (50) → 3 513 (100) → 3 570 (150)
- Наблюдается чёткая тенденция: чем выше vfs_cache_pressure, тем выше производительность по пропускной способности
- Поведение очереди запросов (aqu_sz):
- Длина очереди последовательно уменьшается: 43,8 (50) → 40,5 (100) → 33,5 (150)
- Это свидетельствует о более эффективной обработке запросов при высоких значениях параметра
- Уменьшение очереди коррелирует со снижением времени ожидания CPU (cpu_wa)
Ключевые выводы:
Увеличение vfs_cache_pressure до 150 даёт наиболее сбалансированные результаты:
- Наименьшие задержки чтения (9,8 мс против 13,8 мс при 50)
- Наибольшая пропускная способность (137,5 MB/s против 116,1 при 50)
- Самая короткая очередь запросов (33,5 против 43,8 при 50)
- Наименьшая нагрузка на CPU в режиме ожидания (23,6% против 27,3% при 50)
Параметр vfs_cache_pressure оказывает существенное влияние на производительность дисковой подсистемы:
- Более высокие значения способствуют более агрессивному освобождению кэша
- Это снижает contention за память и уменьшает задержки
- Однако может незначительно увеличить задержки записи
Для данной аналитической нагрузки оптимальным является значение 150, которое обеспечивает лучшую пропускную способность при меньших задержках и нагрузке на систему.
Оценка влияния параметра на производительность под OLAP-нагрузкой
1. Влияние vm.vfs_cache_pressure на производительность при аналитической нагрузке
- Прямое влияние на задержки чтения: увеличение параметра с 50 до 150 снижает среднее время отклика чтения (r_await) на 29% (с 13,8 до 9,8 мс)
- Улучшение пропускной способности: наблюдается рост MB/s на 18% (со 116,1 до 137,5 МБ/с) при увеличении параметра
- Оптимизация использования очереди: длина очереди запросов (aqu_sz) сокращается на 24% (с 43,8 до 33,5)
- Снижение нагрузки на CPU: время ожидания ввода-вывода процессором (cpu_wa) уменьшается на 14% (с 27,3% до 23,6%)
- Стабилизация утилизации диска: при высоких значениях параметра утилизация стабилизируется на уровне 92,7% против пиковых 95,1% при низком значении
2. Оптимальное значение параметра для различных аспектов производительности
- Для максимальной пропускной способности (MB/s): значение 150 (137,5 МБ/с против 116,1 при 50)
- Для минимальных задержек чтения (r_await): значение 150 (9,8 мс против 13,8 при 50)
- Для баланса задержек чтения/записи: значение 100 (12,5 мс чтение, 7,0 мс запись)
- Для эффективной утилизации ресурсов: значение 150 (низкая очередь, стабильная утилизация диска, меньшая нагрузка на CPU)
- Для избежания перегрузки диска: значение 150 (утилизация 92,7% против 95,1% при 50)
3. Рекомендации по настройке для систем с аналогичной конфигурацией
- Базовое рекомендованное значение: установить vm.vfs_cache_pressure = 150
- Наиболее сбалансированная производительность для OLAP-нагрузок
- Максимальная пропускная способность при минимальных задержках чтения
- Эффективное управление кэшем файловой системы
- Архитектурные особенности для учёта:
- 8 CPU ядер позволяют эффективно обрабатывать параллельные операции ввода-вывода
- Отдельный диск для данных (vdd) минимизирует contention с другими компонентами
- Аналитическая нагрузка PostgreSQL характеризуется последовательным доступом к большим объёмам данных
- Дополнительные рекомендации:
- Мониторинг использования оперативной памяти при изменении параметра
- Тестирование на пиковых нагрузках для подтверждения стабильности
- Учёт общего объёма RAM (8 ГБ) при настройке кэширования
- Альтернативные сценарии настройки:
- При смешанной нагрузке (OLTP+OLAP) можно рассмотреть значение 100 как компромиссное
- При ограничениях по оперативной памяти допустимо значение 50, но с ожиданием более высоких задержек
- Для систем с большим объёмом RAM (16+ ГБ) можно экспериментировать с более высокими значениями (200-500)
Итоговый вывод
Для аналитической нагрузки PostgreSQL на конфигурации с 8 CPU и отдельным диском данных оптимальным является значение vm.vfs_cache_pressure = 150, обеспечивающее наилучший баланс пропускной способности, задержек и эффективности использования ресурсов.
Послесловие
Таким образом, для конфигураций, аналогичных тестовой (8 CPU, отдельный диск данных, аналитическая нагрузка PostgreSQL), значение vm.vfs_cache_pressure = 150 признано оптимальным. Оно обеспечивает максимальную пропускную способность, минимальные задержки чтения и более эффективное использование ресурсов CPU и диска по сравнению со значениями 50 и 100. Данная настройка рекомендуется к применению в продуктивной среде для подобных рабочих нагрузо