Вопрос или проблема
Я работаю на виртуальной машине под управлением VMWare с диском, подключенным через виртуальный SCSI-коннектор.
Я наблюдаю проблему, которую никогда не встречал на других системах. Простое приложение с одним процессом не может прочитать файл на полной скорости базового устройства хранения.
Мне удалось смягчить проблему до разницы между двумя командами fio
:
С:
fio --name=read_throughput --directory=. --numjobs=1 --size=10G --time_based --runtime=60s --ramp_time=2s --direct=0 --verify=0 --bs=64K --iodepth=64 --rw=read --group_reporting=1
Я получаю только очень низкую скорость чтения:
READ: bw=529MiB/s (554MB/s), 529MiB/s-529MiB/s (554MB/s-554MB/s), io=30.0GiB (33.3GB), run=60001-60001msec
Но с несколькими процессами я могу достичь почти максимальной скорости базовой системы хранения, как и ожидалось:
fio --name=read_throughput --directory=. --numjobs=8 --size=10G --time_based --runtime=60s --ramp_time=2s --direct=0 --verify=0 --bs=64K --iodepth=64 --rw=read --group_reporting=1
READ: bw=3238MiB/s (3395MB/s), 3238MiB/s-3238MiB/s (3395MB/s-3395MB/s), io=190GiB (204GB), run=60001-60001msec
Я проверил настройки, которые, на мой взгляд, могли бы повлиять на такое поведение, но не вижу ничего проблемного:
# cat /sys/block/sda/queue/scheduler
[mq-deadline] none
# cat /sys/block/sda/device/queue_depth
254
Единственным, что могло бы вызвать проблемы, было:
# cat /sys/block/sda/queue/rotational
1
Я принудил его к 0, но результаты теста fio с одним потоком остались прежними.
Я проверял RAM и CPU во время теста fio с одним потоком, и, определенно, виртуальная машина не является узким местом в RAM или CPU.
Есть идеи, как двигаться дальше?
Ответ или решение
Проблема с однопоточным процессом, не использующим полную ёмкость чтения диска
Фон
Вы находитесь на виртуальной машине (VM), работающей на платформе VMWare, с подключенным виртуальным SCSI-диском. Ваша задача состоит в том, чтобы выяснить, почему однопоточный процесс не способен достигнуть полной скорости чтения данных с диска, несмотря на использование правильных параметров при выполнении тестов с помощью утилиты fio
.
Обзор проблемы
Согласно результатам вашего тестирования, разница в производительности между однопоточными и многопоточными запросами поразительна:
- Однопоточный тест (1 процесс) показал throughput в 529 MiB/s.
- Многопоточный тест (8 процессов) позволил достигнуть throughput в 3238 MiB/s.
Конфигурация ваших тестов была корректна, однако результаты однопоточного теста были значительно ниже ожидаемых.
Возможные причины и рекомендации
-
Параметры I/O:
- Убедитесь, что значение
iodepth
действительно подходит для вашего случая. В вашем случае оно было установлено на 64, что подходит для многопоточной нагрузки, но для однопоточного использования может быть слишком высоким и вызывать эффект узкого места. Попробуйте уменьшитьiodepth
до 16 или 32 для однопоточного теста и посмотрите на изменения в производительности.
- Убедитесь, что значение
-
Размер блока (block size):
- Размер блока в 64K является разумным выбором, однако возможно, что адаптация этого параметра до 128K или даже 256K может дать лучшее исполнение для вашего случая. Оптимальный размер блока зависит от ряда факторов, включая спецификации вашей файловой системы и характеристик хранилища.
-
Кэширование:
- Параметр
--direct=0
указываетfio
использовать кэш в файловой системе. Попробуйте сменить этот параметр на--direct=1
, чтобы исследовать влияние прямого доступа к устройству на производительность чтения.
- Параметр
-
Параметры виртуализации:
- Виртуальные машины могут иметь ограничения на уровне гипервизора. Проверьте настройки вашей VMWare для ресурсов диска: возможно, стоит увеличить выделенные ресурсы для вашей виртуальной машины (например, увеличить количество выделенной памяти или выделенных ядер процессора).
-
Оптимизация процесса:
- Один из аспектов, который можно проверить – это возможность оптимизации самого приложения. Если приложение не использует ресурсы диска оптимально, это может объяснять низкую производительность в однопоточном режиме. Убедитесь, что приложение обеспечивает асинхронность ввода-вывода или использует множество потоков для чтения.
-
Тестирование с другим программным обеспечением:
- Попробуйте использовать другие утилиты для тестирования производительности, такие как
dd
иioping
. Это может предоставить более широкий контекст поведения диска и выявить возможные проблемы.
- Попробуйте использовать другие утилиты для тестирования производительности, такие как
-
Мониторинг и диагностика:
- С помощью инструментов мониторинга, таких как
iostat
иvmstat
, отслеживайте I/O активности во время выполнения тестов. Это поможет вам увидеть, как система реагирует и может указать на узкие места.
- С помощью инструментов мониторинга, таких как
Заключение
Проблема с недостаточным использованием ёмкости чтения диска однопоточным процессом может быть связана с несколькими факторами, включая параметры I/O, кэширование, настройки виртуализации и эффективность самого приложения. Следуя предложенным рекомендациям по тестированию и оптимизации, вы сможете понять и, возможно, устранить узкие места в производительности.
Если после всех изменений производительность не улучшится, рекомендуется рассмотреть возможность обращения к технической поддержке вашего облачного провайдера или сообществу, работающему с VMWare, для дальнейшего анализа и получения поддержки.