Слишком много открытых файлов на сервере libevent на базе evhttp - PullRequest
1 голос
/ 28 февраля 2012

Я создал простой сервер на основе evhttp.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <event.h>
#include <evhttp.h>

void
handler(struct evhttp_request *req, void *arg) {
  struct evbuffer *buf;
  buf = evbuffer_new();

  if(buf == NULL) {
    fprintf(stderr, "ERROR: Failed to create response buffer\n");
    exit(EXIT_FAILURE);
  }

  evbuffer_add_printf(buf, "Server called");
  evhttp_send_reply(req, HTTP_OK, "OK", buf);
}

int
main(int argc, char **argv) {
  struct evhttp *http;

  event_init();
  http = evhttp_start("0.0.0.0", 8081);

  evhttp_set_gencb(http, handler, NULL);

  event_dispatch();
  evhttp_free(http);

  exit(EXIT_SUCCESS);
}

Когда я начал тестировать его, используя

ab -r -n 1000 -c 50 http://0.0.0.0:8081/

Я получаю эти предупреждения после некоторого количества попыток:

[warn] Error from accept() call: Too many open files

Это вроде я не закрываю сокеты ... Уровень параллелизма 50 нацелен на то, чтобы время использовалось только 50 сокетами, верно?

Должен ли я закрыть сокет вфункция обработчика?

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Что такое ulimit для открытия файловых дескрипторов? Например. попробуйте выполнить команду 'ulimit -n' (без кавычек). Это количество дескрипторов файлов, которые можно открыть в вашем приложении. Для увеличения вы можете использовать команду ulimit. например ulimit -n 10240

0 голосов
/ 28 февраля 2012

Я начал использовать event2/* libs и добавил evbuffer_free(buf) в конце функции обработчика, и он сделал свою работу.

...