От диагностики к действию
Высокая нагрузка на дисковую подсистему — частое «бутылочное горло», способный затормозить работу даже самого мощного сервера. Когда мониторинг показывает 100% утилизацию диска, растущие задержки и очередь из процессов, ожидающих IO, стандартных настроек ОС уже недостаточно.
Эта статья — не теория, а готовый план как по конкретным симптомам (OLAP-нагрузка, неэффективный кэш, блокировки) выявить корень проблемы и применить целенаправленные правки: от выбора IO-планировщика и настройки виртуальной памяти до оптимизации файловой системы. Каждое изменение объяснено, обосновано и снабжено конкретной командой. Следуя этому руководству, вы системно оптимизируете производительность IO, переводя подсистему из состояния «выживания» в режим эффективной работы.
GitHub - Комплекс pg_expecto для статистического анализа производительности и нагрузочного тестирования СУБД PostgreSQL
Глоссарий терминов | Postgres DBA | Дзен
Эксперимент-1: Базовые показатели IO
Задача
Сформировать список изменений параметров ОС для оптимизации производительности IO.
Промпт
Используя данные о результатах производительности системы IO,
необходимо подготовить список изменений параметров операционной системы для оптимизации производительности подсистемы IO:
**Общее описание оптимизируемых параметров и ожидаемый эффект**
**Оптимизация параметров IO**
- Получение текущего значения параметра
- Изменение значения параметра
- Основание для изменения
- Ожидаемый эффект от изменения
**Итог**
Тюнинг параметров ОС
На основе анализа предоставленных данных о производительности IO-подсистемы выявлены следующие проблемы:
- Высокая загрузка диска vdd (100% utilization).
- Высокая корреляция между использованием кэша памяти и операциями чтения/записи, что указывает на недостаточную эффективность кэширования.
- Большое количество процессов в состоянии ожидания IO (uninterruptible sleep), превышающее количество ядер CPU.
- Высокое отношение операций чтения к записи (OLAP-сценарий).
- ⚠️Низкая корреляция между операционной скоростью и 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.
- Ожидаемый эффект: Более равномерная запись, снижение пикового времени ожидания записи.
️Общие параметры производительности - эксперимент
Среднее увеличение операционной скорости в ходе Эсперимента-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-планировщика - эксперимент
Среднее увеличение операционной скорости в ходе Эсперимента-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, что может улучшить кэширование файловых операций.
- Ожидаемый эффект: Улучшение эффективности кэша, снижение нагрузки на дисковые операции чтения.
Настройки кэширования и буферизации - эксперимент
Среднее увеличение операционной скорости в ходе Эсперимента-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
- Основание: Уменьшает количество операций записи метаданных времени доступа.
- Ожидаемый эффект: Снижение нагрузки на запись.
Оптимизация параметров файловой системы-эксперимент
Среднее увеличение операционной скорости в ходе Эсперимента-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 для последовательных рабочих нагрузок.
Изменение размера буферов для операций с блочными устройствами-эксперимент
Среднее увеличение операционной скорости в ходе Эсперимента-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.