gpt4 book ai didi

c - libuv在建立多个连接时速度慢?

转载 作者:行者123 更新时间:2023-11-30 16:46:30 24 4
gpt4 key购买 nike

我正在尝试评估 libuv 的性能,因为它 promise 可以管理 100,000 个 TCP 套接字,并且每秒可以生成 10,000 个新的 TCP session 。

根据要点创建了以下代码片段来验证 libuv 的性能。然而,根据wireshark pcap capture的说法,当它在服务器上运行时,速度出奇地慢。

  • TCP 握手一次又一次地完成,我希望 TCP SYN 能够并行发送
  • TCP 数据在所有 session 建立后发送。我原本期望 TCP 握手完成后立即发送 TCP 数据。

此测试在 Ubuntu 14.04(64 位核心 i7 cpu)上运行。

不确定 libuv 或此代码片段是否有问题。

我知道这有一些内存泄漏,但这并不重要,因为我只是在进行评估。

#include <stdio.h>
#include <stdlib.h>
#include <uv.h>

//based on https://gist.githubusercontent.com/snatchev/5255976/
//raw/8392c42d719bb775053036e32b21affdf932c1b7/libuv-tcp-client.c
static void on_close(uv_handle_t* handle);
static void on_connect(uv_connect_t* req, int status);
static void on_write(uv_write_t* req, int status);

static uv_loop_t *loop;

static uv_buf_t alloc_cb(uv_handle_t* handle, size_t size) {
return uv_buf_init(malloc(size), size);
}

void on_close(uv_handle_t* handle)
{
printf("closed.");
}

void on_write(uv_write_t* req, int status)
{
if (status) {
uv_err_t err = uv_last_error(loop);
fprintf(stderr, "uv_write error: %s\n", uv_strerror(err));
return;
}
printf("wrote.\n");
free(req);
//uv_close((uv_handle_t*)req->handle, on_close);
}

void on_read(uv_stream_t* tcp, ssize_t nread, uv_buf_t buf)
{
printf("on_read. %p\n",tcp);
if(nread >= 0) {
//printf("read: %s\n", tcp->data);
printf("read: %s\n", buf.base);
}
else {
//we got an EOF
uv_close((uv_handle_t*)tcp, on_close);
}

//cargo-culted
free(buf.base);
}

void write2(uv_stream_t* stream, char *data, int len2) {
uv_buf_t buffer[] = {
{.base = data, .len = len2}
};
uv_write_t *req = malloc(sizeof(uv_write_t));
uv_write(req, stream, buffer, 1, on_write);
}

void on_connect(uv_connect_t* connection, int status)
{
if (status < 0) {
printf("failed to connect\n"); return;
}
printf("connected. %p %d\n",connection, status);

uv_stream_t* stream = connection->handle;
free(connection);
write2(stream, "echo world!", 12);
uv_read_start(stream, alloc_cb, on_read);
}

void startConn(char *host, int port) {
uv_tcp_t *pSock = malloc(sizeof(uv_tcp_t));
uv_tcp_init(loop, pSock);
uv_tcp_keepalive(pSock, 1, 60);

struct sockaddr_in dest = uv_ip4_addr(host, port);

uv_connect_t *pConn = malloc(sizeof(uv_connect_t));
printf("allocated %p\n", pConn);
uv_tcp_connect(pConn, pSock, dest, on_connect);
}

int main(int argc, char **argv) {
loop = uv_default_loop();
int i;
for (i=0; i<10; i++)
startConn("0.0.0.0", 1234);

uv_run(loop, UV_RUN_DEFAULT);
}

最佳答案

此示例是针对 libuv 0.1 编译的。

在针对 libuv1.x 进行编译和运行后,它可以按预期工作。这是gist .

libuv 0.1 和 libuv 1.0 之间存在相当大的差异。希望这个版本对那些正在寻找 libuv.c 工作示例的人有所帮助。顺便说一句,github的libuv repo中有很多很好的例子,检查“test”子目录。

关于c - libuv在建立多个连接时速度慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43708446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com