openjdk.ruOpenJDK на русском

JEP 337: RDMA Network Sockets

Сетевые сокеты на основе RDMA

ОтветственныйYingqi Lu
ТипFeature
ОбластьJDK
СтатусClosed / Withdrawn
Компонентcore-libs / java.nio
Обсуждениеnio dash dev at openjdk dot java dot net
ТрудоёмкостьM
ДлительностьM
РецензентыAlan Bateman, Chris Hegarty
Создан2018/05/18 16:58
Обновлён2024/08/09 22:10
Задача8203434

Аннотация

Расширить сетевой API JDK, чтобы он поддерживал удалённый прямой доступ к памяти (remote direct memory access, RDMA) с использованием протокола rsocket на платформах на основе Linux.

Мотивация

Для HPC- и облачных приложений трудно полностью использовать возможности сетевого оборудования, чтобы достичь максимальной полосы пропускания при низкой задержке. Сетевые библиотеки в JDK сейчас используют сокеты ядра операционной системы. При передаче данных выполняется несколько копирований памяти между пространством пользователя и пространством ядра, и они дорого обходятся как по полосе пропускания памяти, так и по тактам процессора. Чтобы улучшить ситуацию, мы предлагаем добавить поддержку rsocket — протокола поверх удалённого прямого доступа к памяти (RDMA), который обеспечивает сетевое взаимодействие с высокой пропускной способностью и низкой задержкой.

Описание

В вычислительной технике удалённый прямой доступ к памяти (RDMA) — это прямой доступ из памяти одного компьютера в память другого без участия операционной системы какого-либо из них. Он обеспечивает сетевое взаимодействие с высокой пропускной способностью и низкой задержкой, что особенно полезно в массово-параллельных вычислительных кластерах. RDMA поддерживает сетевую передачу без копирования (zero-copy): сетевой адаптер передаёт данные напрямую в память приложения или из неё, и копировать данные между памятью приложения и буферами данных операционной системы не нужно. Такая передача не требует работы процессоров, кэшей или переключений контекста, и она идёт параллельно с другими операциями системы. Когда приложение выполняет запрос RDMA Read или Write, данные приложения передаются напрямую в сеть, что снижает задержку и обеспечивает быструю передачу сообщений. — Википедия

rsocket — протокол поверх RDMA, который предоставляет приложениям C API. Этот API задуман так, чтобы соответствовать привычному API сокетов. Например, чтобы создать сокет и получить файловый дескриптор,

default socket call: int socket(int domain, int type, int protocol);
rsocket function:    int rsocket(int domain, int type, int protocol);

Сетевые библиотеки JDK используют стандартный API сокетов, поэтому API rsocket хорошо подходит для включения RDMA как в традиционных сокетах, так и в неблокирующих канала́х сокетов.

Предлагаемый API, специфичный для JDK

Возможность rsocket нестандартная и доступна только на платформах Linux. Поэтому здесь предлагается добавить Java API в пакет jdk.net модуля jdk.net, где уже представлены другие сетевые возможности, специфичные для JDK. На платформах, где rsocket не поддерживается, при использовании этого API будет выброшено исключение UnsupportedOperationException.

Новый класс jdk.net.RdmaSockets будет определять фабричные методы для создания TCP-сокетов и каналов на основе RDMA.

java.net.Socket openSocket(ProtocolFamily family)
java.net.ServerSocket openServerSocket(ProtocolFamily family)
java.nio.channels.SocketChannel openSocketChannel(ProtocolFamily family)
java.nio.channels.ServerSocketChannel openServerSocketChannel(ProtocolFamily family)
java.nio.channels.Selector openSelector()

Тестирование

  • Для всех тестов потребуется оборудование с поддержкой RDMA (сетевой адаптер и коммутатор).

  • Функциональное тестирование будет проводиться как для сокетов на основе RDMA, так и для неблокирующих каналов сокетов на основе RDMA.

  • Будет выполнено профилирование загрузки процессора с этой возможностью и без неё, чтобы убедиться, что потребление процессора снижается, особенно в пространстве ядра.

Альтернативы

  • Socket Direct Protocol (SDP) — альтернативный подход к включению RDMA для сетевого взаимодействия. Его поддержка была включена в JDK 7. Однако поддержка SDP в ядре была объявлена устаревшей в спецификации Open Fabric Enterprise Edition (OFED) версии 3.5 (февраль 2013 года). rsocket был добавлен в OFED в апреле 2012 года как преемник SDP.

  • Другой альтернативный подход — использовать LD_PRELOAD с библиотекой librspreload, которая входит в RDMA-библиотеку librdmacm в Linux. При таком подходе все системные вызовы сокетов транслируются в вызовы rsocket, предоставляемые этой библиотекой. Это не даёт гибкости, при которой в одном приложении можно выполнять и обычные операции с сокетами, и операции с сокетами RDMA.

Риски и допущения

  • rsocket сейчас доступен только в Linux. Мы предполагаем, что в ОС будет установлена транспортная библиотека RDMA verbs.

  • Как и SDP, rsocket не работает с адресами IPv4, отображёнными в IPv6 (IPv6-mapped-IPv4). Все сокеты и каналы сокетов на основе RDMA будут использовать протокол IPv4 для connect/accept.

  • rsocket сейчас не поддерживает epoll или эквивалентную возможность, вместо этого используется rpoll. Объекты SocketChannel на основе rsocket нельзя мультиплексировать с другими каналами, поддерживающими выбор (selectable channels).