Динамическое обнаружение гонок в 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 • Программная реализация подхода • Апробация на промышленных проектах