Линуксоускоритель

Вот все говорят, что линукс очень шустрый и весь такой замечательный, а мне все мало :) Приходиться выжимать из бедного пингвина последние соки, чтобы он летал быстрее, выше и сильнее. К счастью в этом стремлении я не одинок и время от времени попадаются весьма интересные способы заставить приложения работать чуточку быстрее. Например сегодня я наткнулся на статью о маленькой утилитке, позволяющей существеннл уменьшить время запуска "тяжелых" приложений. Утверждается, что прирост может составлять 50% и хотя с секундомером я не замерял, но этот прирост видно "на глаз". Вам уже интересно? Тогда продолжим :)

Итак, герой дня на сегодня - prelink. Для начала немного теории: наверное вы знаете, что программы в Linux - это, как правило, не монолитный объект, а набор из исполняемого файла и некоторого количества подключаемых динамически библиотек, так вот, при каждом запуске программы эти библиотеки приходится искать на жестком диске, что приводит к задержкам, порой достаточно длительным. Конечно, возможно статически скомпилировать программу, но тогда размер системы будет неприемлемо большим. Умные люди прикинули, что динамическое связывание с библиотеками всегда проходит одинаково и решили выполнять его раз и навсегда, то есть сохранять библиотечные связи в исполняемом файле. Это таинственное действо назвали прелинкингом, откуда, собственно и появилось название программы.

Для начала, неплохо-бы посмотреть нет-ли этой утилитки в вашем дистрибутиве. Если нет, идем дальше.

Итак, что нам понадобится:

Установленный дистрибутив GNU/Linux - 1 штука.
Библиотека libelf-0.8.10 - 1 штука
Исходники prelink - тоже 1 штука :)

распаковываем все это и ставим:

 tar -zxvf libelf-0.8.10.tar.gz
tar -jxvf prelink-20071009.tar.bz2
cd libelf-0.8.10
./configure --enable-shared
make
make install
cd ../prelink/
./configure
make
make install

если повезло, то все соберется нормально, если не повезло, то внимательно читаем документацию и логи :)

После успешной сборки и установки надо-бы заняться конфигурированием.

cp doc/prelink.conf /etc

открываем файлик и дописываем в него все пути к исполняемым файлам и библиотекам, которые вы собираетесь подвергнуть процедуре предварительного связывания. Получается что-то наподобие:

 -l /bin
-l /usr/bin
-l /sbin
-l /usr/sbin
-l /usr/X11R6/bin
-l /lib
-l /usr/lib
-l /usr/X11R6/lib
-l /usr/local/kde/bin
-l /usr/local/qt/bin
-l /usr/local/qt/lib
-l /usr/local/kde/lib

Синтаксис файла в нем самом вполне доступно описан. После сохранения изменений наступает время запустить процесс:

prelink -avfmR

Процесс не очень долгий, но можно пойти покурить и выпить чашечку кофе.

по окончании процесса у вас в консоли будет отчёт о успешно или не успешной прелинковке. К сожалению, самые тяжёлые софтины обычно остаются как были и помочь в этом может только перекомпиляция этих софтин со включением опции --with-pic конфигуратора или добавлением флага -fPIC в список значений переменной CFLAGS. Гентушникам с этим проще :)

Итак, результатом всех этих безобразий станет заметное ускорение программ, подвергшихся процессу прелинкинга. Допустим приложения, основанные на GTK у меня теперь летают, хотя их и мало. Будем работать в этом направлении :)

Источники информации:

  1. http://citkit.ru/
  2. Журнал "Linux Format" №93