223 lines
5.7 KiB
Markdown
223 lines
5.7 KiB
Markdown
[](https://travis-ci.com/jeremycw/httpserver.h)
|
|
|
|
See `httpserver.h` for API documentation
|
|
|
|
# Description
|
|
|
|
httpserver.h is a single header C library for building event driven non-blocking HTTP servers
|
|
|
|
Supports Linux with epoll and BSD/Mac with kqueue.
|
|
|
|
# Example
|
|
|
|
```c
|
|
#define HTTPSERVER_IMPL
|
|
#include "httpserver.h"
|
|
|
|
#define RESPONSE "Hello, World!"
|
|
|
|
void handle_request(struct http_request_s* request) {
|
|
struct http_response_s* response = http_response_init();
|
|
http_response_status(response, 200);
|
|
http_response_header(response, "Content-Type", "text/plain");
|
|
http_response_body(response, RESPONSE, sizeof(RESPONSE) - 1);
|
|
http_respond(request, response);
|
|
}
|
|
|
|
int main() {
|
|
struct http_server_s* server = http_server_init(8080, handle_request);
|
|
http_server_listen(server);
|
|
}
|
|
|
|
```
|
|
|
|
See full documentation in `httpserver.h`
|
|
|
|
# Benchmark
|
|
|
|
I ran some micro-benchmarks with httpserver.h and NGINX serving a simple Hello, World!
|
|
The purpose here was just to get a performance reference point, not to try and make
|
|
any statement of superiority since httpserver.h is not a competitor or replacement for
|
|
NGINX.
|
|
|
|
## With `keep-alive`
|
|
`ab -k -c 200 -n 100000 http://localhost:8080/`
|
|
|
|
### NGINX 74441.26 requests/sec
|
|
```
|
|
Server Software: nginx/1.14.0
|
|
Server Hostname: localhost
|
|
Server Port: 8000
|
|
|
|
Document Path: /
|
|
Document Length: 13 bytes
|
|
|
|
Concurrency Level: 200
|
|
Time taken for tests: 1.343 seconds
|
|
Complete requests: 100000
|
|
Failed requests: 0
|
|
Keep-Alive requests: 99052
|
|
Total transferred: 20995260 bytes
|
|
HTML transferred: 1300000 bytes
|
|
Requests per second: 74441.26 [#/sec] (mean)
|
|
Time per request: 2.687 [ms] (mean)
|
|
Time per request: 0.013 [ms] (mean, across all concurrent requests)
|
|
Transfer rate: 15262.83 [Kbytes/sec] received
|
|
|
|
Connection Times (ms)
|
|
min mean[+/-sd] median max
|
|
Connect: 0 0 17.8 0 1029
|
|
Processing: 0 2 8.8 1 148
|
|
Waiting: 0 2 8.8 1 148
|
|
Total: 0 3 21.4 1 1150
|
|
|
|
Percentage of the requests served within a certain time (ms)
|
|
50% 1
|
|
66% 2
|
|
75% 2
|
|
80% 2
|
|
90% 2
|
|
95% 2
|
|
98% 3
|
|
99% 35
|
|
100% 1150 (longest request)
|
|
```
|
|
|
|
### httpserver.h 123907.91 requests/sec
|
|
```
|
|
Server Software:
|
|
Server Hostname: localhost
|
|
Server Port: 8080
|
|
|
|
Document Path: /
|
|
Document Length: 13 bytes
|
|
|
|
Concurrency Level: 200
|
|
Time taken for tests: 0.807 seconds
|
|
Complete requests: 100000
|
|
Failed requests: 0
|
|
Keep-Alive requests: 100000
|
|
Total transferred: 13400000 bytes
|
|
HTML transferred: 1300000 bytes
|
|
Requests per second: 123907.91 [#/sec] (mean)
|
|
Time per request: 1.614 [ms] (mean)
|
|
Time per request: 0.008 [ms] (mean, across all concurrent requests)
|
|
Transfer rate: 16214.51 [Kbytes/sec] received
|
|
|
|
Connection Times (ms)
|
|
min mean[+/-sd] median max
|
|
Connect: 0 0 0.1 0 4
|
|
Processing: 1 2 0.3 2 6
|
|
Waiting: 1 2 0.3 2 6
|
|
Total: 1 2 0.4 2 6
|
|
|
|
Percentage of the requests served within a certain time (ms)
|
|
50% 2
|
|
66% 2
|
|
75% 2
|
|
80% 2
|
|
90% 2
|
|
95% 2
|
|
98% 3
|
|
99% 3
|
|
100% 6 (longest request)
|
|
```
|
|
|
|
## With `Connection: close`
|
|
`ab -c 200 -n 100000 http://localhost:8080/`
|
|
|
|
### NGINX 15773.47 requests/sec
|
|
```
|
|
Server Software: nginx/1.14.0
|
|
Server Hostname: localhost
|
|
Server Port: 8000
|
|
|
|
Document Path: /
|
|
Document Length: 13 bytes
|
|
|
|
Concurrency Level: 200
|
|
Time taken for tests: 6.340 seconds
|
|
Complete requests: 100000
|
|
Failed requests: 0
|
|
Total transferred: 20500000 bytes
|
|
HTML transferred: 1300000 bytes
|
|
Requests per second: 15773.47 [#/sec] (mean)
|
|
Time per request: 12.680 [ms] (mean)
|
|
Time per request: 0.063 [ms] (mean, across all concurrent requests)
|
|
Transfer rate: 3157.77 [Kbytes/sec] received
|
|
|
|
Connection Times (ms)
|
|
min mean[+/-sd] median max
|
|
Connect: 0 4 40.6 3 1123
|
|
Processing: 1 8 46.7 4 508
|
|
Waiting: 1 7 46.7 3 508
|
|
Total: 3 12 64.5 6 1460
|
|
|
|
Percentage of the requests served within a certain time (ms)
|
|
50% 6
|
|
66% 7
|
|
75% 7
|
|
80% 8
|
|
90% 8
|
|
95% 9
|
|
98% 10
|
|
99% 503
|
|
100% 1460 (longest request)
|
|
```
|
|
|
|
### httpserver.h 27605.45 requests/sec
|
|
```
|
|
Server Software:
|
|
Server Hostname: localhost
|
|
Server Port: 8080
|
|
|
|
Document Path: /
|
|
Document Length: 13 bytes
|
|
|
|
Concurrency Level: 200
|
|
Time taken for tests: 3.622 seconds
|
|
Complete requests: 100000
|
|
Failed requests: 0
|
|
Total transferred: 12900000 bytes
|
|
HTML transferred: 1300000 bytes
|
|
Requests per second: 27605.45 [#/sec] (mean)
|
|
Time per request: 7.245 [ms] (mean)
|
|
Time per request: 0.036 [ms] (mean, across all concurrent requests)
|
|
Transfer rate: 3477.64 [Kbytes/sec] received
|
|
|
|
Connection Times (ms)
|
|
min mean[+/-sd] median max
|
|
Connect: 2 3 0.5 3 6
|
|
Processing: 1 4 0.7 4 8
|
|
Waiting: 1 3 0.8 3 7
|
|
Total: 4 7 0.6 7 11
|
|
|
|
Percentage of the requests served within a certain time (ms)
|
|
50% 7
|
|
66% 7
|
|
75% 8
|
|
80% 8
|
|
90% 8
|
|
95% 8
|
|
98% 9
|
|
99% 9
|
|
100% 11 (longest request)
|
|
```
|
|
|
|
### NGINX conf
|
|
|
|
```
|
|
worker_processes 1;
|
|
|
|
http {
|
|
server {
|
|
listen 8000;
|
|
location / {
|
|
add_header Content-Type text/plain;
|
|
return 200 'Hello, World!';
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|