Нагрузочное тестирование 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