Динамическое обнаружение гонок в Java

advertisement
Динамическое обнаружение
гонок в Java-программах
Выполнил: Трифанов Виталий Юрьевич,
кафедра системного программирования мат.-мех. ф-та СПбГУ
Научный руководитель: Кознов Дмитрий Владимирович
Санкт-Петербург, 2013
Предметная область
• Состояние гонки (data race) возникает в
программе, когда несколько потоков
обращаются к одному и тому же
разделяемому участку памяти, причем хотя
бы один – на запись
Состояния гонки
• одна из самых частых ошибок
многопоточного программирования
• не локальны
• непредсказуемое поведение программы
• сложно обнаружить вручную
– приходится мыслить в терминах нескольких
потоков, одновременно выполняющих разные
задачи
• трудновоспроизводимы
Существующие подходы
• Статические
– анализ исходного кода/исполняемых файлов
• Динамические
– Post-mortem
– On-the-fly
• Lockset
• Vector clock & happens-before
Существующие утилиты
Тип детектора
Java
C/C++
Статический
RaceFree Java type system
ESC/Java
Java PathFinder
Chord
RacerX
Chord
Динамический
Eraser
TRaDe
IBM MSDK
TSan
Racer
FastTrack
Pacer
Goldilocks
ThreadSanitizer RaceTrack
Multirace
LiteRace
Valgrind DRD
Post-mortem
Déjà vu
RecPlay
.NET
Нет промышленных
динамических
детекторов для Java
Постановка задачи
• Разработать новую точную
высокопроизводительную методику и
программную реализацию для
динамического обнаружения гонок в Javaпрограммах
• Основной критерий: применимость на
средних и крупных Java-проектах
– тысячи классов, десятки потоков
Идея
• Приложение обычно использует множество
сторонних библиотек (в т.ч., JRE) через API,
который
– хорошо документирован
– достаточно невелик
• Нас интересуют гонки только в нашем коде
• Будем анализировать только наш код
– опишем поведение (синхронизационные
контракты) используемых сторонних классов,
чтобы не потерять точность
Анализ программы
Synchronization scope
Race Detection Scope
“local” call
“foreign” call
Контракты
• Контракты классов с точки зрения поиска
гонок
– A.foo() – потокобезопасен, read или write?
• Синхронизационные контракты
– Наборы методов, которые, будучи вызванными
в определенном порядке, обеспечивают
синхронизацию вызвавших их потоков
– В терминах отношения happens-before
– Например, ConcurrentMap: put(key) → get(key)
Преимущества подхода
• Гибкий механизм поддержки
функциональных средств синхронизации Java
• Прирост производительности
• Выше точность - отслеживаются только
декларированные контракты
• Применимость в модульном тестировании
• Повторное использование спецификаций
Ограничения подхода
• Есть возможность описывать только явные
синхронизационные контракты
– существует прямая связь между вызовами
методов
– не учитываются возвращаемые значения
• Контрактные методы трактуются как
атомарные, хотя в общем случае это не так
• Нет возможности искать гонки по разным
объектам, являющимися представлениями
одних и тех же данных
Точность подхода
• Используется точный алгоритм happensbefore
• Отсечение событий синхронизации не
может привести к пропуску гонок
• Отслеживание синхронизационных
контрактов тоже
• Отсутствие ложных срабатываний – вопрос
мощности языка конфигурации
– практическая достаточность мощности языка
подтверждается апробацией
Сценарий использования
Запуск
Сужение
области
анализа
Описание
контрактов
Замеры
Анализ гонок
Реализация
• Спецификация контрактов с помощью XML
• Использован точный алгоритм поиска гонок
happens-before
• Инструментирование байт-кода
– java agent перехватывает загрузку классов и
может их модифицировать
– можно модифицировать уже загруженные
• Решены проблемы с потреблением памяти
и созданием новых объектов (garbage)
• Оптимальное хранение внутренних данных
Степень готовности
• Сделано
– проведен анализ предметной области
– разработан подход
– выполнена программная реализация
– выполнена лабораторная апробация
– утилита выложена в Интернет:
http://code.devexperts.com/display/DRD/
• В процессе
– промышленная апробация
– оптимизация, исправление ошибок
Результаты апробации
• Модельные примеры: proof-of-concept
• Небольшие реальные приложения
– порядка 1000 классов, 10 потоков
• нагрузочный тест системы доставки котировок
• UI-клиент к баг-трекеру JIRA
• внутренние проекты компании Devexperts
• Средние приложения
– тысячи классов, десятки потоков
– MSDK и TSan крайне нестабильны
– наш детектор держится молодцом
Апробация: в процессе
• Полная апробация на крупных
приложениях (десятки тысяч классов):
– система мониторинга (клиент, сервер)
– трейдинговая платформа (клиент, сервер)
– коллеги из компании Devexperts интересуются
и пробуют на своих проектах
– ждем обратную связь по итогам конференции
JPoint
• Акт о внедрении из Devexperts
Публикации
• Трифанов В.Ю. Обнаружение состояний гонки в Java-программах
на основе синхронизационных контрактов. Компьютерные
инструменты в образовании. №4, 2012. С. 16-29.
• Трифанов В.Ю., Цителов Д.И. Статические и post-mortem методы
обнаружения гонок в параллельных программах. Компьютерные
инструменты в образовании. №6, 2011. С. 3-13.
• Трифанов В.Ю., Цителов Д.И. Динамические методы
обнаружения гонок в параллельных программах. Компьютерные
инструменты в образовании. №5, 2011. С. 3-15.
• Трифанов В.Ю. Динамическое обнаружение гонок в Javaпрограммах с помощью векторных часов. Системное
программирование. Вып. 5: Сб. статей/Под ред. А.Н.Терехова,
Д.Ю.Булычева. Изд-во СПбГУ, 2010. С. 95-116.
Выступления
• Внутренняя лекция в компании Devexperts
– 2 августа 2012
• Семинар кафедры на мат.-мех. ф-те СПбГУ
– 17 октября 2012
• Конференция CEE-SEC(R) 2012, Москва
– 2 ноября 2012. Премия Бертрана Мейера за лучший
академический доклад
• Санкт-Петербургский городской семинар по программной
инженерии
– 20 декабря 2012
• Конференция JPoint 2013, СПб
– 5 апреля 2013
Результаты, выносимые на защиту
• Подход к динамическому обнаружению гонок
посредством ограничения анализируемой области
программы и корректной обработки операций вызова
исключенного кода на основании синхронизационных
контрактов
• Методика описания синхронизационных контрактов Javaклассов
• Поддержка базовых средств синхронизации Java (volatile,
synchronized, Unsafe, и т.д.), а также основных
функциональных средств из пакета java.util.concurrent
• Программная реализация подхода
• Апробация на промышленных проектах
Download