2012-02-28 6 views
1

私は単純なevhttpベースのサーバを作成しました。私はlibeventのevhttpベースのサーバで開いているファイルが多すぎます

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

を使用してそれをベンチマーキングし始めたとき

#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); 
} 

私は試行のいくつかの数の後にこれらの警告を取得しています:

[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

これは問題にならないようにディスクリプタを無制限に設定しました。 –

関連する問題