libmicrohttpd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libmicrohttpd] Performance issues again (compared to latest Nginx)


From: silvioprog
Subject: [libmicrohttpd] Performance issues again (compared to latest Nginx)
Date: Sun, 31 May 2020 13:20:15 -0300

Hi.

I have been testing (again) MHD and Nginx with a static content and noticed MHD is around two times slower than Nginx, but I'm not sure if the slowness is related to MHD or something I'm doing wrong.

Test built with MHD

#include <stdio.h>
#include <memory.h>
#include <microhttpd.h>

#define PAGE                                                                   \
  "<!DOCTYPE html>\n\
<html lang=\"en\">\n\
  <head>\n\
    <meta charset=\"UTF-8\" />\n\
    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n\
    <title>Hello world benchmark</title>\n\
  </head>\n\
  <body>\n\
    This is a static content to check the performance of the following HTTP\n\
    servers:\n\
    <ul>\n\
      <li>MHD</li>\n\
      <li>nginx</li>\n\
    </ul>\n\
  </body>\n\
</html>"

static enum MHD_Result ahc_echo(void *cls, struct MHD_Connection *con,
                                const char *url, const char *method,
                                const char *version, const char *upload_data,
                                size_t *upload_data_size, void **ptr) {
  struct MHD_Response *res;
  enum MHD_Result ret;
  if ((void *)1 != *ptr) {
    *ptr = (void *)1;
    return MHD_YES;
  }
  *ptr = NULL;
  res = MHD_create_response_from_buffer(strlen(PAGE), PAGE,
                                        MHD_RESPMEM_PERSISTENT);
  ret = MHD_queue_response(con, MHD_HTTP_OK, res);
  MHD_destroy_response(res);
  return ret;
}

int main() {
  struct MHD_Daemon *d;
  d = MHD_start_daemon(
      MHD_USE_EPOLL_INTERNAL_THREAD | MHD_SUPPRESS_DATE_NO_CLOCK |
          MHD_USE_EPOLL_TURBO,
      8080, NULL, NULL, &ahc_echo, NULL, MHD_OPTION_CONNECTION_TIMEOUT,
      (unsigned int)120, MHD_OPTION_THREAD_POOL_SIZE,
      (unsigned int)sysconf(_SC_NPROCESSORS_ONLN), MHD_OPTION_CONNECTION_LIMIT,
      (unsigned int)10000, MHD_OPTION_END);
  getchar();
  MHD_stop_daemon(d);
  return 0;
}

Nginx stuff

Version: 1.18.0

Config:

$ cat /etc/nginx/nginx.conf

worker_processes auto;
worker_cpu_affinity auto;
events {
    worker_connections  10000;
}
http {
    access_log off;
    keepalive_timeout 65;
    server {
        listen 8080 default_server;
...


$ cat /usr/share/nginx/html/index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Hello world benchmark</title>
  </head>
  <body>
    This is a static content to check the performance of the following HTTP
    servers:
    <ul>
      <li>MHD</li>
      <li>nginx</li>
    </ul>
  </body>
</html>


Environment

$ lscpu

Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   43 bits physical, 48 bits virtual
CPU(s):                          8
On-line CPU(s) list:             0-7
Thread(s) per core:              2
Core(s) per socket:              4
Socket(s):                       1
NUMA node(s):                    1
Vendor ID:                       AuthenticAMD
CPU family:                      23
Model:                           24
Model name:                      AMD Ryzen 7 3700U with Radeon Vega Mobile Gfx
Stepping:                        1
Frequency boost:                 enabled
CPU MHz:                         2100.611
CPU max MHz:                     2300.0000
CPU min MHz:                     1400.0000
BogoMIPS:                        4591.70
Virtualization:                  AMD-V
L1d cache:                       128 KiB
L1i cache:                       256 KiB
L2 cache:                        2 MiB
L3 cache:                        4 MiB
NUMA node0 CPU(s):               0-7

$ cat /proc/version

Linux version 5.6.14-300.fc32.x86_64 (mockbuild@bkernel03.phx2.fedoraproject.org) (gcc version 10.1.1 20200507 (Red Hat 10.1.1-1) (GCC)) #1 SMP Wed May 20 20:47:32 UTC 2020


Finally, the tests using wrk!

wrk results (avg, after three intervaled tests) for Nginx:

Running 10s test @ http://127.0.0.1:8080/
  10 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     7.71ms    3.61ms  72.10ms   74.14%
    Req/Sec    12.37k     1.46k   26.09k    82.34%
  Latency Distribution
     50%    6.96ms
     75%    9.29ms
     90%   12.65ms
     99%   18.26ms
  1228942 requests in 10.09s, 717.21MB read
Requests/sec: 121831.57
Transfer/sec:     71.10MB


wrk results (avg) for MHD

Running 10s test @ http://127.0.0.1:8080/
  10 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    12.18ms    7.47ms  59.49ms   71.56%
    Req/Sec     7.50k     1.54k   16.48k    68.81%
  Latency Distribution
     50%   10.72ms
     75%   16.23ms
     90%   22.37ms
     99%   35.05ms
  745561 requests in 10.09s, 310.72MB read
Requests/sec:  73908.50
Transfer/sec:     30.80MB


Those tests were done in localhost just to illustration, but I did the same tests at an external server remotely (with some limits due to internet bandwidth) providing a larger content (around 150 kB) and got slower results with MHD.

I don't know if there is any specific configuration to increase the MHD speed again. BTW I would appreciate it and retest to get better results.

TIA for any help! 👍

--
Silvio Clécio

reply via email to

[Prev in Thread] Current Thread [Next in Thread]