Найти в Дзене
Postgres DBA

(прогноз подтвержден)PG_EXPECTO : Оптимизация подсистемы IO. Рекомендации по изменению параметров ОС.

Высокая нагрузка на дисковую подсистему — частое «бутылочное горло», способный затормозить работу даже самого мощного сервера. Когда мониторинг показывает 100% утилизацию диска, растущие задержки и очередь из процессов, ожидающих IO, стандартных настроек ОС уже недостаточно. Эта статья — не теория, а готовый план как по конкретным симптомам (OLAP-нагрузка, неэффективный кэш, блокировки) выявить корень проблемы и применить целенаправленные правки: от выбора IO-планировщика и настройки виртуальной памяти до оптимизации файловой системы. Каждое изменение объяснено, обосновано и снабжено конкретной командой. Следуя этому руководству, вы системно оптимизируете производительность IO, переводя подсистему из состояния «выживания» в режим эффективной работы. GitHub - Комплекс pg_expecto для статистического анализа производительности и нагрузочного тестирования СУБД PostgreSQL Глоссарий терминов | Postgres DBA | Дзен Сформировать список изменений параметров ОС для оптимизации производительности
Оглавление
PG_EXPECTO: Когда каждый параметр на счету. Тонкая настройка IO — максимальная производительность.
PG_EXPECTO: Когда каждый параметр на счету. Тонкая настройка IO — максимальная производительность.

От диагностики к действию

Высокая нагрузка на дисковую подсистему — частое «бутылочное горло», способный затормозить работу даже самого мощного сервера. Когда мониторинг показывает 100% утилизацию диска, растущие задержки и очередь из процессов, ожидающих IO, стандартных настроек ОС уже недостаточно.

Эта статья — не теория, а готовый план как по конкретным симптомам (OLAP-нагрузка, неэффективный кэш, блокировки) выявить корень проблемы и применить целенаправленные правки: от выбора IO-планировщика и настройки виртуальной памяти до оптимизации файловой системы. Каждое изменение объяснено, обосновано и снабжено конкретной командой. Следуя этому руководству, вы системно оптимизируете производительность IO, переводя подсистему из состояния «выживания» в режим эффективной работы.

GitHub - Комплекс pg_expecto для статистического анализа производительности и нагрузочного тестирования СУБД PostgreSQL

Глоссарий терминов | Postgres DBA | Дзен

Эксперимент-1: Базовые показатели IO

Задача

Сформировать список изменений параметров ОС для оптимизации производительности IO.

Промпт

Используя данные о результатах производительности системы IO,
необходимо подготовить список изменений параметров операционной системы для оптимизации производительности подсистемы IO:
**Общее описание оптимизируемых параметров и ожидаемый эффект**
**Оптимизация параметров IO**
- Получение текущего значения параметра
- Изменение значения параметра
- Основание для изменения
- Ожидаемый эффект от изменения
**Итог**

Тюнинг параметров ОС

На основе анализа предоставленных данных о производительности IO-подсистемы выявлены следующие проблемы:

  1. Высокая загрузка диска vdd (100% utilization).
  2. Высокая корреляция между использованием кэша памяти и операциями чтения/записи, что указывает на недостаточную эффективность кэширования.
  3. Большое количество процессов в состоянии ожидания IO (uninterruptible sleep), превышающее количество ядер CPU.
  4. Высокое отношение операций чтения к записи (OLAP-сценарий).
  5. ⚠️Низкая корреляция между операционной скоростью и IOPS/MB/s, что говорит о том, что узкое место — не в дисках, а в других подсистемах (CPU, блокировки, параметры СУБД).

☑️ Эксперимент-2: Общие параметры производительности

Параметр: vm.dirty_ratio, vm.dirty_background_ratio

  • Текущее значение:

sysctl vm.dirty_ratio

sysctl vm.dirty_background_ratio

  • Изменение:

sysctl -w vm.dirty_ratio=10

sysctl -w vm.dirty_background_ratio=5

  • Основание: Снижает объем «грязных» страниц в памяти перед записью на диск, уменьшая пиковую нагрузку на IO.
  • Ожидаемый эффект: Более равномерная запись, снижение пикового времени ожидания записи.

️Общие параметры производительности - эксперимент

Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-1(SPEED-1) и Эксперимента-2(SPEED-2)
Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-1(SPEED-1) и Эксперимента-2(SPEED-2)

Среднее увеличение операционной скорости в ходе Эсперимента-2 по сравнению с Экпериментом-1 составило 10.27%.⬆️

☑️Эксперимент-3: Параметры IO-планировщика

Параметр: Выбор планировщика для дисков vdd и vdc

  • Текущее значение:

cat /sys/block/vdd/queue/scheduler

cat /sys/block/vdc/queue/scheduler

  • Изменение:

echo deadline > /sys/block/vdd/queue/scheduler

echo deadline > /sys/block/vdc/queue/scheduler

  • Основание: deadline уменьшает задержки для операций чтения, что критично при OLAP-нагрузке.
  • Ожидаемый эффект: Улучшение времени отклика на чтение, снижение r_await.

️Параметры IO-планировщика - эксперимент

Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-2(SPEED-2) и Эксперимента-3(SPEED-3)
Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-2(SPEED-2) и Эксперимента-3(SPEED-3)

Среднее увеличение операционной скорости в ходе Эсперимента-3 по сравнению с Экпериментом-2 составило 1.77%.↗️

Среднее снижение операционной скорости в ходе Эсперимента-3 по сравнению с Экпериментом-2 составило 3.35% при низкой нагрузке на СУБД.↘️

Среднее увеличение операционной скорости в ходе Эсперимента-3 по сравнению с Экпериментом-2 составило 6.37% при высокой нагрузке на СУБД.⬆️

Анализ настройки планировщика

❎Эксперимент-4: Увеличение размера очереди запросов

Параметр: nr_requests

  • Текущее значение:

cat /sys/block/vdd/queue/nr_requests

# cat /sys/block/vdd/queue/nr_requests
256

️Анализ параметра nr_requests

Проанализируй показатели производительности IO и текущие значения для параметра nr_requests :"# cat /sys/block/vdd/queue/nr_requests
256". Подготовь рекомендации о целесообразности изменения параметра nr_requests для оптимизации подсистемы IO.

⚠️Изменение отменено

  • Изменение:

echo 256 > /sys/block/vdd/queue/nr_requests

  • Основание: Увеличивает глубину очереди запросов, позволяя диску эффективнее планировать операции.
  • Ожидаемый эффект: Снижение aqu_sz (средней длины очереди), улучшение утилизации диска.

☑️ Эксперимент-5: Настройки кэширования и буферизации

️Параметр: vm.vfs_cache_pressure

  • Текущее значение:

sysctl vm.vfs_cache_pressure

  • Изменение:

sysctl -w vm.vfs_cache_pressure=50

  • Основание: Уменьшает давление на кэш dentry и inode, что может улучшить кэширование файловых операций.
  • Ожидаемый эффект: Улучшение эффективности кэша, снижение нагрузки на дисковые операции чтения.

Настройки кэширования и буферизации - эксперимент

Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-3(SPEED-3) и Эксперимента-5(SPEED-5)
Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-3(SPEED-3) и Эксперимента-5(SPEED-5)

Среднее увеличение операционной скорости в ходе Эсперимента-5 по сравнению с Экпериментом-3 составило 30.82%.⬆️⬆️

❎Эксперимент-6: Настройка параметров виртуальной памяти

Параметр: vm.swappiness

  • Текущее значение:

sysctl vm.swappiness

# sysctl vm.swappiness
vm.swappiness = 10

⚠️Изменение отменено

  • Изменение:

sysctl -w vm.swappiness=10

  • Основание: Уменьшает склонность системы к свопингу, что важно при высокой нагрузке на IO.
  • Ожидаемый эффект: Больше оперативной памяти доступно для кэширования, меньше свопинга.

☑️Эксперимент-7: Оптимизация параметров файловой системы

Параметр: Монтирование с опциями noatime,nodiratime

  • Текущее значение:

mount | grep /data

  • Изменение:

В /etc/fstab добавить для разделов /data, /log, /wal:textnoatime,nodiratime

  • Основание: Уменьшает количество операций записи метаданных времени доступа.
  • Ожидаемый эффект: Снижение нагрузки на запись.

Оптимизация параметров файловой системы-эксперимент

Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-5(SPEED-5) и Эксперимента-7(SPEED-7)
Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-5(SPEED-5) и Эксперимента-7(SPEED-7)

Среднее увеличение операционной скорости в ходе Эсперимента-7 по сравнению с Экпериментом-5 составило 7.47%.⬆️

☑️ Эксперимент-8: Изменение размера буферов для операций с блочными устройствами

Параметр: /sys/block/vdd/queue/read_ahead_kb

  • Текущее значение:

cat /sys/block/vdd/queue/read_ahead_kb

# cat /sys/block/vdd/queue/read_ahead_kb
4096
  • Изменение:

echo 4096 > /sys/block/vdd/queue/read_ahead_kb

Анализ возможности изменения размера буферов для операций с блочными устройствами

echo 256 > /sys/block/vdd/queue/read_ahead_kb

  • Основание: Увеличение предварительного чтения может улучшить производительность последовательных операций чтения.
  • Ожидаемый эффект: Улучшение rMB/s для последовательных рабочих нагрузок.

Изменение размера буферов для операций с блочными устройствами-эксперимент

Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-7(SPEED-7) и Эксперимента-8(SPEED-8)
Сравнительный график изменения операционной скорости в ходе нагрузочного тестирования для Эксперимента-7(SPEED-7) и Эксперимента-8(SPEED-8)

Среднее увеличение операционной скорости в ходе Эсперимента-8 по сравнению с Экпериментом-7 составило 7.79%.⬆️

❌Изменения отклонены для текущей инфраструктуры: виртуальная машина в облаке❌

❎Настройка параметров сетевой подсистемы (если есть сетевые FS)

ℹ️Параметр: net.core.rmem_max, net.core.wmem_max

  • Текущее значение:

sysctl net.core.rmem_max

sysctl net.core.wmem_max

  • Изменение:

sysctl -w net.core.rmem_max=16777216

sysctl -w net.core.wmem_max=16777216

  • Основание: Увеличивает буферы сетевой подсистемы, если используется NFS или другие сетевые хранилища.
  • Ожидаемый эффект: Улучшение пропускной способности сетевого IO.

❎Настройка параметров энергосбережения для дисков - опционально

ℹ️Параметр: Управление APM (Advanced Power Management)

  • Текущее значение:

hdparm -B /dev/vdd

  • Изменение:

hdparm -B 255 /dev/vdd

  • Основание: Отключает энергосберегающие режимы, которые могут увеличивать задержки.
  • Ожидаемый эффект: Снижение r_await и w_await

⚠️Использование команды hdparm -B 255 /dev/vdd для изменения управления питанием (APM) на виртуальной машине в облаке не имеет практического смысла и, скорее всего, не окажет никакого эффекта.

🔍 Почему это бесполезно в облаке

· Виртуальные диски : В облачной инфраструктуре (например, в /dev/vdd) диск является виртуальным. Он либо эмулируется гипервизором, либо представляет собой удалённый сетевой накопитель. Низкоуровневые команды hdparm, предназначенные для управления физическими жесткими дисками (парковка головок, вращение шпинделя), просто неприменимы к виртуальным устройствам.

· Отсутствие физического энергосбережения : Параметр -B управляет расширенным управлением питанием (APM), которое было создано для экономии заряда батареи на ноутбуках. У облачной виртуальной машины нет физического диска, который можно было бы "усыпить", поэтому эти настройки игнорируются.

· Проблемы с применением настроек : Даже на некоторых физических системах настройки hdparm могут сбрасываться после перезагрузки, требуя сложной правки системных скриптов для сохранения. В виртуальной среде этот риск выше.

❎Увеличение лимитов на количество открытых файлов

ℹ️Параметр: fs.file-max, ulimit -n

  • Текущее значение:

sysctl fs.file-max

ulimit -n

  • Изменение:

sysctl -w fs.file-max=655356

echo "* soft nofile 65535" >> /etc/security/limits.conf

echo "* hard nofile 65535" >> /etc/security/limits.conf

  • Основание: При большом количестве операций чтения/записи может требоваться больше открытых файлов.
  • Ожидаемый эффект: Избежание ошибок “too many open files”, стабильность работы.

ℹ️Итог

Предложенные изменения направлены на:

1️⃣Снижение нагрузки на диски за счёт оптимизации кэширования и буферизации.

2️⃣Улучшение отклика подсистемы IO через настройку планировщика и очередей.

3️⃣Увеличение эффективности использования оперативной памяти для снижения количества операций чтения/записи.

4️⃣Оптимизацию работы файловых систем и сетевых подсистем.

ℹ️Рекомендация:

Вносить изменения постепенно, тестируя каждый параметр под нагрузкой.

ℹ️Для постоянного применения добавлять настройки в /etc/sysctl.conf, /etc/security/limits.conf и /etc/fstab.