openSUSE. Зарисовки для новелл: prelink

Как говорилось в новелле о недостатках openSUSE, среди её многочисленных достоинств излишняя торопливость при запуске приложений не числится. И там же был предложен один из вариантов исправления ситуации -- использование так называемого предварительного связывания (prelinking'а).

Как известно, подавляющее большинство Linux-приложений не содержит в себе весь необходимый для их работы код, а использует т.н. разделяемые библиотеки. И обычно программы при сборке связываются с такими библиотеками динамически, то есть необходимые функции вызываются из них в ходе загрузки программы. В одних случаях это происходит быстро, в других -- раздражающе медленно.

Однако операция динамического связывания исполняемого бинарника с разделяемыми библиотеками всегда происходит одинаково. И потому возникает мысль -- а нельзя ли выполнить её раз и навсегда? Можно, и именно в этом суть механизма прелинкинга. Его не следует смешивать со статической сборкой программ, при которой в исполняемой файл программы жёстко встраиваются необходимые библиотечные функции. Прелинкинг же сохраняет в нём лишь связи с библиотеками.

Во многих современных дистрибутивах, например, в Fedora, прелинкинг задействуется по умолчанию (в чём одна из причин визуального её быстродействия). Однако openSUSE к ним не относится: в ней прелинкинг не только не включается по умолчанию, но и соответствующий пакет не устанавливается при типовой инсталляции.

Так что для начала надо озаботиться установкой пакета prelink, например, вот таким образом:

# zypper in prelink

Далее неплохо ознакомиться с конфигурационным файлом пакета, имя которому prelink.conf, на предмет проверки -- все ли пути к исполняемым файлам и библиотекам, которые должны подвергнуться предварительному связыванию, в нём прописаны. Впрочем, после стандартной установки ничего в нём менять, скорее всего, не надо.

Теперь остаётся только запустить процесс предварительного связывания. Делается это так:

# prelink -avfmR

Смысл опций команды следующий:

  • -a предписывает применить прелинкинг ко всем исполняемым файлам;
  • -v выводит подробную информацию о ходе процесса -- необходимость этого я покажу парой строк ниже;
  • -f заставляет применить прелинкинг повторно, даже если эта процедура уже была выполнена ранее; почему -- опять же скоро выяснится;
  • -m и -R -- опции, страхующие от ошибок нехватки памяти и переполнения буфера.

После этого начинается собственно предварительное связывание -- на современных машинах весь процесс занимает несколько минут. В ходе его могут появиться сообщение, что такая-то программа не может быть предварительно связана -- вот зачем нужна опция -v. Правда, кроме осознания самого факта, с этим ничего поделать нельзя.

Наконец, процесс прелинкинга завершается возвращением приглашения командной строки. Результатами его можно наслаждаться сразу, без всякой перезагрузки. А результаты эти -- ускорение загрузки приложений примерно в два раза: для KDE-приложений может быть и чуть больше, для Gtk -- несколько меньше.

Есть программы, принципиально не желающие предварительно связываться -- это, например, всё, имеющее отношение к wine. И, конечно же, прелинкинг невозможен для проприетарных бинарников, типа Adobe Flash.

Однако и достигнутого достаточно для того, чтобы если и не вывести openSUSE в чемпионы по скорости загрузки программ, то, по крайней мере, избавиться от наиболее явных тормозов этого процесса. Так что, ИМХО, очинка выделки стоит.

Теперь нужно только не забывать повторять процедуру предварительного связывания после каждого обновления системы -- то есть после выполнения

# zypper up

и установки дополнительных пакетов. Именно для этого и нужна опция -f в приведённой ранее команде.


Содержание

SUSEana: новый адрес проекта об openSUSE

. .