Подводные камни в нагрузочном тестировании
TRANSCRIPT
© Netcracker 2016 1
Нагрузочные тесты и JMeterВладимир Ситников
© Netcracker 2016 2
• Владимир Ситников• Инженер производительности в Netcracker• JMeter committer• [email protected]@VladimirSitnikv@vlsi
Кто на сцене?
© Netcracker 2016 3
Проводим идеальные нагрузочные тесты
План
© Netcracker 2016 4
Проводим идеальные нагрузочные тесты
План
© Netcracker 2016 5
Расскажу почему JMeterэто лучший инструмент
План
© Netcracker 2016 6
Расскажу почему JMeterэто лучший инструмент
План
© Netcracker 2016 7
•Скрытые проблемы нагрузочных инструментов•На что обращать внимание•Coordinated omission
План
© Netcracker 2016 8
О чём будем говорить
© Netcracker 2016 9
О чём будем говорить
Браузер APP DB
Нагрузка
© Netcracker 2016 10
О чём будем говорить
Нагрузка
© Netcracker 2016 11
•Нужен «личный кабинет»•Там будет «смена тарифного плана»•Будет 100 запросов в час •И работать должно за 5 секунд
Клиент такой
© Netcracker 2016 12
Надо? Измерим!
Операция Кол-во Среднеевремя, сек
Домашняя страница 100 1,45
Личный кабинет 100 0,42
Смена тарифа 100 0,93< 5сек
© Netcracker 2016 13
⏱+⏱+…+⏱N
Среднее значение
=⏱
© Netcracker 2016 14
⏱+⏱+⏳+⏱N
Среднее значение
=?
© Netcracker 2016 15
•Измерить среднее невозможно•Плохо отражает ощущаемую производительность
•Любой выброс может кардинально изменить среднее
Проблемы
© Netcracker 2016 16
•Случайная величина•Используется для ухода в астрал
• http://latencytipoftheday.blogspot.ru/2014/06/latencytipoftheday-average-random.html
Среднее значение
© Netcracker 2016 17
«Разумеется», измеряем квантили (~90%)
© Netcracker 2016 18
Облако точек
© Netcracker 2016 19
Плотность распределения
© Netcracker 2016 20
Убираем 5% худших и 5% лучших, усредняем
ОК?
© Netcracker 2016 21
На самом деле, убираем 10% худших
90%
© Netcracker 2016 22
•90%•95%•99%•100%
И что измерять?
50/50?
© Netcracker 2016 23
•Счастье, это когда требования удовлетворяются
•Сам собой код не ускорится•За чей счёт будем достигать 99%?
Не в замерах счастье
© Netcracker 2016 24
•90% +1 человеко-месяц•95% +5 человеко-месяцев•99% +100 человеко-месяцев•100% +100500 человеко-месяцев
Поддержка требований требует ресурсы, ваш КО
© Netcracker 2016 25
•90% ß норм для начала•95% ß для бывалых•99% ß для крутых•100% ß для маньяков
И что же выбрать?
© Netcracker 2016 26
Времена попали в требования, результаты хорошие?
© Netcracker 2016 27
Всё же хорошо?
Операция Кол-во 90%, секДомашняя страница 100 1,45
Личный кабинет 100 0,42
Смена тарифа 100 0,93
© Netcracker 2016 28
© Netcracker 2016 29
Типичный результат замера
(x, y) = { (10,0; 8,04), (8,0; 6,95), (13,0; 7,58), (9,0; 8,81), (11,0; 8,33), (14,0; 9,96), (…
© Netcracker 2016 30
Усредним
Операция РезультатСреднее значение X 9.0
Дисперсия X 10.0
Среднее Y 7.5
Дисперсия Y 3.75
Прямая лин. регрессии y=x/2+3
Повторим замер ещё несколько раз
© Netcracker 2016 31
Усредним
Операция A B C DСреднее значение X 9.0 9.0 9.0 9.0
Дисперсия X 10.0 10.0 10.0 10.0
Среднее Y 7.5 7.5 7.5 7.5
Дисперсия Y 3.75 3.75 3.75 3.75
Прямая лин. регрессии
y=x/2+3 y=x/2+3 y=x/2+3 y=x/2+3
© Netcracker 2016 32
Квартет Энскомба
© Netcracker 2016 33
Времена отклика курильщика
© Netcracker 2016 34
Времена отклика здорового человека
© Netcracker 2016 35
Нужно ли бороться с разбросом результатов?
© Netcracker 2016 36
Конечно, да!
Нужно ли бороться с разбросом?
© Netcracker 2016 37
•Высокая точность результатов•Высокая повторяемость результатов*
* Вы пробовали два одинаковых замера подряд?
Признаки хорошего теста
© Netcracker 2016 38
Немного теории
Чем меньше дисперсия* – тем лучше тест
* Колонка stdev в summary report
© Netcracker 2016 39
Чем меньше дисперсия* – тем лучше тестLabel # Samples Average Min Max Std. Dev.Домашняя страница 4 145 143 147 0,8
Личный кабинет 4 42 9 45 2,3
Смена тарифа 4 93 9 172 78,4
© Netcracker 2016 40
Откуда берётся разброс?Label # Samples Average Min Max Std. Dev.Домашняя страница 4 145 143 147 0,8
Личный кабинет 4 42 9 45 2,3
Смена тарифа 4 93 9 172 78,4
© Netcracker 2016 41
Откуда берётся разброс?Label # Samples Average Min Max Error %Домашняя страница 4 145 143 147 0
Личный кабинет 4 42 9 45 0
Смена тарифа 4 93 9 172 80
© Netcracker 2016 42
Ошибки это…
• HTTP: 401, 402, 403, 404, … 500, …• java.net.SocketException: Connection reset• Прочее
© Netcracker 2016 43
Случай из жизни
• Результат замера: 50 ± 2 мс• Ошибок: 0%• Обычно было 2 секунды• Причина: “302 Moved Temporary: /login.jsp”
© Netcracker 2016 44
А рабочий ли вообще тест?
Обязательно указываем assertions, иначе узнавать о падениях будем только через логи сервера*
* Кто-нибудь их вообще читает?
© Netcracker 2016 45
•Время отклика•Количество запусков•% ошибок
Обязательные результаты тестирования
© Netcracker 2016 46
Assertions возвращаются
Если assertions указаны, то следим за количеством ошибок
• В результате 90% line учитываются иуспешные и неуспешные результаты
• https://bz.apache.org/bugzilla/show_bug.cgi?id=57545
© Netcracker 2016 47
.*Error.*
.*/login.jsp
Регулярные выражения наносят ответный удар
© Netcracker 2016 48
Регулярные выражения
.* может очень сильно тормозить• Либо не пишем сложных regexp’ов• Либо учим матчасть:
http://2015.jpoint.ru/talks/sitnikov/
© Netcracker 2016 49
View Results in Tree
© Netcracker 2016 50
“View OOM Tree”
View Results in Tree приходится использовать для отладки• Для нагрузки этот компонент нужно отключать, иначе будет OutOfMemoryError в JMeter
© Netcracker 2016 51
“View OOM Tree”
• OutOfMemory в нагрузочном инструменте?
• Запросто!• Поэтому нужно снимать метрики и с него самого
© Netcracker 2016 52
GC логи с JMeter
Открываем лог в GCViewer и видим
© Netcracker 2016 53
Замеряем
© Netcracker 2016 54
© Netcracker 2016 55
Подаём нагрузку
90% line
© Netcracker 2016 56
Если просто подать нагрузку, то будет гидроудар
© Netcracker 2016 57
© Netcracker 2016 58
• Иногда тест на гидроудар нужен• Но обычно тестируют «обычный» режим
© Netcracker 2016 59
Как избежать гидроудара
• Перезапуск системы• Прогрев (меньшая нагрузка, длителность) • Замер
© Netcracker 2016 60
© Netcracker 2016 61
Подаём нагрузку
© Netcracker 2016 62
А если сценариев несколько?
© Netcracker 2016 63
Ramp-up delay
• И как настраивать ramp-up у 10+ сценариев?
© Netcracker 2016 64
© Netcracker 2016 65
Constant Throughput Timer
© Netcracker 2016 66
Таймеры в JMeter
• Таймеры «наследуются по иерархии вниз»• Поэтому получим не 4 разных
конференции в год• А только одну в год L
© Netcracker 2016 67
Чиним таймеры в JMeter
© Netcracker 2016 68
Constant throughput timer
Смотрим загрузку CPU и видим sin(x):
0 2,5 5 7,5 10 12,5 15 17,5
25
50
75
100
© Netcracker 2016 69
Constant throughput timer
• Смотрим загрузку CPU и видим sin(x)• Оказалось:
• Итерации стартуют каждую минуту ровно в 00 секунд
• И так в каждой thread group
© Netcracker 2016 70
Клиент: хочу 100 операций в час
© Netcracker 2016 71
Нужно 100 операций в час
Операция Кол-во Среднеевремя, сек
Домашняя страница 96 1,45
Личный кабинет 96 0,42
Смена тарифа 95 0,93
© Netcracker 2016 72
Нужно 100 операций в час
Операция Кол-во Среднеевремя, сек
Домашняя страница 102 1,45
Личный кабинет 102 0,42
Смена тарифа 102 0,93
© Netcracker 2016 73
© Netcracker 2016 74
© Netcracker 2016 75
© Netcracker 2016 76
Как получить ровно 100?
Операция Кол-во Среднеевремя, сек
Домашняя страница 100 1,45
Личный кабинет 100 0,42
Смена тарифа 100 0,93
© Netcracker 2016 77
Добавить «think times»?
© Netcracker 2016 78
Think times
• И как подбирать задержки?
© Netcracker 2016 79
© Netcracker 2016 80
Exponential* Timer
* От слова «процесс Пуассона»
© Netcracker 2016 81
Exponential Timer
Exponential Timer соблюдает нагрузку.Если сказано 146 в час, то будет 146:
© Netcracker 2016 82
Требования на подачу нагрузки
Если в NFR сказано 146 в час, то должно быть 146 в час• Вне зависимости от количества потоков
• Вне зависимости от think time
© Netcracker 2016 83
И где брать exp timer?Тут: https://github.com/apache/jmeter/pull/231
© Netcracker 2016 84
И какое получится расписание?
© Netcracker 2016 85
Пример пуассоновского запуска
Запускаем «1 заказ в минуту» на протяжении 10-и минут:
© Netcracker 2016 86
Хотим «1 заказ в минуту в среднем»
© Netcracker 2016 87
Хотим «1 заказ в минуту в среднем»
© Netcracker 2016 88
Хотим «1 заказ в минуту в среднем»
© Netcracker 2016 89
Польза Exponential Timer
• Даже при низкой нагрузке захватываем случай «два sample почти одновременно»
• Поставил(а) и забыл(а)
© Netcracker 2016 90
А должно ли это расписание повторяться каждый раз?
© Netcracker 2016 91
Должен ли тест быть повторимым?
© Netcracker 2016 92
Конечно, да!
Должен ли тест быть повторимым?
© Netcracker 2016 93
Exponential Timer
• Задержки должны быть случайны и повторимы. Такое есть у нас:
• Раз от раза задержки будут одинаковые
© Netcracker 2016 94
Микроавтобусы
Можно нагружать «автобусами», т.е. подавать пачками по 16 samples:
© Netcracker 2016 95
Нужно 100 операций в час
Операция Кол-во Среднеевремя, сек
Домашняя страница 20 1,45
Личный кабинет 20 0,42
Смена тарифа 20 0,93
Ну как так??
© Netcracker 2016 96
Пример времён отклика
• 1 sec• 1 sec• 120 sec• 1 sec
© Netcracker 2016 97
Нагружающие потоки
• На больших временах отклика нагрузочный инструмент залипает
• И перестаёт подавать нагрузку!
© Netcracker 2016 98
Пропажа нагрузки
© Netcracker 2016 99
Если нагрузочный инструмент недоподал нагрузку, то это coordinated omission
© Netcracker 2016 100
Сколько потоков ставить?
• Тестируем работу call center’а• Нагрузка – входящие телефонные звонки• 100 звонков в час• Один звонок длится 6 минут• Сколько потоков нужно?
© Netcracker 2016 101
Правильный ответ: количество потоков == количество реальных операторов
© Netcracker 2016 102
Лечим coordinated omission
Либо увеличиваем количество потоковЛибо «увеличиваем количество касс»
© Netcracker 2016 103
Coordinated omission
А я поставлю 1000 потоков и не будет у меня coordinated omission!
© Netcracker 2016 104
Coordinated omission
А я поставлю 1000 потоков и не будет у меня coordinated omission!Будет: java, TCP, OS, вот это всё вносит непредсказуемые задержки
© Netcracker 2016 105
Coordinated omission
• Coordinated omission особенно страшно на больших %%
• При большой нагрузке фиксируем времена черезhttps://github.com/HdrHistogram/HdrHistogram
© Netcracker 2016 106
Параметрические зависимости
Всё сделали, но разброс времён всё равно огромен. Что делать?
© Netcracker 2016 107
Привязка времён к входным данным
• Нужно знать на каких данных работал каждый запрос:• Customer id, location id – уникальные ID нужны обязательно
• Тип заказа, тип клиента – по желанию
© Netcracker 2016 108
Привязка времён к входным данным
JMeter -> Server: HTTP header X-JMeter-Step
customer:${customerId}, location: ${location}И на сервере понимаем на каких данных тестировали
© Netcracker 2016 109
Привязка времён к входным данным
JMeter -> Server: HTTP header X-JMeter-Step
customer:${customerId}, location: ${location}Как бы добавить «название шага»?
© Netcracker 2016 110
Привязка времён к входным данным
JMeter -> Server: HTTP header X-JMeter-Stepcustomer:${customerId}, location: ${location}, ${stepName}
© Netcracker 2016 111
Добавляем название шагаJMeter -> Server: HTTP header X-JMeter-Step
customer:${customerId}, location: ${location},${__BeanShell(setAccessibility(true);List c=vars.getObject("JMeterThread.pack").controllers;for(int i=0;i<c.size(); i++) if (c.get(i) instanceoforg.apache.jmeter.control.TransactionController) return c.get(i).getName().replaceFirst("^([0-9]+[.][0-9]+)[^_]+_(P[0-9]+)_"\, "$1$2"),)},
© Netcracker 2016 112
Привязка времён к входным данным
JMeter à CSV• FlexibleFileWriter• Или настройка sample_variables=customerId в
jmeter.properties
© Netcracker 2016 113
Внезапные всплески времён отклика
© Netcracker 2016 114
Всплески на временах отклика
• Оказалось, что в исходном csv данные упорядочены по стране
• При «смене» страны случается «прогрев»• Решение – перемешивать исходный CSV
© Netcracker 2016 115
Расслоение времён
© Netcracker 2016 116
Расслоение времён
• Оказалось, домашняя страница «пустого» клиента работает быстрее
• А в JMeter шаг назывался «домашняя страниа»
• Решение – использовать разные названия шагов: «новый клиент», «клиент с кучей опций»
© Netcracker 2016 117
© Netcracker 2016 118
© Netcracker 2016 119
В жизни
© Netcracker 2016 120
В жизни (крупный план)
© Netcracker 2016 121
В жизни (крупный план)
© Netcracker 2016 122
Выводы
© Netcracker 2016 123
Выводы
• Проверяем кучность «облака точек со временами отклика»
• Используем правильные timer’ы• Перемешиваем исходные CSV• Не забываем логировать исходные ID
© Netcracker 2016 124
• Владимир Ситников• Инженер производительности в Netcracker• JMeter committer• [email protected]@VladimirSitnikv@vlsi
Вопросы?
© Netcracker 2016 125
Вопросы?