g-wan - воспроизведение заявлений о производительности

Использование gwan_linux64-bit.tar.bz2 под Ubuntu 12.04 LTS распаковка и запуск gwan

затем указать на него wrk (используя нулевой файл null.html)

wrk --timeout 10 -t 2 -c 100 -d20s http://127.0.0.1:8080/null.html
Running 20s test @ http://127.0.0.1:8080/null.html
  2 threads and 100 connections
    Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    11.65s     5.10s   13.89s    83.91%
    Req/Sec     3.33k     3.65k   12.33k    75.19%
  125067 requests in 20.01s, 32.08MB read
  Socket errors: connect 0, read 37, write 0, timeout 49
Requests/sec:   6251.46
Transfer/sec:      1.60MB

.. очень плохая производительность, на самом деле, похоже, есть какая-то огромная проблема с задержкой. Во время теста gwan загружен на 200%, а wrk — на 67%.

Указывая на nginx, wrk занят на 200%, а nginx на 45%:

wrk --timeout 10 -t 2 -c 100 -d20s http://127.0.0.1/null.html
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   371.81us  134.05us  24.04ms   91.26%
    Req/Sec    72.75k     7.38k  109.22k    68.21%
  2740883 requests in 20.00s, 540.95MB read
Requests/sec: 137046.70
Transfer/sec:     27.05MB

Указание weighttpd на nginx дает еще более быстрые результаты:

/usr/local/bin/weighttp -k -n 2000000 -c 500 -t 3 http://127.0.0.1/null.html
weighttp - a lightweight and simple webserver benchmarking tool

starting benchmark...
spawning thread #1: 167 concurrent requests, 666667 total requests
spawning thread #2: 167 concurrent requests, 666667 total requests
spawning thread #3: 166 concurrent requests, 666666 total requests
progress:   9% done
progress:  19% done
progress:  29% done
progress:  39% done
progress:  49% done
progress:  59% done
progress:  69% done
progress:  79% done
progress:  89% done
progress:  99% done

finished in 7 sec, 13 millisec and 293 microsec, 285172 req/s, 57633 kbyte/s
requests: 2000000 total, 2000000 started, 2000000 done, 2000000 succeeded, 0 failed, 0 errored
status codes: 2000000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 413901205 bytes total, 413901205 bytes http, 0 bytes data

Сервер представляет собой виртуальный 8-ядерный выделенный сервер (голое железо), под KVM

Где я могу начать поиск, чтобы определить проблему, с которой gwan сталкивается на этой платформе?

Я тестировал lighttpd, nginx и node.js на этой же ОС, и все результаты были такими, как и следовало ожидать. Сервер был настроен обычным образом с расширенными эфемерными портами, увеличенными ulimits, скорректированным перезапуском времени ожидания и т. д.


person user2603628    schedule 05.11.2013    source источник
comment
Мы только что исправили проблему с пустым файлом в G-WAN v4.11.7, и G-WAN теперь в два раза быстрее, чем Nginx, и в этой игре.   -  person Gil    schedule 07.11.2013


Ответы (1)


ОБНОВЛЕНИЕ 7 ноября: мы исправили проблему с пустым файлом в G-WAN v4.11.7, и теперь G-WAN работает в два раза быстрее (с отключенным кэшем www), чем Nginx, и в этой игре.

Последние выпуски G-WAN работают быстрее, чем Nginx, с небольшими и большими файлами, а кэши G-WAN отключены по умолчанию, чтобы людям было проще сравнивать G-WAN с другими серверами, такими как Nginx.

Nginx имеет несколько функций кэширования (кэш fd для пропуска вызовов stat() и модуль на основе memcached), но оба они обязательно намного медленнее, чем локальный кеш G-WAN.

Отключение кэширования также желательно для некоторых приложений, таких как CDN. Другие приложения, такие как приложения AJAX, значительно выигрывают от возможностей кэширования G-WAN, поэтому кэширование можно повторно включить по желанию, даже для каждого запроса.

Надеюсь, это прояснит этот вопрос.


"воспроизведение заявлений о производительности"

Во-первых, название вводит в заблуждение, поскольку в плохо документированном* тесте выше не используются ни те инструменты, ни ресурсы HTTP, полученные в ходе тестов G-WAN.

[*] где твой nginx.conf файл? каковы заголовки ответов HTTP двух серверов? какой у вас "чистый" 8-ядерный процессор?

Тесты G-WAN основаны на ab.c, оболочке, написанной командой G-WAN для http://redmine.lighttpd.net/projects/weighttp/wiki (тестовый инструмент, созданный командой сервера Lighttpd), поскольку информация, раскрытая ab. c гораздо информативнее.

Во-вторых, проверенный файл "null.html" является... пустым файлом.

Мы не будем тратить время на обсуждение неуместности такого теста (сколько пустых HTML-файлов обслуживает ваш веб-сайт?), но, скорее всего, именно он является причиной наблюдаемого "плохого производительность".

G-WAN не был создан для обслуживания пустых файлов (и мы никогда не пытались и нас никогда не просили сделать это). Но мы обязательно добавим эту функцию, чтобы избежать путаницы, создаваемой таким тестом.

Если вы хотите "проверить утверждения", я рекомендую вам использовать weighttp (самый быстрый инструмент загрузки HTTP в вашем тесте) с файлом 100.bin (100-байтовый файл с несжимаемым типом MIME: no Здесь будет задействован Gzip).

С ненулевым файлом Nginx значительно медленнее, чем G-WAN, даже в независимых тестах.

Пока мы ничего не знали о wrk, но похоже, что это инструмент, созданный Nginx. команда:

"wrk был написан специально для того, чтобы попытаться довести nginx до предела, и в первом раунде тестов скорость была увеличена до 0,5 Мр/с."


ОБНОВЛЕНИЕ (день спустя)

Поскольку вы не удосужились опубликовать больше данных, мы это сделали:

                    wrk                  weighttp
           ----------------------- -----------------------
Web Server 0.html RPS 100.html RPS 0.html RPS 100.html RPS
---------- ---------- ------------ ---------- ------------
G-WAN       80,783.03   649,367.11    175,515      717,813
Nginx      198,800.93   179,939.40    184,046      199,075

Как и в вашем тесте, мы видим, что wrk немного медленнее, чем weighttp.

Мы также видим, что G-WAN быстрее, чем Nginx, с обоими инструментами загрузки HTTP.

Вот подробные результаты:


G-WAN

./wrk -c300 -d3 -t6 "http://127.0.0.1:8080/0.html"
Running 3s test @ http://127.0.0.1:8080/0.html
  6 threads and 300 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     3.87ms    5.30ms  80.97ms   99.53%
    Req/Sec    14.73k     1.60k   16.33k    94.67%
  248455 requests in 3.08s, 55.68MB read
  Socket errors: connect 0, read 248448, write 0, timeout 0
Requests/sec:  80783.03
Transfer/sec:     18.10MB

./wrk -c300 -d3 -t6 "http://127.0.0.1:8080/100.html"
Running 3s test @ http://127.0.0.1:8080/100.html
  6 threads and 300 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   263.15us  381.82us  16.50ms   99.60%
    Req/Sec   115.55k    14.38k  154.55k    82.70%
  1946700 requests in 3.00s, 655.35MB read
Requests/sec: 649367.11
Transfer/sec:    218.61MB


weighttp -kn300000 -c300 -t6 "http://127.0.0.1:8080/0.html"
  progress: 100% done
finished in 1 sec, 709 millisec and 252 microsec, 175515 req/s, 20159 kbyte/s
requests: 300000 total, 300000 started, 300000 done, 150147 succeeded, 149853 failed, 0 errored
status codes: 150147 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 35284545 bytes total, 35284545 bytes http, 0 bytes data

weighttp -kn300000 -c300 -t6 "http://127.0.0.1:8080/100.html"
  progress: 100% done
finished in 0 sec, 417 millisec and 935 microsec, 717813 req/s, 247449 kbyte/s
requests: 300000 total, 300000 started, 300000 done, 300000 succeeded, 0 failed, 0 errored
status codes: 300000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 105900000 bytes total, 75900000 bytes http, 30000000 bytes data

Nginx

./wrk -c300 -d3 -t6 "http://127.0.0.1:8080/100.html"
Running 3s test @ http://127.0.0.1:8080/100.html
  6 threads and 300 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.54ms    1.16ms  11.67ms   72.91%
    Req/Sec    34.47k     6.02k   56.31k    70.65%
  539743 requests in 3.00s, 180.42MB read
Requests/sec: 179939.40
Transfer/sec:     60.15MB

./wrk -c300 -d3 -t6 "http://127.0.0.1:8080/0.html"
Running 3s test @ http://127.0.0.1:8080/0.html
  6 threads and 300 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.44ms    1.15ms   9.37ms   75.93%
    Req/Sec    38.16k     8.57k   62.20k    69.98%
  596070 requests in 3.00s, 140.69MB read
Requests/sec: 198800.93
Transfer/sec:     46.92MB


weighttp -kn300000 -c300 -t6 "http://127.0.0.1:8080/0.html"
  progress: 100% done
finished in 1 sec, 630 millisec and 19 microsec, 184046 req/s, 44484 kbyte/s
requests: 300000 total, 300000 started, 300000 done, 300000 succeeded, 0 failed, 0 errored
status codes: 300000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 74250375 bytes total, 74250375 bytes http, 0 bytes data

weighttp -kn300000 -c300 -t6 "http://127.0.0.1:8080/100.html"
  progress: 100% done
finished in 1 sec, 506 millisec and 968 microsec, 199075 req/s, 68140 kbyte/s
requests: 300000 total, 300000 started, 300000 done, 300000 succeeded, 0 failed, 0 errored
status codes: 300000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 105150400 bytes total, 75150400 bytes http, 30000000 bytes data

Файл конфигурации Nginx пытается соответствовать поведению G-WAN

# ./configure --without-http_charset_module --without-http_ssi_module 
#  --without-http_userid_module --without-http_rewrite_module 
#  --without-http_limit_zone_module --without-http_limit_req_module

user                 www-data;
worker_processes     6;
worker_rlimit_nofile 500000;
pid                  /var/run/nginx.pid;

events {
    # tried other values up to 100000 without better results
    worker_connections   4096;
    # multi_accept on; seems to be slower
    multi_accept         off;
    use                  epoll;
}

http {
    charset              utf-8; # HTTP "Content-Type:" header
    sendfile             on;
    tcp_nopush           on;
    tcp_nodelay          on;
    keepalive_timeout    10;
    keepalive_requests   10; # 1000+ slows-down nginx  enormously...

    types_hash_max_size  2048;
    include              /usr/local/nginx/conf/mime.types;
    default_type         application/octet-stream;

    gzip                 off; # adjust for your tests
    gzip_min_length      500;

    gzip_vary            on; # HTTP "Vary: Accept-Encoding" header
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

   # cache metadata (file time, size, existence, etc) to prevent syscalls 
   # this does not cache file contents. It should helps in benchmarks where
   # a limited number of files is accessed more often than others (this is
   # our case as we serve one single file fetched repeatedly)
   # THIS IS ACTUALY SLOWING-DOWN THE TEST...
   #
   # open_file_cache           max=1000 inactive=20s;
   # open_file_cache_errors    on;
   # open_file_cache_min_uses  2;
   # open_file_cache_valid     300s;

   server {
      listen               127.0.0.1:8080;

       access_log           off;

       # only log critical errors
      #error_log            /usr/local/nginx/logs/error.log crit;
      error_log             /dev/null crit;

      location / {
                           root     /usr/local/nginx/html;
                           index    index.html;
      }
      location = /nop.gif {
                           empty_gif;
      }
      location /imgs {
                           autoindex on;
      }
   }
}

Комментарии приветствуются, особенно от экспертов Nginx, для обсуждения на основе этого полностью документированного теста.

person Community    schedule 06.11.2013