Японские исследователи разработали mkcheck2, систему для проверки зависимостей между файлами при сборке программ, которая в испытаниях сократила среднее время анализа одного изменения примерно с 21 минуты до 24 секунд. Новый подход оказался примерно в 54 раза быстрее прежнего и почти устранил дополнительную нагрузку, из-за которой подобные проверки трудно запускать после каждого изменения кода.
Авторы проверили mkcheck2 на 300 проектах с открытым исходным кодом, использующих Make. Согласно опубликованному исследованию, среднее время анализа одной фиксации изменений снизилось с 1267,49 до 23,56 секунды. Дополнительные затраты времени во время сборки уменьшились с 148% до 0,3%, а исследователи оценили сокращение накладных расходов по сравнению с прежним методом максимум в 99,7%.
Проверка касается не сторонних библиотек и пакетов, а связей между файлами самого проекта. Система сборки должна знать, какие части программы зависят друг от друга и что нужно пересобрать после изменения конкретного файла. Если разработчик не указал необходимую зависимость, сборка может оставить устаревший компонент или завершиться с ошибкой. Лишняя зависимость, напротив, заставляет без необходимости пересобирать части программы, которые изменение не затронуло.
По оценке авторов работы, ошибки в описании таких связей составляют более половины ошибок сборки в крупных проектах. Прежние средства динамической проверки могли находить подобные проблемы достаточно точно, но наблюдение за файловыми операциями через ptrace требовало приостанавливать процесс и переключаться между пространством приложения и ядром при большом числе системных вызовов. На крупных сборках накладные расходы быстро накапливались.
mkcheck2 переносит основную часть наблюдения в ядро Linux и использует eBPF. Механизм позволяет запускать изолированные программы внутри ядра и следить за системными событиями с небольшой дополнительной нагрузкой. Во время сборки mkcheck2 отслеживает операции с файлами, восстанавливает фактические зависимости между ними и сравнивает полученную структуру с тем, что разработчики указали в правилах сборки.
Второе ускорение даёт анализ только изменившейся части проекта. Вместо повторной проверки всего графа зависимостей после каждой правки mkcheck2 использует сведения о предыдущих сборках и обрабатывает затронутые связи. Такой подход особенно важен для непрерывной интеграции, где проверка может запускаться после каждой фиксации изменений.
В тестовом наборе mkcheck2 обнаружила все отсутствующие зависимости и 92% лишних. Авторы подчёркивают, что показатели относятся к проведённым экспериментам и не означают одинаковую точность для любого проекта.
У метода остаются ограничения. Текущая реализация зависит от Linux, а некоторые сценарии всё ещё трудно отслеживать, включая обращения к файлам через отображение памяти, зависимости от динамически загружаемых библиотек, сетевых ресурсов и распределённых систем сборки. Исследователи также планируют расширить поддержку других систем сборки, добавить автоматическое исправление найденных ошибок и упростить использование mkcheck2 в средах непрерывной интеграции.