yashaka

Untitled

May 14th, 2017
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 37.73 KB | None | 0 0
  1.  
  2.  
  3.  
  4.  
  5. - Lesson 2
  6. - Корреляция запросов
  7. - Request>CSS/JQuery Extractor
  8. - ThreadGroup>HTTP Cookie Manager
  9. - ?
  10. - как вытащить параметр из
  11. - джейсон ответа?
  12. - JSON Path PostProcessor
  13. - хедера в респонсе?
  14. - из кукис?
  15. - лоукал/сешн сторедж?
  16.  
  17. - Управление потоком выполнения
  18. - Once Only Controller>Request
  19. - Loop Controller
  20. - While Controller
  21. - can be based on var used (updated and used) in requests with additionally set default value
  22. - so once, update will produce "none", the var will get e.g. "false" and while will break loop
  23. - If controller
  24. - Modules as inactive ThreadGroups with Simple Controllers as "defined methods"
  25. - to call a "defined method":
  26. - ThreadGroup>if needed parameter - Parametrized Controller (available as plugin)>Module Controller (which links to "defined controller")
  27. - ?
  28. - в конце Баранцев ставит риторический вопрос - а нужны ли такие сложные сценарии? и не дает на него ответа... а зря...
  29. нужно таки ему этот вопрос задать в лоб
  30. - пока что мне кажется что да, стоит всегда стремиться к простоте... но может как раз особенность нагрузочного тестирования в том, что бы симулировать "реальную нагрузку", это в функциональных тестах, мы можем в основном идти путем атомарных тестов... а сдесь, в нагрузочном - таки рулят "енд ту енд" тесты, и судя по всему сложные - с ифами и циклами... возможно правда можно эту сложность как то "вынести из сценария на уровень выше", но нужно еще потренироваться как это сделать...
  31.  
  32. - Протоколы взаимодействия
  33. - HTTP(s)
  34. - WebSocket (via plugin)
  35. - Remote API (SOAP, REST)
  36. - REST
  37. - JSON Path PostProcessor
  38. - Базы Данных
  39. - SMTP, POP3, IMAP
  40. - когда нет способа получить нужную информацию из БД (наприм ссылку/код для подтеврждения регистрации)
  41. - WebDriver
  42. - прийдется нанимать кучу машин в клауде на недешево
  43. - когда сильно много аякса, и нереально все это симулировать с помощью http запросов
  44. - ТСP, UDP
  45. - Java API
  46.  
  47.  
  48. - Lesson 3 - Нагрузка
  49.  
  50. - Требования к производительности
  51. - Характеристики качества
  52. - Время отклика (response time)
  53. - для запроса
  54. - для транзакции (серии запросов)
  55. - пропускная способность (throughput) = количество событий (запросов/транзакций/etc) произошедших за единицу времени
  56. - способность к распаралеливанию (concurrency)
  57. - Доступность (готовность) (availability, uptime)
  58. - Потребление ресурсов (resource utilization)
  59. - процесор, память, сеть, дисковая подсистема, etc
  60. - потенциальная мощность (capacity)
  61. - Требования
  62. - время отклика
  63. - среднее время отклика
  64. - классификация по типам (пр: action (2.5s), ping(1s), статика (0.2s))
  65. - дисперсия (пр: не более 20 процентов)
  66. - классификация по типам
  67. - максимальное время отклика
  68. - по типам... (пр: action - <5s, ping - <2s)
  69. - доля привышений максимума (<0.1%)
  70. - доля отказов (<0.001%)
  71. - отсутствие деградации (< 1% в течении часа)
  72. - ?
  73. - в течении часа ?
  74. - расход ресурсов
  75. - расход процессорного времени
  76. - расход памяти
  77. - обьем трафика
  78. - обьем операций чтения/записи
  79. - способность к распараллеливанию
  80. - пример: система должна поддерживать не менее 10к постоянно работающих пользователей
  81. - уточняющие вопросы:
  82. - что делают
  83. - с какой частотой
  84. - как делают? (один пользователь в разных вкладках - это 1 или 2 пользователя?)
  85. - а что если прийдет больше 10к?
  86. - что значит "поддерживать"
  87. - как надо
  88. - Профили нагрузки:
  89. - небольшая (20%)
  90. - нормальная (80%)
  91. - предельная (100%)
  92. - требования по откликам плюс расходу ресурсов для каждого из профилей
  93.  
  94. - Цели тестирования и профили нагрузки
  95. - цели/вопросы заказчика
  96. - стала ли новая версия работать быстрее?
  97. - что тормозит софт или железо?
  98. - почему пользователи не завершают заказы?
  99. - скоро распродажа - выдержит ли сервер?
  100. - че как там вообще?
  101. - цели тестирования
  102. - когда конкретные цифры не интересуют
  103. - сравнить две версии системы
  104. - найти причину проблемы с производительностью
  105. - может и не в ней дело, может где то функциональная проблема
  106. - когда интересуют цифры
  107. - оценить потенциальные возможности
  108. - получить подтверждение что все хорошо
  109. - нужно только уточнить у заказчика - что значит "хорошо"
  110. - как вариант - не хуже чем раньше
  111. - но если раньше не было известно - то нужны детали и конкретика
  112.  
  113. - проектирование тестов
  114. - выясняем цель
  115. - определяем на какой вопрос должны ответить
  116. - переводим на тех язык
  117. - описываем требования и условия
  118. - формулируем проверяемую гипотезу
  119. - могут быть разные сеансы с разными гипотезами
  120. - описываем профиль нагрузки
  121. - какие сценарии, из каких транзакций, сколько сценарий разного типа необходимо использовать
  122. - делаем сценарии, которые его реализуют
  123. - как выбирать транзакции
  124. - критически важные
  125. - пр:
  126. - вход в систему
  127. - поддержка текущей сессии
  128. - связанные с рисками (с проверяемой гипотезой)
  129. - требуемые (предполагаемые) заказчиком
  130. - частоиспользуемые
  131. - ресурсоемкие
  132. - модель активности пользователей
  133. - рисуем разные воркфлоу, определяем либо на глаз либо с помощью имеющихся данных - где сколько процентов каких транзакций
  134. - потом для каждой транзакции считем сумарные проценты - и сравниваем с тем что в реально жизни (из данных мониторинга)
  135. - профиль нагрузки
  136. - количество виртуальных пользователей
  137. - количество сценариев
  138. - ** количество транзакций/запросов **
  139. - то на что равняемся, остальные можем "подгонять"
  140. - задержки между запросами
  141. - задержки между транзакциями
  142. - "виды тестирования" (= названия для типовых профилей нагрузки)
  143. - нагрузочное
  144. - постоянная нагрузка, 20-80% от максимума
  145. - = количество транзакций сохраняется в течении длительного времени
  146. - при этом соотношение сценариев разного вида можем менять, можем играться в границах 20-80%
  147. - более правильно говорить так: "мы выполняли тестирование при постоянной нагрузке - столько то от максимума, выполняли такие то сценарии в таком то соотношении"
  148. - если еще и долго "нагружаем" => "стабильности"
  149. - стрессовое
  150. - непреривно возрастающая нагрузка
  151. - ищем точки насыщения = моменты когда поведение системы меняется
  152. - пр: начало расти время отклика, увеличилась дисперсия, появились отказы
  153. - обычно ноги растут от того что заканчиваются какие то ресурсы
  154. - по сути определяем "максимум" для нагрузочного тестирования
  155. - спайк тестирование
  156. - нагрузка с пиками
  157. - превыщающими максимум на незначительное время
  158. - как будет себя вести во время?
  159. - сможет ли востановиться?
  160. - можно делать для одного или нескольких сценариев
  161. - повышать/уменьшать частоту
  162.  
  163. - Профили нагрузки в JMeter
  164. - number of threads
  165. - считается что на "стандартной машине" можно запустить 500-600
  166. - но - только если при этом не перегружать джеметер
  167. - например через использование view results tree
  168. - другие места для облегчения: <todo>
  169. - проще - использовать несколько машин
  170. - обеспечение заданой пропускной способности (количество запросов/секунду)
  171. - Thread Group
  172. - експериментальным путем подобрать number of threads
  173. - установить фиксированное number of threads и подтюнить задержки между транзакциями
  174. - Constant Throughput Timer
  175. - автоматом подбирает нужные задержки при заданом req/sec
  176. - к сожалению подбирать tr/sec не умеет
  177. - либо приходится подбирать нужное количество сценариев
  178. - либо использовать метрику req/sec
  179. - возрастающая нагрузка
  180. - 1 способ: Thread Group
  181. - max number of threads
  182. - достаточно длительный период разогрева (Ramp-Up period)
  183. - Loop Count: forever
  184. - Scheduler: Duration = ramp up
  185. - 2 способ: Stepping Thread Group (из модуля плагинов: Custom Thread Groups)
  186. - 3 cпособ: Concurrency Thread Group
  187. - 4 cпособ: Arrivals Thread Group
  188. - количество будет возрастать нелинейно, будет подстраиваться
  189. - ?
  190. - не особо вкурил как этим пользовать и зачем... :)
  191. - нагрузка с пиками/всплесками
  192. - 1 Ultimate Thread Group
  193. - все пики "рисуются" вручную
  194. - 2 Thread Group
  195. - одна Thread Group как основа
  196. - вторая Thread Group c большой нагрузкой, и с таймером (Constant Timer) задержки внутри
  197.  
  198. - Задержки в JMeter
  199. - зачем?
  200. - формировать профиль нагрузки
  201. - управление частотой запросов
  202. - симуляция пауз пользователя
  203. - изза того что существует
  204. - кеширование в браузере
  205. - есть срок годности кеша....
  206. - когда тогда будут отправлятся запросы? - до истечения срока или после? - это можно контролировать
  207. - кеширование на сервере/прокси
  208. - желательно делать такие же паузы как в реальной жизни, что бы симулировать реальный "профиль кеширования"
  209. - но возможен и компромис
  210. - изза того что может нехватить мощности генератора по нужному увеличению количества вирт. пользователей
  211. - ?
  212. - ввообще то я не понял как это мы симулируем профиль кеширования в браузере, если мы посылаем запросы из джеметер а не реального браузера... джеметер же не имеет какого либо профиля кеширования :)
  213. - типа есть HTTP Cache Manager
  214. - но, тю, все равно это ведь не реальный браузер... поэтому все это такая себя "симуляция", звучит как слегка "притянутая за уши", не хватает каких то реальных цифр... а то получается решили использовать паузы на основе каких то сомнительных предположений, что джеметр как то более менее правильно там все симулирует в контексте кеширования в браузере...
  215. - реализация в Jmeter...
  216. - правила
  217. - таймер действует на все запросы текущего контекста
  218. - за этим нужно следить, часто таймер нужен даже конкретно на "запрос" а не "всю транзакцию" или весь сценарий
  219. - таймер срабатывает перед запросом
  220. - поэтому если он нужен "в конце" - нужно его поместить внутрь следующего
  221. - или, что лучше и наглядней - в отдельный компонент Test Action (псевдо-запрос)
  222. - который и сам может играть роль "постоянной паузы"
  223. - но если нужно что то особенное, можно его паузу установить в ноль
  224. - а уже внутрь запихнуть подходящий случайный таймер
  225.  
  226. - запуск тестов
  227. - Этап 1: разработка
  228. - определить цели, сформулировать гипотезы
  229. - реализовать сценарии, описать профили нагрузки
  230. - погонять как функциональные тесты (с небольшой нагрузкой)
  231. - можно проверки подописывать
  232. - нужно - что бы проверить функциональность в "паралельном контексте"
  233. - после - можно отключить/деактивировать
  234. - откалибровать сценарии (с небольшой нагрузкой)
  235. - что бы соответствовали в процентном соотношении реальности
  236. - добавляем задержки вдруг что
  237. - добавляем/уменьшаем кол. в. польз-ей
  238. - до тех пока не увидим что количество транзакций разного типа не удовлетворяет требованиям
  239. - стабилизировать показатели производительности
  240. - прогнать откалиброванные несколько раз, и убедится что каждый раз получаем одинаковые показатели производительности
  241. - возможно действуют какие то неизвестные факторы, которые мы не учли
  242. - например
  243. - другие процессы которые расходуют много ресурсов
  244. - может кто то другой также нагружает систему
  245.  
  246. - Этап 2: выполнение
  247. - выбрать эталон/базу, снять показатели
  248. - (когда показатели стабильны при не большой нагрузке)
  249. - = последнему по сути шагу первого этапа
  250. - поискать точки насыщения, найти максимум
  251. - если нет гипотезы которую нужно проверить
  252. - прогнать не очень долго на 80% от максимума
  253. - 5, 10 минут, час
  254. - прогнать довольно долго на 20%
  255. - несколько часов, сутки, может даже больше
  256. - при этом такой не сильно нагруженный сервер можно исопльзовать для отладки, новых сценариев, функционального тестирования...
  257. - ** каждый сеанс выполнять несколько раз! **
  258.  
  259. - что делать пока тесты бегут?
  260. - точки насыщения: следить за появлением
  261. - анализировать результаты предыдущих запусков
  262. - готовить следующие запуски
  263. - оценить производительность вручную
  264. - на нагруженном сервере
  265. - анализировать собственные ощущения
  266. - еще лучше если это будет делать не тестировщик а человек который принимает решения
  267. - выполнять функциональные тесты
  268. - попросить тестировщиков которые функциональные тестирование выполняют
  269.  
  270.  
  271. - Ручное тестирование производительности
  272. - цель: оценка загрузки отдельно взятой страницы, от начала до конца с точки зрения пользователя
  273. - входит
  274. - разрешение имен
  275. - загрузка основного содержимого
  276. - всех дополнительных ресурсов (картинок, стилей)
  277. - загрузка и выполнение js
  278. - developer tools>Network
  279. - developer tools>Timeline in chrome
  280. - YSLow chrome extension
  281. - стоит выполнять как при нагруженном сервере (обычными тестами производительности) так и ненагруженном
  282.  
  283.  
  284. - Lesson 4
  285.  
  286. - Анализ результатов в JMeter
  287. - генератор нагрузки дает
  288. - время отклика
  289. - количество сбоев
  290. - лучше просто собирать данные во время выполнения, что бы не забирать ресурсы у генератора
  291. - а анализировать после, причем лучше на другой машине
  292. - ?
  293. - почему
  294. - Simple Data Writer
  295. - лучше поотключать все данные которые не нужни для сбора в целях экономии ресурсов
  296. - Flexible Data Writer (через плагин)
  297. - слегка гибче, но не намного
  298. - Summary Report
  299. - то за чем таки можно следить во время выполнения тестов
  300. - показывает количество отказов
  301. - возможно после какой то "катастрофы" уже дальше продолжать тестирование смысла не будет
  302. - там же можно увидеть точки насыщения по резкому возрастанию некоторых показателей
  303. - с целью зкономить время выполнения - возможно дальше смысла выполнять этот сценарий уже не будет
  304. - в этот момент можно зафиксировать текущее количество потоков
  305. - если мы намерены "дождаться до конца" - тогда конечно следить незачем
  306. - сюда также можно загружать данные после выполнения
  307. - Graph Results
  308. - для грубой оценки
  309. - Response Times Over Time
  310. - анализируем запросы отдельно, отдельно быстрые, отдельно медленные
  311. - Bytes Throughput Over Time
  312. - к сожалению нельзя посмотреть для отдельных запросов
  313. - Transactions per Second
  314. - можно для разных запросов/транзакций посмотреть
  315. - Response Times Distribution
  316. - обычно выглядит как крутой подъем и пологий спуск - это хорошо
  317. - ?
  318. - почему
  319. - Response Times Percentiles
  320. - x: какой процент запросов
  321. - y: до какого времени успел завершиться
  322. - или наоборот - что и более удобно - какой процент не успел завершиться за какое время
  323. - обычно должен быть подйом вначале, плато, и горочка в конце
  324.  
  325. - Сравнительный анализ результатов
  326. - что с чем сравнивать?
  327. - время отклика для разных запросов
  328. - jmeter умеет
  329. - время отклика и пропускная способность
  330. - время отклика и размер ответа
  331. - время отклика и latency (ожидание начала прихода данных)
  332. - время отклика и latency и размер ответа
  333. - время отклика для разных запусков (профилей нагрузки)
  334. - jmeter умеет но очень неудобно
  335. - искажает масштаб
  336. - можно пофиксить но нужно вручную править цсв файлы - подправлять время
  337. - можно это сделать через Excel
  338. - сейчас может обрабатывать до 2 милионов строк
  339. - хотя и будет тормозить
  340. - Python + Numpy
  341. - R
  342. - RapidMiner
  343. - визуальный, но платный:) (бесплатный для некомерческого использования)
  344. - комментарии якова
  345. - Knime - очень мощный но с большущим порогом входа... может когда то стоит таки к нему присмотреться
  346. - Orange - с низким порогом входа, но так и не получилось два графика в один запихнуть... как то нужно попробовать еще раз...
  347. - Сlojure + Incanter - я бы выбрал именно этот набор... но нужно разбираться... книжка: https://dl.dropboxusercontent.com/u/15301926/Eric%20Rochester%20-%20Clojure%20Data%20Analysis%20Cookbook%2C%202nd%20Edition%20-%202015.pdf
  348.  
  349. - Анализ использования ресурсов
  350. - слишком много всего
  351. - начать с простого
  352. - процесорное время
  353. - оперативная память
  354. - дальше уже по наявный проблемам, пробовать угадать где ботл нек - и следить именно за соответствующим ресурсом
  355. - сборщики данных
  356. - только общие показатели
  357. - Windows: perfmon
  358. - *nix: sysstat (sar)
  359. - как расходуются ресурсы внутри конкретного приложения
  360. - например
  361. - как быстро выполняются запросы к базе данных
  362. - как расходуется память внутри конкретного процесса
  363. - специализированные
  364. - обычно есть для каждой базы данных
  365. - есть для джавы/дотнет свои инструменты, профайлеры, и т.д.
  366. - универсальные (Zabbix, Nagios, ...)
  367. - обычно собирают данные (с машин внутри какой то сети) не достаточно часто (например, раз в минуту...)
  368.  
  369. - Подготовка Тестового Стенда
  370. - идеальная ситуация: копия продакшена
  371. - реальная ситуация: упрощенная модель
  372. - можно поймать момент когда продакшен уже настроен но еще на "запущен на использование пользователями"
  373. - очень важно его поймать, это позволит запустить одинаковый тесты и на нем и на стейджинге, и потом вычислить поправочный коэффициент
  374. - что можно упростить/оставить в "реальном" тестовом стенде?
  375. - хотя бы такая же конфигурация серверов (железа, апаратная)
  376. - с такой же мощностью
  377. - с таким же количеством процессоров и оперативной памяти
  378. - типа пусть будет 1 сервер а не 30 как на продакшене, но такой же
  379. - хотя бы та же самая сеть
  380. - в том же датацентре, в той же сети
  381. - с такой же схемой развертывания
  382. - такой же балансировщик нагрузки, также настроен
  383. - такая же схема репликации баз данных
  384. - такие же настройки
  385. - с такими же отключенными/включенными логами
  386. - механизмы кеширования
  387. - хотя бы сравнимый размер базы данных
  388. - либо копия баз данных
  389. - анонимизированная конечно
  390. - либо тестовая наполненная тестовыми данными, близкого размера
  391. - дополнительные факторы
  392. - генераторы нагрузки
  393. - системы мониторинга
  394. - стараться установить датчиков как можно меньше, настолько редко настолько возможно, но так что бы не потерять информацию
  395. - дополнительный трафик
  396. - при распределнных системах мониторинга
  397. - при распределенных генерациях нагрузки
  398. - нужно как то все это отделить от основного
  399. - собранные данные лучше не отправлять а сохранять
  400. - хотя это нагружает систему ввода/вывода
  401. - может стоит для этого использовать отдельный диск
  402. - но если для приложения работа с диском несущественна - то и нафиг
  403. - фоновые процессы
  404. - виртуализация
  405. - если продакшен не на виртуальных/в контейнерах то опасно стейджинг виртуализировать...
  406. - генераторам нагрузки же все равно...
  407.  
  408. - Распределенная Генерация Нагрузки
  409. - когда нужно?
  410. - высокая нагрузка
  411. - тестирование балансировки
  412. - другие особенности
  413. - несколько точек измерения
  414.  
  415. - Понятые отчеты
  416. - хорошый отчет
  417. - своевременный
  418. - релевантный
  419. - достоверный
  420. - согласованный и непротиворечивый
  421. - * доступный для восприятия *
  422. - сравнение чего-нибудь с чем-нибудь
  423. - с требованиями
  424. - с предыдущей версией
  425. - правильно выбранный масштаб
  426.  
  427.  
  428. - Aлгоритм:
  429. - сразу добавляем
  430. - куки менеджер (почти всегда он нужен)
  431. - HTTP Cash Manager
  432. - Записываем сценарий
  433. - Просмтриваем запросы
  434. - есть параметры?
  435. - находим те которые мы сами заполняли на веб страницах => Тестовые Данные
  436. - можно генерировать случайно (__RandomString, __Random)
  437. - загружать из внешнего файла
  438. - etc.
  439. - находим те которые мы вручную не вводили (значит подставляются откуда то автоматически)
  440. - => скорее всего нужна кореляция
  441. - или что другое
  442. - например иногда запрос будет отсылать сведения о времени совершения операции. Рекордер запишет конкретный таймстемп,нам нужно будет каждый раз отсылать актуальное время. Это можно симулировать с помощью ${__javaScript(new DatgetTime()
  443. - добавляем задержки
  444.  
  445. - Debug
  446. - Fiddler
  447. - View Results Tree
  448. - Debug Sampler - энейблит показывание переменных в view results tree
  449. - Active Threads Over time - для наблюдения за потоками
  450.  
  451.  
  452. ?
  453. - каким образом учитывать ресурсы которые жрет сам нагрузчик
  454. - можно ли создавать "методы" - Да, можно :) но получается кривовато
  455. - внутри сценария
  456. - вокруг набора запросов
  457. - вокруг контролера с нужными параметрами? типа "partial application"
  458. - за границами сценария
  459.  
  460. JMeter cons
  461. - только ненаглядное/неявное использование переменных
  462. - пример
  463. - смотрим и видим цикл, внутри набор запросов, в одном из которых используется переменная обьявленная и впервые устоновленная за границами цикла, и будет обновлена на каждой итерации... С одной стороны в коде - было бы также, но за счет того что код обычно "не сворачивают" - такая переменная сразу будет бросаться в глаза, а в "визуальном джеметре" - ты видишь как бы красивые шаги, но не подозреваешь что они могут использовать какое то внутреннее состоянее которые может изменятся в разных местах, не очевидных сразу...
  464. В коде при этом - скорее всего, такого состояния можно было бы избежать совсем... сделать его явным, а шаги оставить "абстрактными". В джеметре такого сделать нельзя.
  465. - сильно много воды
  466. - в коде ты пишешь только то что нужно, в JMeter ты видишь целую страницу опций/настроек, из которых тебе нужны только некоторые в конкретном случае
  467. - DRY но громоздкий DRY, сильно много гемороя с передачей параметров в "описанный в другом месте котролер", и слишком много танцев что бы сделать это читабельным...
  468. - походу нельзя создать метод вокруг какого то контролера с нужными настройками...
  469.  
  470. - не очевидный ненаглядный интерфейс
  471. - пример
  472. - -1 as indicator of "extracting all matched elements, 0 as indicator for random element: "http://joxi.ru/p27OXp4h0BW8g2
  473. - and here what you get if set -1:
  474. - ITEM_KEY=false
  475. - ITEM_KEY_1=...
  476. - ITEM_KEY_2=...
  477. - ITEM_KEY_matchNr=2
  478. - so then you can: http://joxi.ru/52a8LWBIGObQdm
  479. - если Counter дойдет до конца, он начнет все сначала, это - НЕочевидно, и это нигде не видно в настройках...
  480. - странная логика работы таймеров
  481. - неважно куда ты его запхнешь в начало или в конец запроса, он все равно будет запущен "вначале"
  482. - а что бы он запустился после - его нужно в следующий запрос запихнуть
  483. - хотя есть воркераунд - запихнуть его в отдельный test action
  484.  
  485. - странноватый дебаг с помощью Debug Sampler
  486. - ну... странний как для тех кто знает программирование...
  487.  
  488. - Юля: менее информативные сообщения о ошибке...
  489. - забыл скобочку где то - хер поймешь из ошибки в чем дело
Advertisement
Add Comment
Please, Sign In to add comment