LINUX.ORG.RU

История изменений

Исправление mix_mix, (текущая версия) :

выдаёт около 7-8 тысяч req/sec, вот этот, написанный на C и libuv http сервер

Попробуй без всяких левых http-серверов. Убедись только, что загрузка CPU будет 100%, иначе проблемы не в libuv.

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

void alloc_cb(uv_handle_t *handle, size_t size, uv_buf_t *buf)
{
    *buf = uv_buf_init(malloc(size), size);
}

void send_cb(uv_udp_send_t *req, int status)
{
    free(req);
}

void recv_cb(uv_udp_t *handle, ssize_t nread,
    const uv_buf_t *buf, const struct sockaddr *addr, unsigned flags)
{
    free(buf->base);
    if (nread <= 0) return;
    uv_udp_send_t *req = malloc(sizeof(*req));
    uv_buf_t ans = uv_buf_init("Hello world!", 13);
    uv_udp_send(req, handle, &ans, 1, addr, send_cb);
}

int main()
{
    uv_udp_t socket;
    struct sockaddr_in addr;
    uv_udp_init(uv_default_loop(), &socket);
    uv_ip4_addr("0.0.0.0", 6666, &addr);
    uv_udp_bind(&socket, (struct sockaddr *) &addr, 0);
    uv_udp_recv_start(&socket, alloc_cb, recv_cb);
    return uv_run(uv_default_loop(), UV_RUN_DEFAULT);
}

Исходная версия mix_mix, :

выдаёт около 7-8 тысяч req/sec, вот этот, написанный на C и libuv http сервер

Попробуй без всяких левых http-серверов. Убедись только, что загрузка CPU будет 100%, иначе проблемы не в libuv.

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

void alloc_cb(uv_handle_t *handle, size_t size, uv_buf_t *buf)
{
    *buf = uv_buf_init(malloc(size), size);
}

void send_cb(uv_udp_send_t *req, int status)
{
    free(req);
}

void recv_cb(uv_udp_t* handle, ssize_t nread,
    const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags)
{
    free(buf->base);
    if (nread <= 0) return;
    uv_udp_send_t *req = malloc(sizeof(*req));
    uv_buf_t ans = uv_buf_init("Hello world!", 13);
    uv_udp_send(req, handle, &ans, 1, addr, send_cb);
}

int main()
{
    uv_udp_t socket;
    struct sockaddr_in addr;
    uv_udp_init(uv_default_loop(), &socket);
    uv_ip4_addr("0.0.0.0", 6666, &addr);
    uv_udp_bind(&socket, (struct sockaddr *) &addr, 0);
    uv_udp_recv_start(&socket, alloc_cb, recv_cb);
    return uv_run(uv_default_loop(), UV_RUN_DEFAULT);
}