Подводные камни в нагрузочном тестировании

125
Нагрузочные тесты и JMeter Владимир Ситников

Upload: vladimir-sitnikov

Post on 07-Jan-2017

56 views

Category:

Software


2 download

TRANSCRIPT

Page 1: Подводные камни в нагрузочном тестировании

© Netcracker 2016 1

Нагрузочные тесты и JMeterВладимир Ситников

Page 2: Подводные камни в нагрузочном тестировании

© Netcracker 2016 2

• Владимир Ситников• Инженер производительности в Netcracker• JMeter committer• [email protected]@VladimirSitnikv@vlsi

Кто на сцене?

Page 3: Подводные камни в нагрузочном тестировании

© Netcracker 2016 3

Проводим идеальные нагрузочные тесты

План

Page 4: Подводные камни в нагрузочном тестировании

© Netcracker 2016 4

Проводим идеальные нагрузочные тесты

План

Page 5: Подводные камни в нагрузочном тестировании

© Netcracker 2016 5

Расскажу почему JMeterэто лучший инструмент

План

Page 6: Подводные камни в нагрузочном тестировании

© Netcracker 2016 6

Расскажу почему JMeterэто лучший инструмент

План

Page 7: Подводные камни в нагрузочном тестировании

© Netcracker 2016 7

•Скрытые проблемы нагрузочных инструментов•На что обращать внимание•Coordinated omission

План

Page 8: Подводные камни в нагрузочном тестировании

© Netcracker 2016 8

О чём будем говорить

Page 9: Подводные камни в нагрузочном тестировании

© Netcracker 2016 9

О чём будем говорить

Браузер APP DB

Нагрузка

Page 10: Подводные камни в нагрузочном тестировании

© Netcracker 2016 10

О чём будем говорить

Нагрузка

Page 11: Подводные камни в нагрузочном тестировании

© Netcracker 2016 11

•Нужен «личный кабинет»•Там будет «смена тарифного плана»•Будет 100 запросов в час •И работать должно за 5 секунд

Клиент такой

Page 12: Подводные камни в нагрузочном тестировании

© Netcracker 2016 12

Надо? Измерим!

Операция Кол-во Среднеевремя, сек

Домашняя страница 100 1,45

Личный кабинет 100 0,42

Смена тарифа 100 0,93< 5сек

Page 13: Подводные камни в нагрузочном тестировании

© Netcracker 2016 13

⏱+⏱+…+⏱N

Среднее значение

=⏱

Page 14: Подводные камни в нагрузочном тестировании

© Netcracker 2016 14

⏱+⏱+⏳+⏱N

Среднее значение

=?

Page 15: Подводные камни в нагрузочном тестировании

© Netcracker 2016 15

•Измерить среднее невозможно•Плохо отражает ощущаемую производительность

•Любой выброс может кардинально изменить среднее

Проблемы

Page 16: Подводные камни в нагрузочном тестировании

© Netcracker 2016 16

•Случайная величина•Используется для ухода в астрал

• http://latencytipoftheday.blogspot.ru/2014/06/latencytipoftheday-average-random.html

Среднее значение

Page 17: Подводные камни в нагрузочном тестировании

© Netcracker 2016 17

«Разумеется», измеряем квантили (~90%)

Page 18: Подводные камни в нагрузочном тестировании

© Netcracker 2016 18

Облако точек

Page 19: Подводные камни в нагрузочном тестировании

© Netcracker 2016 19

Плотность распределения

Page 20: Подводные камни в нагрузочном тестировании

© Netcracker 2016 20

Убираем 5% худших и 5% лучших, усредняем

ОК?

Page 21: Подводные камни в нагрузочном тестировании

© Netcracker 2016 21

На самом деле, убираем 10% худших

90%

Page 22: Подводные камни в нагрузочном тестировании

© Netcracker 2016 22

•90%•95%•99%•100%

И что измерять?

50/50?

Page 23: Подводные камни в нагрузочном тестировании

© Netcracker 2016 23

•Счастье, это когда требования удовлетворяются

•Сам собой код не ускорится•За чей счёт будем достигать 99%?

Не в замерах счастье

Page 24: Подводные камни в нагрузочном тестировании

© Netcracker 2016 24

•90% +1 человеко-месяц•95% +5 человеко-месяцев•99% +100 человеко-месяцев•100% +100500 человеко-месяцев

Поддержка требований требует ресурсы, ваш КО

Page 25: Подводные камни в нагрузочном тестировании

© Netcracker 2016 25

•90% ß норм для начала•95% ß для бывалых•99% ß для крутых•100% ß для маньяков

И что же выбрать?

Page 26: Подводные камни в нагрузочном тестировании

© Netcracker 2016 26

Времена попали в требования, результаты хорошие?

Page 27: Подводные камни в нагрузочном тестировании

© Netcracker 2016 27

Всё же хорошо?

Операция Кол-во 90%, секДомашняя страница 100 1,45

Личный кабинет 100 0,42

Смена тарифа 100 0,93

Page 28: Подводные камни в нагрузочном тестировании

© Netcracker 2016 28

Page 29: Подводные камни в нагрузочном тестировании

© 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), (…

Page 30: Подводные камни в нагрузочном тестировании

© Netcracker 2016 30

Усредним

Операция РезультатСреднее значение X 9.0

Дисперсия X 10.0

Среднее Y 7.5

Дисперсия Y 3.75

Прямая лин. регрессии y=x/2+3

Повторим замер ещё несколько раз

Page 31: Подводные камни в нагрузочном тестировании

© 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

Page 32: Подводные камни в нагрузочном тестировании

© Netcracker 2016 32

Квартет Энскомба

Page 33: Подводные камни в нагрузочном тестировании

© Netcracker 2016 33

Времена отклика курильщика

Page 34: Подводные камни в нагрузочном тестировании

© Netcracker 2016 34

Времена отклика здорового человека

Page 35: Подводные камни в нагрузочном тестировании

© Netcracker 2016 35

Нужно ли бороться с разбросом результатов?

Page 36: Подводные камни в нагрузочном тестировании

© Netcracker 2016 36

Конечно, да!

Нужно ли бороться с разбросом?

Page 37: Подводные камни в нагрузочном тестировании

© Netcracker 2016 37

•Высокая точность результатов•Высокая повторяемость результатов*

* Вы пробовали два одинаковых замера подряд?

Признаки хорошего теста

Page 38: Подводные камни в нагрузочном тестировании

© Netcracker 2016 38

Немного теории

Чем меньше дисперсия* – тем лучше тест

* Колонка stdev в summary report

Page 39: Подводные камни в нагрузочном тестировании

© 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

Page 40: Подводные камни в нагрузочном тестировании

© 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

Page 41: Подводные камни в нагрузочном тестировании

© Netcracker 2016 41

Откуда берётся разброс?Label # Samples Average Min Max Error %Домашняя страница 4 145 143 147 0

Личный кабинет 4 42 9 45 0

Смена тарифа 4 93 9 172 80

Page 42: Подводные камни в нагрузочном тестировании

© Netcracker 2016 42

Ошибки это…

• HTTP: 401, 402, 403, 404, … 500, …• java.net.SocketException: Connection reset• Прочее

Page 43: Подводные камни в нагрузочном тестировании

© Netcracker 2016 43

Случай из жизни

• Результат замера: 50 ± 2 мс• Ошибок: 0%• Обычно было 2 секунды• Причина: “302 Moved Temporary: /login.jsp”

Page 44: Подводные камни в нагрузочном тестировании

© Netcracker 2016 44

А рабочий ли вообще тест?

Обязательно указываем assertions, иначе узнавать о падениях будем только через логи сервера*

* Кто-нибудь их вообще читает?

Page 45: Подводные камни в нагрузочном тестировании

© Netcracker 2016 45

•Время отклика•Количество запусков•% ошибок

Обязательные результаты тестирования

Page 46: Подводные камни в нагрузочном тестировании

© Netcracker 2016 46

Assertions возвращаются

Если assertions указаны, то следим за количеством ошибок

• В результате 90% line учитываются иуспешные и неуспешные результаты

• https://bz.apache.org/bugzilla/show_bug.cgi?id=57545

Page 47: Подводные камни в нагрузочном тестировании

© Netcracker 2016 47

.*Error.*

.*/login.jsp

Регулярные выражения наносят ответный удар

Page 48: Подводные камни в нагрузочном тестировании

© Netcracker 2016 48

Регулярные выражения

.* может очень сильно тормозить• Либо не пишем сложных regexp’ов• Либо учим матчасть:

http://2015.jpoint.ru/talks/sitnikov/

Page 49: Подводные камни в нагрузочном тестировании

© Netcracker 2016 49

View Results in Tree

Page 50: Подводные камни в нагрузочном тестировании

© Netcracker 2016 50

“View OOM Tree”

View Results in Tree приходится использовать для отладки• Для нагрузки этот компонент нужно отключать, иначе будет OutOfMemoryError в JMeter

Page 51: Подводные камни в нагрузочном тестировании

© Netcracker 2016 51

“View OOM Tree”

• OutOfMemory в нагрузочном инструменте?

• Запросто!• Поэтому нужно снимать метрики и с него самого

Page 52: Подводные камни в нагрузочном тестировании

© Netcracker 2016 52

GC логи с JMeter

Открываем лог в GCViewer и видим

Page 53: Подводные камни в нагрузочном тестировании

© Netcracker 2016 53

Замеряем

Page 54: Подводные камни в нагрузочном тестировании

© Netcracker 2016 54

Page 55: Подводные камни в нагрузочном тестировании

© Netcracker 2016 55

Подаём нагрузку

90% line

Page 56: Подводные камни в нагрузочном тестировании

© Netcracker 2016 56

Если просто подать нагрузку, то будет гидроудар

Page 57: Подводные камни в нагрузочном тестировании

© Netcracker 2016 57

Page 58: Подводные камни в нагрузочном тестировании

© Netcracker 2016 58

• Иногда тест на гидроудар нужен• Но обычно тестируют «обычный» режим

Page 59: Подводные камни в нагрузочном тестировании

© Netcracker 2016 59

Как избежать гидроудара

• Перезапуск системы• Прогрев (меньшая нагрузка, длителность) • Замер

Page 60: Подводные камни в нагрузочном тестировании

© Netcracker 2016 60

Page 61: Подводные камни в нагрузочном тестировании

© Netcracker 2016 61

Подаём нагрузку

Page 62: Подводные камни в нагрузочном тестировании

© Netcracker 2016 62

А если сценариев несколько?

Page 63: Подводные камни в нагрузочном тестировании

© Netcracker 2016 63

Ramp-up delay

• И как настраивать ramp-up у 10+ сценариев?

Page 64: Подводные камни в нагрузочном тестировании

© Netcracker 2016 64

Page 65: Подводные камни в нагрузочном тестировании

© Netcracker 2016 65

Constant Throughput Timer

Page 66: Подводные камни в нагрузочном тестировании

© Netcracker 2016 66

Таймеры в JMeter

• Таймеры «наследуются по иерархии вниз»• Поэтому получим не 4 разных

конференции в год• А только одну в год L

Page 67: Подводные камни в нагрузочном тестировании

© Netcracker 2016 67

Чиним таймеры в JMeter

Page 68: Подводные камни в нагрузочном тестировании

© 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

Page 69: Подводные камни в нагрузочном тестировании

© Netcracker 2016 69

Constant throughput timer

• Смотрим загрузку CPU и видим sin(x)• Оказалось:

• Итерации стартуют каждую минуту ровно в 00 секунд

• И так в каждой thread group

Page 70: Подводные камни в нагрузочном тестировании

© Netcracker 2016 70

Клиент: хочу 100 операций в час

Page 71: Подводные камни в нагрузочном тестировании

© Netcracker 2016 71

Нужно 100 операций в час

Операция Кол-во Среднеевремя, сек

Домашняя страница 96 1,45

Личный кабинет 96 0,42

Смена тарифа 95 0,93

Page 72: Подводные камни в нагрузочном тестировании

© Netcracker 2016 72

Нужно 100 операций в час

Операция Кол-во Среднеевремя, сек

Домашняя страница 102 1,45

Личный кабинет 102 0,42

Смена тарифа 102 0,93

Page 73: Подводные камни в нагрузочном тестировании

© Netcracker 2016 73

Page 74: Подводные камни в нагрузочном тестировании

© Netcracker 2016 74

Page 75: Подводные камни в нагрузочном тестировании

© Netcracker 2016 75

Page 76: Подводные камни в нагрузочном тестировании

© Netcracker 2016 76

Как получить ровно 100?

Операция Кол-во Среднеевремя, сек

Домашняя страница 100 1,45

Личный кабинет 100 0,42

Смена тарифа 100 0,93

Page 77: Подводные камни в нагрузочном тестировании

© Netcracker 2016 77

Добавить «think times»?

Page 78: Подводные камни в нагрузочном тестировании

© Netcracker 2016 78

Think times

• И как подбирать задержки?

Page 79: Подводные камни в нагрузочном тестировании

© Netcracker 2016 79

Page 80: Подводные камни в нагрузочном тестировании

© Netcracker 2016 80

Exponential* Timer

* От слова «процесс Пуассона»

Page 81: Подводные камни в нагрузочном тестировании

© Netcracker 2016 81

Exponential Timer

Exponential Timer соблюдает нагрузку.Если сказано 146 в час, то будет 146:

Page 82: Подводные камни в нагрузочном тестировании

© Netcracker 2016 82

Требования на подачу нагрузки

Если в NFR сказано 146 в час, то должно быть 146 в час• Вне зависимости от количества потоков

• Вне зависимости от think time

Page 83: Подводные камни в нагрузочном тестировании

© Netcracker 2016 83

И где брать exp timer?Тут: https://github.com/apache/jmeter/pull/231

Page 84: Подводные камни в нагрузочном тестировании

© Netcracker 2016 84

И какое получится расписание?

Page 85: Подводные камни в нагрузочном тестировании

© Netcracker 2016 85

Пример пуассоновского запуска

Запускаем «1 заказ в минуту» на протяжении 10-и минут:

Page 86: Подводные камни в нагрузочном тестировании

© Netcracker 2016 86

Хотим «1 заказ в минуту в среднем»

Page 87: Подводные камни в нагрузочном тестировании

© Netcracker 2016 87

Хотим «1 заказ в минуту в среднем»

Page 88: Подводные камни в нагрузочном тестировании

© Netcracker 2016 88

Хотим «1 заказ в минуту в среднем»

Page 89: Подводные камни в нагрузочном тестировании

© Netcracker 2016 89

Польза Exponential Timer

• Даже при низкой нагрузке захватываем случай «два sample почти одновременно»

• Поставил(а) и забыл(а)

Page 90: Подводные камни в нагрузочном тестировании

© Netcracker 2016 90

А должно ли это расписание повторяться каждый раз?

Page 91: Подводные камни в нагрузочном тестировании

© Netcracker 2016 91

Должен ли тест быть повторимым?

Page 92: Подводные камни в нагрузочном тестировании

© Netcracker 2016 92

Конечно, да!

Должен ли тест быть повторимым?

Page 93: Подводные камни в нагрузочном тестировании

© Netcracker 2016 93

Exponential Timer

• Задержки должны быть случайны и повторимы. Такое есть у нас:

• Раз от раза задержки будут одинаковые

Page 94: Подводные камни в нагрузочном тестировании

© Netcracker 2016 94

Микроавтобусы

Можно нагружать «автобусами», т.е. подавать пачками по 16 samples:

Page 95: Подводные камни в нагрузочном тестировании

© Netcracker 2016 95

Нужно 100 операций в час

Операция Кол-во Среднеевремя, сек

Домашняя страница 20 1,45

Личный кабинет 20 0,42

Смена тарифа 20 0,93

Ну как так??

Page 96: Подводные камни в нагрузочном тестировании

© Netcracker 2016 96

Пример времён отклика

• 1 sec• 1 sec• 120 sec• 1 sec

Page 97: Подводные камни в нагрузочном тестировании

© Netcracker 2016 97

Нагружающие потоки

• На больших временах отклика нагрузочный инструмент залипает

• И перестаёт подавать нагрузку!

Page 98: Подводные камни в нагрузочном тестировании

© Netcracker 2016 98

Пропажа нагрузки

Page 99: Подводные камни в нагрузочном тестировании

© Netcracker 2016 99

Если нагрузочный инструмент недоподал нагрузку, то это coordinated omission

Page 100: Подводные камни в нагрузочном тестировании

© Netcracker 2016 100

Сколько потоков ставить?

• Тестируем работу call center’а• Нагрузка – входящие телефонные звонки• 100 звонков в час• Один звонок длится 6 минут• Сколько потоков нужно?

Page 101: Подводные камни в нагрузочном тестировании

© Netcracker 2016 101

Правильный ответ: количество потоков == количество реальных операторов

Page 102: Подводные камни в нагрузочном тестировании

© Netcracker 2016 102

Лечим coordinated omission

Либо увеличиваем количество потоковЛибо «увеличиваем количество касс»

Page 103: Подводные камни в нагрузочном тестировании

© Netcracker 2016 103

Coordinated omission

А я поставлю 1000 потоков и не будет у меня coordinated omission!

Page 104: Подводные камни в нагрузочном тестировании

© Netcracker 2016 104

Coordinated omission

А я поставлю 1000 потоков и не будет у меня coordinated omission!Будет: java, TCP, OS, вот это всё вносит непредсказуемые задержки

Page 105: Подводные камни в нагрузочном тестировании

© Netcracker 2016 105

Coordinated omission

• Coordinated omission особенно страшно на больших %%

• При большой нагрузке фиксируем времена черезhttps://github.com/HdrHistogram/HdrHistogram

Page 106: Подводные камни в нагрузочном тестировании

© Netcracker 2016 106

Параметрические зависимости

Всё сделали, но разброс времён всё равно огромен. Что делать?

Page 107: Подводные камни в нагрузочном тестировании

© Netcracker 2016 107

Привязка времён к входным данным

• Нужно знать на каких данных работал каждый запрос:• Customer id, location id – уникальные ID нужны обязательно

• Тип заказа, тип клиента – по желанию

Page 108: Подводные камни в нагрузочном тестировании

© Netcracker 2016 108

Привязка времён к входным данным

JMeter -> Server: HTTP header X-JMeter-Step

customer:${customerId}, location: ${location}И на сервере понимаем на каких данных тестировали

Page 109: Подводные камни в нагрузочном тестировании

© Netcracker 2016 109

Привязка времён к входным данным

JMeter -> Server: HTTP header X-JMeter-Step

customer:${customerId}, location: ${location}Как бы добавить «название шага»?

Page 110: Подводные камни в нагрузочном тестировании

© Netcracker 2016 110

Привязка времён к входным данным

JMeter -> Server: HTTP header X-JMeter-Stepcustomer:${customerId}, location: ${location}, ${stepName}

Page 111: Подводные камни в нагрузочном тестировании

© 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"),)},

Page 112: Подводные камни в нагрузочном тестировании

© Netcracker 2016 112

Привязка времён к входным данным

JMeter à CSV• FlexibleFileWriter• Или настройка sample_variables=customerId в

jmeter.properties

Page 113: Подводные камни в нагрузочном тестировании

© Netcracker 2016 113

Внезапные всплески времён отклика

Page 114: Подводные камни в нагрузочном тестировании

© Netcracker 2016 114

Всплески на временах отклика

• Оказалось, что в исходном csv данные упорядочены по стране

• При «смене» страны случается «прогрев»• Решение – перемешивать исходный CSV

Page 115: Подводные камни в нагрузочном тестировании

© Netcracker 2016 115

Расслоение времён

Page 116: Подводные камни в нагрузочном тестировании

© Netcracker 2016 116

Расслоение времён

• Оказалось, домашняя страница «пустого» клиента работает быстрее

• А в JMeter шаг назывался «домашняя страниа»

• Решение – использовать разные названия шагов: «новый клиент», «клиент с кучей опций»

Page 117: Подводные камни в нагрузочном тестировании

© Netcracker 2016 117

Page 118: Подводные камни в нагрузочном тестировании

© Netcracker 2016 118

Page 119: Подводные камни в нагрузочном тестировании

© Netcracker 2016 119

В жизни

Page 120: Подводные камни в нагрузочном тестировании

© Netcracker 2016 120

В жизни (крупный план)

Page 121: Подводные камни в нагрузочном тестировании

© Netcracker 2016 121

В жизни (крупный план)

Page 122: Подводные камни в нагрузочном тестировании

© Netcracker 2016 122

Выводы

Page 123: Подводные камни в нагрузочном тестировании

© Netcracker 2016 123

Выводы

• Проверяем кучность «облака точек со временами отклика»

• Используем правильные timer’ы• Перемешиваем исходные CSV• Не забываем логировать исходные ID

Page 124: Подводные камни в нагрузочном тестировании

© Netcracker 2016 124

• Владимир Ситников• Инженер производительности в Netcracker• JMeter committer• [email protected]@VladimirSitnikv@vlsi

Вопросы?

Page 125: Подводные камни в нагрузочном тестировании

© Netcracker 2016 125

Вопросы?