#includeCompile and run#include #include #define SVR_IP "127.0.0.1" #define SVR_PORT 8080 void specific_cb (struct evhttp_request *req, void *arg) { struct evbuffer *evbuf; if ((evbuf = evbuffer_new()) == NULL) { printf("evbuffer_new() failed"); evhttp_send_reply(req, HTTP_INTERNAL, "Internal error", NULL); return; } /* Body */ evbuffer_add_printf(evbuf, "It's work!"); /* Response */ evhttp_send_reply(req, HTTP_OK, "OK", evbuf); /* Free resource */ evbuffer_free(evbuf); } void generic_cb (struct evhttp_request *req, void *arg) { /* Response */ evhttp_send_reply(req, HTTP_NOTFOUND, "Not found", NULL); } int main (int argc, char **argv) { struct event_base *evbase; struct evhttp *evhttp; /* Init event base */ if ((evbase = event_base_new()) == NULL) { printf("event_base_new() failed\n"); return -1; } /* Init evhttp */ if ((evhttp = evhttp_new(evbase)) == NULL) { printf("evhttp_new() failed\n"); return -1; } /* Set server IP, port */ if (evhttp_bind_socket(evhttp, SVR_IP, SVR_PORT) == -1) { printf("evhttp_bind_socket() failed\n"); return -1; } else { printf("Listening on [%s:%d]\n", SVR_IP, SVR_PORT); } /* Set a callback for specific path */ if (evhttp_set_cb(evhttp, "/test", specific_cb, NULL) < 0) { printf("evhttp_set_cb() failed\n"); return -1; } /* Set a callback for default path */ evhttp_set_gencb(evhttp, generic_cb, NULL); /* Enter event loop */ event_base_dispatch(evbase); /* Free resource */ evhttp_free(evhttp); event_base_free(evbase); return 0; }
$ gcc -g -Wall -o httpd httpd.c -levent -I/opt/libevent-2.0.12-stable/include/ -L/opt/libevent-2.0.12-stable/lib/ $ LD_LIBRARY_PATH=/opt/libevent-2.0.12-stable/lib ./httpd Listening on [127.0.0.1:8080]try to send a request to server...
$ wget -q -O - http://127.0.0.1:8080/test $ wget -S -O - http://127.0.0.1:8080/xxx不知道為什麼我用2.0.10-stable版本跑會有下列warning,用2.0.12-stable就沒問題了。
[warn] evhttp_connection_base_new: bufferevent_new failed: No such file or directory [warn] evhttp_get_request: cannot get connection on 9: No such file or directory
實際測試
測試工具: Apache benchmark# ab -n 100000 -c 1000 http://127.0.0.1:8080/testPlatform Amazon EC2 large instance: 7541.13 [Req/Sec]
Server Software:
Server Hostname: 127.0.0.1
Server Port: 8080
Document Path: /test
Document Length: 10 bytes
Concurrency Level: 1000
Time taken for tests: 13.260620 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 7408510 bytes
HTML transferred: 1001150 bytes
Requests per second: 7541.13 [#/sec] (mean)
Time per request: 132.606 [ms] (mean)
Time per request: 0.133 [ms] (mean, across all concurrent requests)
Transfer rate: 545.53 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 90 496.5 3 3113
Processing: 3 31 28.5 21 290
Waiting: 0 15 19.9 9 273
Total: 7 122 501.7 26 3255
Percentage of the requests served within a certain time (ms)
50% 26
66% 35
75% 47
80% 62
90% 97
95% 133
98% 3040
99% 3075
100% 3255 (longest request)
Platform Amazon EC2 Extra Large Instance: 8464.56 [Req/Sec]
Server Software:
Server Hostname: 127.0.0.1
Server Port: 8080
Document Path: /test
Document Length: 10 bytes
Concurrency Level: 1000
Time taken for tests: 11.813961 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 7400740 bytes
HTML transferred: 1000100 bytes
Requests per second: 8464.56 [#/sec] (mean)
Time per request: 118.140 [ms] (mean)
Time per request: 0.118 [ms] (mean, across all concurrent requests)
Transfer rate: 611.73 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 62 391.2 7 3068
Processing: 8 54 37.4 39 317
Waiting: 1 25 25.0 18 286
Total: 8 116 393.5 50 3322
Percentage of the requests served within a certain time (ms)
50% 50
66% 68
75% 91
80% 106
90% 130
95% 158
98% 233
99% 3046
100% 3322 (longest request)
其實在Amazon server上 CPU 和 Network 都是很不穩定的,畢竟是虛擬機器,所以測試結果正負1000 request都是有可能的。
沒有留言:
張貼留言