使用基于 libevent 的 evhttp 的服务器打开的文件过多

Posted

技术标签:

【中文标题】使用基于 libevent 的 evhttp 的服务器打开的文件过多【英文标题】:Too many open files with libevent's evhttp based server 【发布时间】:2012-02-28 00:02:21 【问题描述】:

我已经创建了简单的基于 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 个套接字,对吗?

我应该在处理函数中关闭套接字吗?

【问题讨论】:

我猜是不是“evbuffer_free(but)” 【参考方案1】:

打开文件描述符的 ulimit 设置是什么?例如。尝试执行 'ulimit -n' 命令(不带引号)。这些是允许在您的应用程序中打开的文件描述符的数量。要增加你可以使用 ulimit 命令。例如 ulimit -n 10240

【讨论】:

我设置了无限数量的描述符,所以这不是问题。【参考方案2】:

我开始使用 event2/* 库,并在处理函数的末尾添加了 evbuffer_free(buf),它完成了这项工作。

【讨论】:

以上是关于使用基于 libevent 的 evhttp 的服务器打开的文件过多的主要内容,如果未能解决你的问题,请参考以下文章

libevent(十三)evhttp事件处理流程

libevent evhttp多线程

libevent evhttp多线程

libevent evhttp多线程

libevent evhttp多线程

Libevent::evhttp服务器下载