2012-02-28 2 views
1

저는 간단한 evhp 기반 서버를 만들었습니다. libevent의 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 개의 소켓이 한 번 사용되는 것을 목표로합니다. 맞습니까?

핸들러 함수에서 소켓을 닫아야합니까?

+0

"evbuffer_free (but)"이 맞는지 알 수 있습니다. –

답변

0

event2/* libs를 사용하기 시작하고 핸들러 함수의 끝에 evbuffer_free(buf)을 추가하고 작업을 수행했습니다.

1

파일 설명자를 열 때 설정된 ulimit은 무엇입니까? 예 : 'ulimit -n'명령을 실행하십시오 (따옴표 제외). 응용 프로그램에서 열 수있는 파일 설명자 수입니다. 증가 시키려면 ulimit 명령을 사용할 수 있습니다. 예 : ulimit -n 10240

+0

무제한으로 설명자를 설정 했으므로 문제가되지 않았습니다. –

관련 문제