Вопрос или проблема
Когда мы работаем с локальным диском, мы создаём запросы на чтение и запись к устройствам блока на стороне сервера. В общем, они не могут и не должны выполняться в порядке их подачи. Например, запросы на запись могут происходить с задержкой (обычно в свободное время, когда кеш записи слишком велик), а также запросы на чтение могут обслуживаться значительно быстрее из кеша страниц.
Дела становятся гораздо более проблемными, если мы работаем с сетевым общим устройством блока. Я знаю 3 способа:
- nbd, или сетевое блок-устройство
- iscsi, что является протоколом SCSI через TCP-сокет
- и мы также можем использовать обычные файлы, смонтированные на каталоге NFS или CIFS.
Однако все не так просто через сетевое соединение. Обычно это происходит по TCP, и TCP сериализует общение, хотите вы этого или нет. Таким образом, одновременные запросы через сетевое блок-устройство, шареное по TCP, должны выполняться в том порядке, в котором они пришли по сети.
Это не всегда правильный подход, даже в случае сегодняшнего дня с широко используемыми SSD, просто потому, что кэшированные страницы памяти могут быть обслужены на месте.
На мой взгляд, очевидным решением было бы использовать какой-то более продвинутый протокол для управления корректностью и предоставления большего контроля над порядком запросов. Это могло бы быть, возможно, SCTP или DCCP. Это хорошо разработанные протоколы в ядре Linux, и они позволяют переупорядочивать ответы по сравнению с временной меткой их подачи или порядком прибытия по сети.
Существует ли такая вещь? Насколько я могу видеть,
- nbd только TCP
- NFS также может быть UDP, но это не оптимально
- iscsi также только TCP.
Существует ли какой-то способ использовать более продвинутый протокол для сетевого совместного использования устройства блока?
SATA, NVMe и все современные производные SCSI поддерживают очередность команд. И это через их соответствующие каналы – ни один из которых не имеет “параллельных” линий команд для нескольких запросов.
Вы представляете проблему, которая отсутствует – iSCSI (через TCP) полностью поддерживает Tagged Command Queuing (TCQ), что как раз то, что вы описываете: асинхронное завершение команд, возможно, через любую последовательную линию. Следовательно, и, к счастью, одновременные запросы через сетевое блок-устройство, шареное по TCP, должны выполняться в порядке их поступления является неверным заключением!
Таким образом, ответ на ваш вопрос становится:
- iSCSI с целевыми устройствами, которые полностью поддерживают TCQ, полностью поддерживает ответы вне порядка
- NFS также полностью способен одновременно обслуживать несколько запросов – базовый интерфейс RPC это поддерживает. Как это реализовано в Linux (это точно так, sunrpc действительно не делает это легким для строгого упорядочивания), однако это деталь, которую я не знаю. Тем не менее, сам факт того, что вы можете одновременно перечислить два больших каталога с одного NFS-клиентского компьютера, доказывает, что вам не нужно беспокоиться о том, что ответы должны быть в порядке запросов!
- nbd я не знаю достаточно хорошо; однако, спецификация протокола явно упоминает, что сервер может обслуживать запросы вне порядка, и независимые логические типы пакетов запросов и ответов предполагают, что это не большая проблема, и если бы мне пришлось делать предположение, многопоточная серверная реализация, такая как nbdkit, будет по своей природе иметь возможность отвечать на все, что было сделано первым, в первую очередь.
Ответ или решение
Сетевые блоковые устройства (Network Block Devices) представляют собой сложное и важное решение для эффективного управления данными в распределённых системах. Ваша задача подразумевает понимание взаимодействия блоковых устройств через нетрадиционные протоколы, такие как SCTP (Stream Control Transmission Protocol) и DCCP (Datagram Congestion Control Protocol). На основе приведенного вами контекста, давайте разберем все возможные подходы и их особенности более подробно.
Проблема с использованием TCP в сетевых блоковых устройствах
Как вы правильно заметили, традиционные протоколы, такие как NBD (Network Block Device), iSCSI и NFS, в значительной степени зависят от TCP, который обеспечивает последовательность доставки пакетов. Это означает, что запросы на чтение и запись обрабатываются строго в порядке их поступления, что не всегда может быть оптимальным, особенно с учетом скорости современных SSD-накопителей и кеширования данных.
Важнейшими аспектами, которые следует учитывать при работе с сетевыми блоковыми устройствами, являются:
- Требования к производительности: В современных вычислительных системах важно максимизировать скорость обработки ввода-вывода, что подразумевает возможность параллельного выполнения запросов.
- Оптимизация доступа к данным: Необходимо учитывать возможность доступа к данным из кеша для минимизации задержек при обработке запросов.
Альтернативные протоколы: SCTP и DCCP
SCTP и DCCP являются протоколами, которые возможно рассмотреть в контексте сетевого использования блоковых устройств:
-
SCTP: Обеспечивает мультипоточность и поддержку последовательной передачи данных, что позволяет значительно улучшить гибкость обработки запросов. В отличие от TCP, SCTP поддерживает асинхронную обработку сообщений, что может помочь в улучшении порядка обработки запросов на уровне приложения.
-
DCCP: Предназначен для передачи потокового контента и управления перегрузками, что может быть полезно в условиях сетей с переменной пропускной способностью. Тем не менее, его применение в системах, критически зависящих от надежности и заказной обработки, может быть ограничено.
Обсуждение альтернативных решений
-
iSCSI с поддержкой TCQ: Многие устройства, поддерживающие iSCSI, имеют Tagged Command Queuing (TCQ), что позволяет их командам обрабатываться асинхронно. Данная функция дает возможность выполнять запросы в порядке, отличном от порядка их поступления, что критически важно для современных SSD.
-
NFS: Протокол NFS также поддерживает асинхронные операции благодаря архитектуре RPC (Remote Procedure Call). Это означает, что можно одновременно обслуживать несколько запросов из одного клиентского соединения, что улучшает производительность. К тому же, пользователи NFS могут наблюдать параллельный доступ к данным с минимальными задержками.
-
NBD: Протокол NBD на самом деле позволяет серверам обрабатывать запросы вне зависимости от их порядка. Современные реализации, такие как nbdkit, способны эффективно управлять очередями запросов, что делает их подходящими для высокопроизводительных приложений.
Заключение
Можно заключить, что использование протоколов SCTP и DCCP для сетевого доступа к блочным устройствам не является единственным решением. Протоколы, такие как iSCSI (с поддержкой TCQ), NFS и NBD, уже предоставляют необходимую гибкость и возможность асинхронной обработки запросов. Эти методы дают возможность разрабатывать высокопроизводительные системы, способные эффективно использовать преимущества современных накопителей.
Если ваша цель заключается в повышении эффективности и оптимизации обработки данных в сетевых блочных устройствах, вам следует обратить внимание на эти протоколы и их особенности. Это поможет вам достичь высокой производительности, необходимой для современных приложений и вычислительных систем.