Бинарный поиск ускорил раннюю загрузку ядра Linux: с 268 секунд до 50 миллисекунд

· Linux и open source
В составе обновлений memblock для Linux 7.4 инженер Google заменил линейный поиск бинарным — и время извлечения памяти при Kernel Handover сократилось в тысячи раз.

cover.svg

Сегодня в ядро Linux 7.4 отправили набор улучшений подсистемы memblock. Самое заметное из них — оптимизация в файле mm/memblock.c, где реализован ранний аллокатор физической памяти, работающий ещё до запуска полноценного постраничного аллокатора.

Суть изменения проста. Инженер Google Тарун Саху обратил внимание, что функции memblock_add_range() и memblock_isolate_range() искали подходящие области памяти линейным перебором. Он заменил его бинарным поиском.

Где это важно

При обычной загрузке разница почти незаметна. Но при сильной фрагментации памяти — например, при использовании механизма Kernel Handover (KHO), на котором строится Live Update Orchestrator и смежные инструменты, — в системе возникает множество разрозненных фрагментов памяти. Линейный перебор по ним превращается в мучительно долгий процесс.

Цифры говорят сами за себя. По словам авторов патча, переход на бинарный поиск снижает сложность в худшем случае до O(N log N) (и до O(N) для последовательного добавления), а время извлечения памяти при KHO сокращается примерно с 268 секунд до примерно 50 миллисекунд.

Остаётся лишь удивляться, что линейный поиск продержался в коде ядра так долго. С другой стороны, он затрагивал лишь аллокатор ранней загрузки, где раньше никто особо не замечал потерь.

Оптимизация вошла в pull-запрос memblock, отправленный сегодня для ядра Linux 7.4.


Источник: Phoronix

Комментарии

Войдите, чтобы комментировать.

  • Пока нет комментариев.