1

シンプルな 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個だけであることを目指していますよね?

ハンドラー関数でソケットを閉じることになっていますか?

4

2 に答える 2

1

ファイル記述子を開くために設定されたulimitとは何ですか?例えば。'ulimit -n'コマンド(引用符なし)を実行してみてください。これらは、アプリケーションで開くことができるファイル記述子の数です。増やすには、ulimitコマンドを使用できます。例:ulimit -n 10240

于 2012-03-16T10:17:00.843 に答える
0

私はevent2/*libsを使い始めevbuffer_free(buf)、ハンドラー関数の最後に追加しました、そしてそれは仕事をしました。

于 2012-02-28T15:09:25.740 に答える