Вопрос или проблема
Я пытаюсь лучше понять, как можно оптимизировать запись на NVMe.
У меня есть процесс, который записывает большое количество данных на диск (~100 ГБ) за один пакетный запуск. Данные распределены по сотням файлов.
У меня есть несколько NVMe-дисков, и я буду записывать отдельные файлы параллельно в одном процессе, используя несколько потоков (~10).
В настоящее время все данные записываются на один NVMe-диск, мне интересно, возможно ли повысить производительность, записывая данные на несколько дисков параллельно, или один NVMe-устройство может справиться с параллельными записями самостоятельно?
Буду признателен за любые мнения
Ну, определенно, спецификация NVMe допускает наличие около 64k очередей, каждая из которых может содержать 64k записей – так что сама спецификация допускает некоторые очень высоконагруженные операции параллелизма – поддерживает ли реальный диск такое количество – это другой вопрос, но они определенно поддерживают сотни очередей и сотни записей в очередях. Все это поможет.
Тем не менее, инстинктивно можно думать, что больше дисков будет лучше, но это действительно зависит от того, насколько загружены PCIe/PCH – если есть много мелких записей, то есть вероятность, что шина не полностью занята, поэтому распределение нагрузки по нескольким дискам может немного помочь, но если она полностью загружена, как это обычно бывает при больших последовательных записях, то один диск может быть таким же быстрым, как несколько дисков.
Разумеется, это все до учета таких вещей, как RAID 1/10 или 0 и его влияния – лучше всего иметь что-то подобное для надежности.
В конечном итоге, вам следует протестировать это, это правильный ответ, но это зависит от количества дисков и времени, которое у вас есть для тестирования – но это единственный способ действительно узнать.
Вместо обычного дисклеймера, давайте начнем с цитаты Альберта Эйнштейна: “В теории теория и практика одно и то же. На практике – нет.”
Теория: Диски NVMe должны справляться с несколькими параллельными записями достаточно хорошо, так что вам не нужно ничего оптимизировать самостоятельно.
Практика: Не все диски NVMe равны. Корпоративные диски оснащены мощными процессорами для работы с прошивкой по сбору мусора, глубокими I/O-очередями, большими буферами записи в RAM и ячейками SLC для долговечности. Потребительские диски NVMe? Не так уж и много.
Итак, вот в чем дело: забудьте основное правило “нет логирования на логирование” (см. ссылку ниже), и вместо того, чтобы обрушивать на ваш NVMe множество мелких записей из разных процессов, создайте очередь. Позвольте одному процессу собирать все эти мелкие записи в одну большую и обрабатывать их по одной. Это а) повысит производительность, и б) продлит срок службы вашего NVMe.
Р.S. Вот ссылка на “нет логирования на логирование”:
https://www.usenix.org/system/files/conference/inflow14/inflow14-yang.pdf
Ответ или решение
Оптимизация записи данных на NVMe-диски
Введение
С ростом объёма данных, которые необходимо обрабатывать, вопрос оптимизации записи становится всё более актуальным. При использовании NVMe-дисков для записи больших объемов информации, таких как 100 Гб в одной пакетной задаче, важно учитывать, как лучше всего распределить данные, чтобы максимально увеличить производительность записи.
Параллельные записи на NVMe
NVMe (Non-Volatile Memory Express) по своей архитектуре предназначен для высокопроизводительных операций ввода-вывода. Стандарт NVMe позволяет использовать до 64 тысяч очередей команд, каждая из которых может содержать до 64 тысяч записей. Это значит, что теоретически NVMe-диски способны обрабатывать множество параллельных записей, что делает их привлекательными для задач, требующих высокой пропускной способности.
Практические аспекты
-
Разное оборудование: Не все NVMe-диски одинаковы. В то время как корпоративные NVMe-диски имеют мощные процессоры для управления сбором мусора, глубокие очереди ввода-вывода и большие объёмы кэша, потребительские NVMe-диски могут не быть так же эффективными. Поэтому при параллельных записях следует учитывать спецификации используемых дисков.
-
Оптимизация потоков записи: При использовании нескольких потоков для записи данных не всегда увеличение числа потоков будет приводить к повышению производительности. Часто может возникнуть ситуация, когда PCIe-шина оказывается загруженной, и в этом случае запись на один диск не будет существенно отличаться от записи на несколько. Поэтому разумным подходом будет собрать небольшие записи в одну более крупную и затем отправить её на диск. Это внутреннее объединение операцией может сократить количество обращений к диску и повысить общую пропускную способность.
-
Использование нескольких дисков: Распределение нагрузки на несколько NVMe-дисков может действительно улучшить общую производительность, особенно если ваши диски не перегружены. В случае, когда данные имеют большой объём, параллельное использование нескольких дисков может существенно ускорить процесс записи. Однако, важно помнить, что тестирование на практике покажет, насколько это оптимально для ваших условий работы.
-
Режимы RAID: Также стоит рассмотреть использование RAID-массивов (например, RAID 0, 1 или 10) для повышения производительности и надежности записей. Это может помочь не только в распределении нагрузки, но и в обеспечении резервного копирования данных.
Вывод
Вместо теоретических предположений, что большее количество NVMe-дисков всегда обеспечит выигрыш в производительности, лучше всего провести тестирование в вашем конкретном контексте. Оптимизация записи предполагает баланс между количеством дисков, архитектурой ваших NVMe-устройств и типом данных, которые вы обрабатываете.
Если у вас есть доступ к нескольким NVMe-дискам, стоит рассмотреть возможность их параллельного использования и провести испытания для определения наилучшей конфигурации для вашей задачи. Правильная настройка записи на NVMe может не только повысить производительность вашего решения, но и продлить срок службы дисков, что, в свою очередь, обеспечит экономию бюджета в долгосрочной перспективе.