Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Case Study дефектов производительности: DeadLock, Race Condition, Memory Leak

polarnik
February 04, 2020

Case Study дефектов производительности: DeadLock, Race Condition, Memory Leak

Доклад Сергея Филимонова из EPAM для митапа сообщества по тестированию производительности (qa_load)

Рассказ про три интересных дефекта производительности, найденных в большом проекте.

Найденные дефекты:
1. DeadLock
2. Race Condition
3. Memory Leak

Используемые инструменты:
1. JVisualVM
2. Eclipse Memory Analyser
3. Apache.JMeter
4. Инструменты мониторинга и работы с базами данных

Чат сообщества QA — Load & Performance:
https://t.me/qa_load

Запись выступления Сергея Филимонова:
https://youtu.be/sEcudxQB62M?t=4567

polarnik

February 04, 2020
Tweet

More Decks by polarnik

Other Decks in Programming

Transcript

  1. CONFIDENTIAL. Copyright © 2020 6 Deadlock Cитуация в многозадачной среде

    или СУБД, при которой несколько процессов находятся в состоянии ожидания ресурсов, занятых друг другом, и ни один из них не может продолжать свое выполнение. ВЗАИМНАЯ БЛОКИРОВКА (DEADLOCK) 6 R1 R2 P2 P1
  2. CONFIDENTIAL. Copyright © 2020 7 Deadlock. Симптомы • Выставлены актуальные

    настройки postgres (workers, cache) – не помогло • Увеличено значение соединений до 100 - ошибка просто наступает позже ДЕЙСТВИЯ ПО ИСПРАВЛЕНИЮ {"timestamp":"2019-09-04T11:28:51.083+0000","status":500,"err or":"Internal Server Error","exception":"org.springframework.dao.DataAccessResourc eFailureException","message":"Unable to acquire JDBC Connection; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection","path":/"} ЛОГИ ПРИЛОЖЕНИЯ
  3. CONFIDENTIAL. Copyright © 2020 8 Deadlock. Локализация …. statusNodeService.updateStatus (statusNodeService.java:…)

    at ru.sberbank.ds.project….service.statuses….$$FastClassBySpringCGLIB$$6133c1e8.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) STACKTRACE
  4. CONFIDENTIAL. Copyright © 2020 9 Deadlock. Локализация "https-jsse-nio-8081-exec-9" - Thread

    t@102 java.lang.Thread.State: BLOCKED at java.util.concurrent.ConcurrentHashMap.compute(Concurre ntHashMap.java:1868) waiting to lock <1277c6d9> (a java.util.concurrent.ConcurrentHashMap$Node) owned by "https-jsse-nio-8081-exec-29" locked <52fb37d7> (a java.util.concurrent.ThreadPoolExecutor$Worker) locked <52c01142> (a java.util.concurrent.locks.ReentrantLock$FairSync) "https-jsse-nio-8081-exec-29" - Thread t@246784 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) waiting to lock <52c01142> (a java.util.concurrent.locks.ReentrantLock$FairSync) owned by "https-jsse-nio-8081-exec-9" locked <1277c6d9> (a java.util.concurrent.ConcurrentHashMap$Node) 9 THREAD 1: THREAD 2:
  5. CONFIDENTIAL. Copyright © 2020 10 Deadlock. Bugfix • ConcurrentHashMap в

    которой хранятся блокировки. Доступ synchronized • Вложенные synchronized секции 10
  6. CONFIDENTIAL. Copyright © 2020 12 Race condition Ошибка проектирования многопоточной

    системы или приложения, при которой работа системы или приложения зависит от того, в каком порядке выполняются части кода. СОСТОЯНИЕ ГОНКИ — «плавающая» ошибка (гейзенбаг), проявляющаяся в случайные моменты времени и «пропадающая» при попытке её локализовать СОСТОЯНИЕ ГОНКИ (RACE CONDITION)
  7. CONFIDENTIAL. Copyright © 2020 13 Lost update При одновременном изменении

    одного блока данных разными транзакциями теряются все изменения, кроме последнего. ПОТЕРЯННОЕ ОБНОВЛЕНИЕ (LOST UPDATE)
  8. CONFIDENTIAL. Copyright © 2020 14 Race condition (Lost Update). Локализация

    Ошибки проявляются в 20% случаев: из-за этого тяжело локализовать и воспроизводить вручную. … : Assertion failed for response: {…"status":400,"error":"Bad Request","exception":“…","message":"Failed to read job result Node a9540559-…-a62ded5f19e7 output is empty.","path":"/api/…"} Нода не переходит в требуемый статус. Остановка теста в момент возникновения ошибки и проверка состояния – нет записей метаданных в БД, null поля ЛОГИ ПРИЛОЖЕНИЯ
  9. CONFIDENTIAL. Copyright © 2020 15 Race condition (Lost Update). Bugfix

    ORM Spring: • Transactional для dirty checking's • При UPDATE перезаписывается вся строка, а не только изменившиеся поля 15
  10. CONFIDENTIAL. Copyright © 2020 17 Memory leak Процесс неконтролируемого уменьшения

    объёма свободной оперативной или виртуальной памяти компьютера, связанный с ошибками в работающих программах, вовремя не освобождающих ненужные участки памяти, или с ошибками системных служб контроля памяти. Note that constantly increasing memory usage is not necessarily evidence of a memory leak. Some applications will store ever increasing amounts of information in memory (e.g. as a cache). If the cache can grow so large as to cause problems, this may be a programming or design error, but is not a memory leak as the information remains nominally in use УТЕЧКА ПАМЯТИ (MEMORY LEAK)
  11. CONFIDENTIAL. Copyright © 2020 22 Выводы По разобранным кейсам Deadlock,

    race condition, memory leak трудновоспроизводимы, но могут быть выявлены в нагрузочном тесте. Concurrency – это сложно. DEADLOCK RACE CONDITION И CONCURRENCY В БД MEMORY LEAK И ДРУГИЕ OOM ПРОБЛЕМЫ • локализация VisualVM, threaddump • следить за вложеными synchronized секциями и вообще • локализация путем остановки в момент ошибки и анализ состояния сущностей • неочевидные моменты в hibernate • локализация VisualVM или аналогами • eclipse memory analyzer • кэширование