【发布时间】:2014-12-15 05:48:55
【问题描述】:
我正在测试 majordomo 代理的吞吐量。 github上majordomo代码附带的test_client.c发送同步请求。我想测试 majordomo 代理可以实现的最大吞吐量。规范 (http://rfc.zeromq.org/spec:7) 说它每秒最多可以切换一百万条消息。
首先,我将客户端代码更改为异步发送 100k 请求。即使将所有套接字上的 HWM 设置得足够高,并将 TCP 缓冲区增加到 4 MB,我仍然观察到三个客户端并行运行的数据包丢失。
所以我将客户端更改为一次发送 10k 个请求,然后为它收到的每个回复发送两个请求。我选择 10k 是因为这允许我并行运行多达 10 个客户端(每个客户端发送 100k 条消息)而不会丢失任何数据包。这是客户端代码:
#include "../include/mdp.h"
#include <time.h>
int main (int argc, char *argv [])
{
int verbose = (argc > 1 && streq (argv [1], "-v"));
mdp_client_t *session = mdp_client_new (argv[1], verbose);
int count1, count2;
struct timeval start,end;
gettimeofday(&start, NULL);
for (count1 = 0; count1 < 10000; count1++) {
zmsg_t *request = zmsg_new ();
zmsg_pushstr (request, "Hello world");
mdp_client_send (session, "echo", &request);
}
for (count1 = 0; count1 < 45000; count1++) {
zmsg_t *reply = mdp_client_recv (session,NULL,NULL);
if (reply)
{
zmsg_destroy (&reply);
zmsg_t *request = zmsg_new ();
zmsg_pushstr (request, "Hello world");
mdp_client_send (session, "echo", &request);
request = zmsg_new ();
zmsg_pushstr (request, "Hello world");
mdp_client_send (session, "echo", &request);
}
else
break; // Interrupted by Ctrl-C
}
/* receiving the remaining 55k replies */
for(count1 = 45000; count1 < 100000; count1++)
{
zmsg_t *reply = mdp_client_recv (session,NULL,NULL);
if (reply)
{
zmsg_destroy (&reply);
}
else
break;
}
gettimeofday(&end, NULL);
long elapsed = (end.tv_sec - start.tv_sec) +((end.tv_usec - start.tv_usec)/1000000);
printf("time = %ld\n", elapsed);
printf ("%d replies received\n", count1);
mdp_client_destroy (&session);
return 0;
}
我在同一台机器上运行代理、工作者和客户端。这是记录的时间:
number of clients in parallel
(each client sends 100k ) Time elapsed (seconds)
1 4
2 9
3 12
4 16
5 21
10 43
因此,对于每 10 万个请求,代理大约需要 4 秒。这是预期的行为吗?我不确定如何达到每秒百万条消息。
最新更新:
我想出了一个提高系统吞吐量的方法:
两个代理而不是一个。其中一个代理 (broker1) 负责将客户端请求发送给工作人员,而另一个代理 (broker2) 负责将工作人员的响应发送给客户端。
worker 向 broker1 注册。
客户端生成唯一的 id 并向 broker2 注册。
与请求一起,客户端还将其唯一 ID 发送给 broker1。
Worker 从请求中提取唯一的客户端 ID,并将其响应(连同必须向其发送响应的客户端 ID)发送到 broker2。
现在,每 10 万个请求大约需要 2 秒而不是 4 秒(使用单个代理时)。我在代理代码中添加了 gettimeofday 调用,以测量代理本身增加了多少延迟。
这是我记录的
- 100k 请求(总时间:~2 秒)-> 代理添加的延迟为 2 秒
- 200k 请求(总时间:~4 秒)-> 代理添加的延迟为 3 秒
- 300k 请求(总时间:~7 秒)-> 代理添加的延迟为 5 秒
所以大部分时间都花在了代理代码上。有人可以建议如何改进这一点。
【问题讨论】:
标签: sockets zeromq distributed distributed-computing