Нагрузочное тестирование ZeroMQ (ZMQ_STREAM) для определения максимального числа одновременно работающих пользователей

У кого-нибудь есть реальные сценарии, в которых нагрузочные тесты ZMQ-сокетов для максимума нет. «одновременных пользователей» (не пропускная способность) они могут обрабатывать? Похоже, у ZeroMQ есть серьезные проблемы с лимитами FD.

Сценарий таков: существует множество инфраструктур веб-серверов, которые могут похвастаться миллионами одновременных пользователей, с которыми они могут работать - теперь, если ZeroMQ не может обрабатывать, кроме FD_SETSIZE, нет. для пользователей в любой момент времени это очень серьезное ограничение масштабируемости (поскольку FD - это не только ресурсы процесса, но и ресурсы компьютера, поэтому нет смысла создавать новый процесс на той же машине).

Чтобы проверить, я пытаюсь загрузить тест ZMQ_STREAM, чтобы найти, сколько одновременных пользователей он может выдержать. Это простой сервер ответов «hello-world», который просто прослушивает ZMQ_STREAM и возвращает «hello world» для каждого запроса (при строгом получении, за которым следует стиль отправки).

Теперь, во время тестирования с JMeter (используя users = 1000), нажмите на утверждение:zmq_assert (fds.size () <= FD_SETSIZE), Что это значит? Что ZMQ содержит FD_SETSIZE количество FD? Но (согласно приведенному ниже коду) каждое соединение открывается и закрывается немедленно, я не вижу, как это возможно, что в любой момент времени одновременно могут быть открыты более чем несколько FD.

Вопрос: Если это так, каким образом любое приложение на основе ZMQ может достигать одновременных подключений миллионов пользователей? (кроме очевидного и бессмысленного решения, состоящего из 1000 машин, каждый из которых обрабатывает 1000 пользователей, или увеличения FD_SETSIZE до невероятно большого числа)

Кто-нибудь знает что-нибудь о том, как и почему эти FD используются и как они исчерпаны (и что более важно, так как у других платформ, таких как nginx node.js нет этой проблемы), пожалуйста, пролите свет.

Код сервера, если он имеет значение, приведен ниже:

#include <zmq.h>
#include <assert.h>
#include <string.h>
#include <iostream>
int main(void)
{
    void *ctx = zmq_ctx_new();

    void *socket = zmq_socket(ctx, ZMQ_STREAM);
    int rc = zmq_bind(socket, "tcp://*:8080");
    uint8_t id[256];
    size_t id_size = 256;
    char msg[4096];
    size_t msg_size = 4096;
    int nCount = 0;
    char http_response[] =
        "HTTP/1.0 200 OK\r\n"
        "Content-Type: text/plain\r\n"
        "\r\n"
        "Hello, World!";
    int nResponseLen = strlen(http_response);
    while (1) {
        id_size = zmq_recv(socket, id, 256, 0);
        msg_size = zmq_recv(socket, msg, sizeof(msg), 0);
        msg[msg_size] = '\0';
        std::cout << ++nCount << " -----\n";

        zmq_send(socket, id, id_size, ZMQ_SNDMORE);
        zmq_send(socket, http_response, nResponseLen, ZMQ_SNDMORE);

        zmq_send(socket, id, id_size, ZMQ_SNDMORE);
        zmq_send(socket, 0, 0, ZMQ_SNDMORE);
    }
    zmq_close(socket);
    zmq_ctx_destroy(ctx);
    return 0;
}

Используя JMeter, users = 1000

Ответы на вопрос(1)

Ваш ответ на вопрос