GithubHelp home page GithubHelp logo

mailruchamps / hlcupdocs Goto Github PK

View Code? Open in Web Editor NEW
152.0 32.0 34.0 384.33 MB

High-loaded systems developer contest

Home Page: https://highloadcup.ru

Dockerfile 11.63% Shell 0.76% Python 87.61%
highloadcup tank mailru cups

hlcupdocs's People

Contributors

atercattus avatar butorov avatar dmitrynaum avatar ei-grad avatar geoolekom avatar kasatkinamariya avatar klpx avatar kswaldemar avatar maxlipsky avatar sannikovdmitry avatar sat2707 avatar xammi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hlcupdocs's Issues

Content-Length не совпадает с длиной Body

При POST запросах Content-Length не совпадает с длиной Body из-за дополнительного символа переноса строки. Из-за этого сервер не может нормально работать.

Значение заголовка Connection в патронах

В патронах установлено значение Close, первая буква - заглавная. По стандарту* значение этого заголовка должно обрабатываться как case-insensitive, но некоторые реализации http-серверов (например, fasthttp на go) реагируют только на значение равное close, где все буквы маленькие.

Эта ситуация приводит к неочевидным различиям в поведении реализаций сервиса при тестировании. Например, если сервис игнорирует значение этого заголовка на фазах с GET запросами, то он получает преимущество за счет расхождения его поведения со спецификацией HTTP/1.1, так как yandex-tank не проверяет значение заголовка Connection в отправляемых запросах, и не контроллирует закрытие соединения сервером. А на фазах POST из за особенностей yandex-tank соединение необходимо закрывать после каждого запроса, в противном случае он не корректно обрабатывает ответ сервиса, и участники соревнования видят в результатах обстрела ошибку "Response is empty".

Возможно, во второй фазе стоит заменить Close на close, а в первой и третьей - заголовок Connection убрать.

[*] https://tools.ietf.org/html/rfc7230#section-6.1

Перцентили и мониторинг

Хочется в графиках кроме max/min видеть ещё avg и 95/90/75/50 перцентили.

Ещё было бы классно иметь возможность видеть что происходит на машине в момент стрельбы (процессор, память, переключения контекста).

Вообще, как вариант, можно дать пользователю возможность установить токен и отправлять результаты его стрельб в overload.yandex.net (или другой сервис). Правильно понимаю, что в онлайне стрельбу мониторить стандартным plugin_uploader=yandextank.plugins.DataUploader overload архитектура сети не позволит?

Кнопка отмены тестирования решения

По себе заметил частая ситуация, когда посылаешь что-то в тестирование, а затем почти сразу находишь новый баг, в связи с чем предыдущая посылка уже не имеет смысла. В ожидании оно может висеть долго, хотелось бы иметь возможность отменить обстрел до его запуска в случае, если он уже не актуален.

ENV переменная с временем прогрева REOPEN

В #33 я просил предоставить приложению время старта для осуществления прогрева, но в тикете добавили время генерации тестов, которое абсолютно не соответствует задаче: оно меняется раз в сутки насколько я понимаю.
Приложению нужно знать до какого момента времени можно прогревать себя.

Environment variable для вида прогона

Перменная окружения, которая говорит, тестовый это прогон или рейтинговый, ну или локальный. Для оценки времени прогрева, настройки портов без докера для локальной отладки и тп.

ENV переменная с временем прогрева

Нужна env переменная, доступная приложению с временем до начала обстрела, поскольку для тестовых прогонов это 30 секунд, а для рейтингового -- 3 минуты, хорошо бы знать сколько доступно времени для прогрева.

Описать логику сравнения возраста

Я понял так;

Алгоритм преобразования возраста в timestamp:

  1. Взять current unix timestamp
  2. Преобразовать его в дату в UTC
  3. Сделать seconds = minute = hours = 0
  4. Сделать years = years - age
  5. Преобразовать в unix timestamp

Если нам пришел запрос с fromAge=AAA&toAge=BBB, то получаем по описанному выше алгоритму
fromAgeTimestamp и toAgeTimestamp

Для включения пользователя в выборку проверяем:

if (fromAgeTimestamp <= userBirthdayTimestamp && userBirthdayTimestamp <= toAgeTimestamp) {
...
}

Я все правильно описал?

Прошу исправить меня если я не прав и перенести верный алгоритм в документацию

Тестовый прогон под нагрузкой

Пожалуй было бы неплохо на будущее (особенно когда и если добавят rps) иметь возможность короткого тестового прогона, но с нагрузкой, близкой к той, которая будет в рейтинговом тестировании.

Проблема со временем обработки первых запросов

У многих не стабильно проявляется проблема со значительно большим среднего временем ответа у первых запросов.
Для решений, не использующих "прогрев"/JIT, это очень странно.

Хорошо бы проверить, что дело не в самом тестировании и тестере.

Если это не так, то хорошо бы получить какие подробности поведения тестируемого решения в эти первые секунды.

Transfer-Encoding: chunked

Пулемёт должен поддерживать ответы сервера с Transfer-Encoding: chunked. Асинхронная обработка запроса, особенно там, где ожидается ответ в виде коллекции, может сильно выигрывать от chunked запроса. Сейчас приходится результат запроса закачивать в память, сериализовать в массив байт и отправлять уже его, чтобы заранее узнать Content-Length

Нужна инструкция для запуска танка на Windows

Не получается запустить танк на Windows 10.

docker run -v /$(pwd):/var/loadtest --net host -it --rm direvius/yandex-tank -c load/load_1.ini

08:21:44 [WARNING] /etc/yandex-tank is not accessible to get configs list
08:21:44 [INFO] Loading configs...
08:21:44 [INFO] Loading plugins...
08:21:44 [INFO] Performing test
08:21:44 [INFO] Configuring plugins...
08:21:44 [INFO] Resolved 127.0.0.1 into 127.0.0.1:80
08:21:44 [INFO] Configuring StepperWrapper...
08:21:44 [WARNING] Mandatory option config was not found in section telegraf
08:21:44 [WARNING] Mandatory option config was not found in section monitoring
08:21:44 [WARNING] Mandatory option default_target was not found in section telegraf
08:21:44 [WARNING] Mandatory option default_target was not found in section monitoring
08:21:44 [INFO] Preparing test...
08:21:44 [INFO] Exception: Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/yandextank/core/consoleworker.py", line 268, in perform_test
    self.core.plugins_prepare_test()
  File "/usr/local/lib/python2.7/dist-packages/yandextank/core/tankcore.py", line 274, in plugins_prepare_test
    plugin.prepare_test()
  File "/usr/local/lib/python2.7/dist-packages/yandextank/plugins/Phantom/plugin.py", line 101, in prepare_test
    self.config = self.phantom.compose_config()
  File "/usr/local/lib/python2.7/dist-packages/yandextank/plugins/Phantom/utils.py", line 111, in compose_config
    streams_config += stream.compose_config()
  File "/usr/local/lib/python2.7/dist-packages/yandextank/plugins/Phantom/utils.py", line 288, in compose_config
    self.stepper_wrapper.prepare_stepper()
  File "/usr/local/lib/python2.7/dist-packages/yandextank/stepper/main.py", line 204, in prepare_stepper
    self.stpd = self.__get_stpd_filename()
  File "/usr/local/lib/python2.7/dist-packages/yandextank/stepper/main.py", line 260, in __get_stpd_filename
    raise RuntimeError("Neither ammofile nor uris specified")
RuntimeError: Neither ammofile nor uris specified

08:21:44 [ERROR] Neither ammofile nor uris specified
08:21:44 [INFO] Trying to shutdown gracefully...
08:21:44 [INFO] Finishing test...
08:21:44 [INFO] Finishing monitoring
08:21:44 [ERROR] Failed finishing plugin <yandextank.plugins.Aggregator.plugin.Plugin object at 0x7fe5238d4090>: 'Plugin' object has no attribute 'drain'
08:21:44 [INFO] Post-processing test...
08:21:44 [INFO] Artifacts dir: /var/loadtest/logs/2017-08-21_08-21-44.h3_rZA
08:21:44 [INFO] Done graceful shutdown
08:21:44 [INFO] Close allocated resources...
08:21:44 [INFO] Done performing test with code 1

Рейтинг для тестовых обстрелов

Было бы полезно для тестовых обстрелов тоже рейтинг считать. Его никуда публиковать не надо, только в истории обстрелов, чтобы можно было свой прогресс оценивать

Зависящие друг от друга POST-запросы во второй фазе

Вроде говорили, что во второй фазе не будет зависящих друг от друга запросов. В то же время в TRAIN-данных вижу следующее:

379 POST:/locations/new
<...>
{"id": 838, <...>}

<...>

207 POST:/visits/<entity_id>
<...>
{<...>, "location": 838}

Если сначала обработать первый запрос, второй вернёт 200; если сначала второй, то он должен вернуть 400.

Также конкретно сегодня на тестовом прогоне как минимум я и @atercattus получили во второй фазе сначала обновление юзера 1006, а потом уже создание (id моего решения 12984)

В таблице "время на запрос" добавить колонку "Avg (μs)"

По ней было бы удобно оценивать эффективность с примененным фильтром для конкретного API, а то сейчас это сделать невозможно, т.к. не известен профиль конкретного типа запроса, например, GET:/users/<entity_id>/visits.
Также была бы удобна колонка с медианой.

Keep-alive и http pipelines

Отсутствие keep-alive и pipelining запросов приводит к тому, что системы заточенные на асинхронную обработку запросов проигрывают. Современный веб всё равно почти весь с keep-alive, а поддержать это корректно в "велосипедном" решении не просто. Более реалистичные условия выполнения тестов выровняют шансы. Туда же относится выставление content-type, accept и прочих headers, а так же проверка корректной обработки решением этих нюансов.

Content-Length в POST запросах

Хотелось бы получать Content-Length для всех POST запросов.
Сейчас пустые POST идут без Content-Length и Kestrel их отбрасывает с 411, а тестер ждет 400

Количество соединений от танка/phantom

2017-08-22-074523_1920x1080_scrot
Танк/phantom открывает instances коннектов и равномерно распределяет нагрузку по ним (не параллельно), хотя для обстрела ему достаточно 1-2 коннектов (что и показывается в консоли с танком, см. скриншот).

Скрины в аттаче, дамп трафика - https://yadi.sk/d/4gEtJpYt3MDZ3R

Вопрос - это его штатное поведение или я что-то делаю не так? Очень похоже, что в бою ситуация точно такая же.
Например, у меня оптимизация под < 10 коннектов, что при выставлении instances=10 дает огромый прирост скорости (измерял танком), но вот при instances = 1000 моя оптимизация не работает и соотв. я получаю бОльшее время, хотя танк укладывается и там и там.
2017-08-22-074436_1920x1080_scrot

Запуск докера: docker run -v $(pwd):/var/loadtest --net host -it --rm direvius/yandex-tank -c load/load_3.ini

На 80 порту висит обычный nginx, с моим серверов ситуация точно такая же.

load_3.ini:

address=127.0.0.1
port=80
rps_schedule=line(200, 2000, 120s)

ammo_type=phantom
ammofile=data/FULL/ammo/phase_3_get.ammo
instances = 1000

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.