Pull to refresh
513
0
Слава Вишняков @yoihj

Нагруженные бэкэнды

Send message

Только вот характеристики тут тогда принципиально отличаются. Тарантул (насколько я понимаю) если сказал "сделано" — то оно сохранено на диске. А вот in-memory не сохраняют на диск ничего.

конвертация в JSON и обратно зачастую тоже довольно медленная вещь

я пытался в минимальном самом простом виде воспроизвести JSON API доступный по HTTP. последним шагом в JSON API идет конвертация в JSON

nginx.conf


 worker_processes 1; # ходим в 1 процесс - увиличивем если балансируем в N tnt

Брал все из gist. Воркеров чего nginx или golang? Если golang — то я в самом начале статьи сказал, что на одно ядро производительность сравнима (или, может, даже лучше :) ).

nginx.conf


upstream go {
  server 127.0.0.1:8080;
  keepalive 10000;
}

upstream tnt {
  server 127.0.0.1:10001; # ходим в 1 tarantool -- можно балансировать в больше
  keepalive 10000;
}

server {
    listen 8081 default;

    server_name tnt;

    location = /tnt {
      tnt_pass_http_request on; # пропускам http данные
      tnt_http_rest_methods get; # только get
      tnt_method 'handler'; # вызываем function handler()
      tnt_pass tnt;
    }

    location = /go {
      proxy_pass go;
    }
}

Test:


➜  nginx git:(master) ✗ curl 127.0.0.1:8081/go
"bar"%                                                                                                                                                                                                                                                                        ➜  nginx git:(master) ✗ wrk -t 4 -c 10 -d 5 --latency http://127.0.0.1:8081/go
Running 5s test @ http://127.0.0.1:8081/go
  4 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   297.07us  188.09us   5.74ms   92.84%
    Req/Sec     6.79k   353.23     7.91k    79.80%
  Latency Distribution
     50%  268.00us
     75%  352.00us
     90%  444.00us
     99%  841.00us
  137159 requests in 5.10s, 15.83MB read
Requests/sec:  26896.15
Transfer/sec:      3.10MB
➜  nginx git:(master) ✗ wrk -t 10 -c 100 -d 5 --latency http://127.0.0.1:8081/go
Running 5s test @ http://127.0.0.1:8081/go
  10 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     3.11ms    1.33ms  17.15ms   76.48%
    Req/Sec     3.24k     1.05k   25.94k    99.60%
  Latency Distribution
     50%    3.02ms
     75%    3.73ms
     90%    4.60ms
     99%    7.18ms
  161791 requests in 5.10s, 18.67MB read
Requests/sec:  31711.10
Transfer/sec:      3.66MB

[удален, не туда ответил]

давайте, только не обещаю сильно активно участвовать — работа тоже есть :)

В целом (у меня тоже мак, так что оставил kqueue) nginx_upstream получилось так (код взят из gist)


➜  nginx git:(master) ✗ curl 127.0.0.1:8081/tnt
{"id":0,"result":[["bar"]]}%                                                                                                                                                                                                                                                  ➜  nginx git:(master) ✗ wrk -t 4 -c 10 -d 5 --latency http://127.0.0.1:8081/tnt
Running 5s test @ http://127.0.0.1:8081/tnt
  4 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   550.88us  144.06us   2.28ms   74.29%
    Req/Sec     3.61k   536.23     4.10k    81.37%
  Latency Distribution
     50%  516.00us
     75%  610.00us
     90%  766.00us
     99%    0.96ms
  73337 requests in 5.10s, 14.55MB read
Requests/sec:  14381.01
Transfer/sec:      2.85MB
➜  nginx git:(master) ✗ wrk -t 10 -c 100 -d 5 --latency http://127.0.0.1:8081/tnt
Running 5s test @ http://127.0.0.1:8081/tnt
  10 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     9.14ms    2.49ms  18.70ms   66.40%
    Req/Sec     1.09k   437.60     9.36k    93.01%
  Latency Distribution
     50%    9.31ms
     75%   10.88ms
     90%   12.11ms
     99%   13.64ms
  54184 requests in 5.10s, 10.75MB read
Requests/sec:  10626.29
Transfer/sec:      2.11MB

Вроде поставил все, но результат что-то немного другой:


➜  nginx git:(master) ✗ curl 127.0.0.1:8081/tnt
{"id":0,"result":[["bar"]]}

а должен быть


"bar"

хотя вроде


  return { var[2] } -- только bar

А где чат?

Вы задали ровно тот же вопрос, на который я уже ответил.
Заинтриговали, пойду tnt_pass попробую :)
Да, там еще нюанс упущен

https://gist.github.com/dedok/d84b82b2863b778f47ca05c17cbf3b25

Я финальным шагом `bar` в json конвертирую, т.е. в `«bar»` — конвертация в JSON и обратно зачастую тоже довольно медленная вещь. Поэтому и в Go, и в Tarantool проверял это последним шагом.
P.S. Бинарный протокол-то я протестировал из Go (там добавил в статью) и результат примерно на уровне. Т.е. теории 2 у меня — либо клиент go-tarantool тормозит (что не исключено из-за использования interface{}, но оно тут неизбежно), либо все же дело не в http сервере tarantool.
Я уже отвечал на этот аргумент тут

Если мне нужен Фотошоп для одного фильтра — я имею право сравнивать Фотошоп и программу, имеющую только этот один фильтр.

Реализация k-v хранилища тут примерно одинаковая. Да, в Tarantool есть другие возможности — я это написал в статье и в комментариях несколько раз. Да, сравнивается конкретный случай — я это тоже написал и в статье, и в комментариях.
Ну, я думал это само собой разумеется, что тест для отдельного случая и я вовсе не говорю что Tarantool надо забросить и он никуда не годится.

Просто в обратную сторону тоже можно также бросить — реализуйте в Tarantool ВЕСЬ функционал всех библиотек Go, а потом сравнивайте…

Сравнение вполне конкретное, более того — Tarantool выглядит достойно. Я описал минусы по которым он мне в моем случае не подходит, но это ж не значит что это случай всех и вся.
https://github.com/valyala/fasthttp выглядит интересно, но как-то не очень понятно как это скрестить с zero-downtime restarts — а это, в общем-то, довольно важно.
Тест через wrk = многопоточный + мультиплексирование (4 потока, 10 соединений и 10 потоков, 100 соединений)

К сожалению, уже не осталось времени тестировать что-то подобное. Вполне возможно, хотя последний добавленный тест go+go-tarantool, в общем-то, надежды большой не дал.
Добавил сравнение в конец статьи, оказалось, к сожалению, не быстрее. Думаю что это сильно связано с тем, что постоянно приходится типы из interface{} в строки переводить — но тут так реализован клиент — процессоры горят на полную.
1
23 ...

Information

Rating
Does not participate
Location
Москва и Московская обл., Россия
Date of birth
Registered
Activity