Получение сообщений zmq в выровненном буфере памяти для capnp FlatArrayMessageReader - PullRequest
1 голос
/ 02 февраля 2020

Я отправляю сообщение через архетип ZeroMQ PUB/SUB, используя канал транспортного класса tcp://, после сериализации сообщения capnp с использованием capnp::messageToFlatArray. На принимающей стороне я получаю весь контент в сообщении zmq_msg_t. Но zmq_msg_data(&message) возвращает ячейку памяти, которая не выровнена capnp::word. Так что FlatArrayMessageReader вызывает исключение, что память не выровнена.

Упрощенный код выглядит следующим образом:

    zmq_msg_t message;
    zmq_msg_init(&message);

    zmq_msg_recv(&message, socket, flags);

    size_t size = zmq_msg_size(&message);
    auto data = zmq_msg_data(&message);
    auto pdata = kj::arrayPtr((const capnp::word*)data, size / sizeof(capnp::word));
    capnp::FlatArrayMessageReader msg = capnp::FlatArrayMessageReader(pdata);  // exception

Что было бы хорошим способом выровнять данные без копирования всего буфер? Или есть способ получить сообщение в памяти с выравниванием по словам без потери производительности - например, отключить нулевое копирование в zmq?

Попробовать Ubuntu 18.04 с capnp версии 0.7.0, zeromq версии 4.3.2 и g cc 7,4,0.

1 Ответ

1 голос
/ 03 февраля 2020

Q : Какой хороший способ получить данные выровненные без копирования всего буфера?

Что ж, учитывая, что ZeroMQ (как есть) основан на автономно работающем Context() -экземпляре, который по собственному праву обещал Zero-Copy по тем же причинам, связанным с производительностью, местом хранения сообщения определяется внутренними политиками Context(), которые не "видят", тем меньше "подчиняются" любым из capnp -приятий.

Если только один рефактор не только zmq_msg_init() per se * , но все связанные с этим внутренние функции, связанные с производительностью, внутри ZeroMQ, чтобы внешне "обеспечивать" и "сохранять" своего рода (здесь мотивировано capnp, вызывает Примерное «конфликт интересов» ) Высокоуровневое идеологизированное управление памятью (согласованные политики распределения, повторного использования и освобождения), кажется, существует нулевой шанс на ожидание такое поведение от уже зрелого, умного и стройного (как есть) и функциональный инструмент нужного размера с достаточным оснащением, предназначенный для обеспечения быстрого, с минимальной задержкой и практически линейного масштабируемого инструмента обмена сообщениями / сигнализации.

Q : есть ли способ получить сообщение в памяти с выравниванием по словам без потери производительности - например, отключение нулевое копирование в zmq?

AFAIK, никогда не встречал такого конфигурация «через» опубликованный API (начиная с v2. + до v4.3 с 2020 / Q1) .

Может попытаться отсканировать исходный код с комментариями, где любой такой трюк может оказались на месте.

...