Я пытаюсь выяснить, почему qperf
сообщает о задержке (в одну сторону) x
, а REQ / REP (в оба конца) сообщает что-то вроде 4x
.Какие-либо конкретные настройки сокета я должен сделать?Потому что, если я просто открываю сокет, устанавливаю TCP_NODELAY (который установлен в ZMQ по умолчанию), я получаю задержку очень близко (для буферов 1k) к числу, сообщаемому qperf
.Однако ZMQ отстает от этих чисел примерно в 4-5 раз
ZMQ-сервер
zmq::context_t context;
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("tcp://*:5555");
while (true) {
zmq::message_t request;
// Wait for next request from client
socket.recv(&request);
// Send reply back to client
zmq::message_t reply(5);
memcpy(reply.data(), "World", 5);
socket.send(reply);
}
ZMQ-клиент
zmq::context_t context;
zmq::socket_t socket(context, ZMQ_REQ);
std::cout << "Connecting to hello world server…" << std::endl;
socket.connect("tcp://my.host:5555");
const size_t cycles = 100'000;
double throughput = 0;
zmq::message_t reply;
auto start = std::chrono::high_resolution_clock::now();
vector<uint8_t> buff(MessageSize, 0);
for (auto i = 0ul; i < cycles; ++i) {
zmq::message_t request(MessageSize);
memcpy(request.data(), buff.data(), MessageSize);
throughput += request.size();
socket.send(request);
// Get the reply.
socket.recv(&reply);
}
auto end = std::chrono::high_resolution_clock::now();
auto us = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
std::cout << "Latency: " << us / cycles << "us." << std::endl;
std::cout << "Througput: " << std::fixed << throughput / us * 1'000'000 / 1024 / 1024 << "MiB/s." << std::endl;
По сути, оба примера ZMQ представлены здесь http://zguide.zeromq.org/cpp:hwclient Некоторые фоны, Linux, Ubuntu, GCC 7.3, статическая библиотека, предоставляемая vcpkg
, построенная локально, выглядит так, как будто они вытаскивают мастер из github.