有没有人有任何实际场景对 ZMQ 套接字进行负载测试以获得最大数量。他们可以处理的“并发用户”(不是吞吐量)?看起来 ZeroMQ 在 FD 限制方面存在一些严重问题。
场景是:有许多 Web 服务器框架吹嘘它们可以处理数百万个并发用户 - 现在,如果 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,用户=1000