Вот все говорят, что линукс очень шустрый и весь такой замечательный, а мне все мало :) Приходиться выжимать из бедного пингвина последние соки, чтобы он летал быстрее, выше и сильнее. К счастью в этом стремлении я не одинок и время от времени попадаются весьма интересные способы заставить приложения работать чуточку быстрее. Например сегодня я наткнулся на статью о маленькой утилитке, позволяющей существеннл уменьшить время запуска "тяжелых" приложений. Утверждается, что прирост может составлять 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 у меня теперь летают, хотя их и мало. Будем работать в этом направлении :)
Источники информации: