17

Httpserver.h: Single header library for writing non-blocking HTTP servers in C

 4 years ago
source link: https://github.com/jeremycw/httpserver.h
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

#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!';
        }
    }
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK