UNIXOIDЕвгений Зобнин zobnin@gmail.comÏèíãâèíñ ðåàêòèâíûìðàíöåìÓñêîðÿåì çàïóñê ïðèëîæåíèé â LinuxLinux становится все тяжелее и тяжелее. Сегодня уже никого не удивишьприложениями, время запуска которых составляет несколько минут,окружениями рабочего стола, занимающими 500 Мб оперативки, инерасторопной загрузкой ОС, напоминающей поход женщины помагазинам. Есть ли способы все это оптимизировать, существует лилекарство от ожирения пингвинов, где взять ножик, чтобы отрезать вселишнее? Попробуем разобраться.094За все время существования толстых пингвинов(период, отсчитываемый примернос момента появления GTK+ 2.X, X Free 4.X иLinux 2.6) было придумано немало способовускорения запуска приложений и всей ОС.Некоторые из них уже давно успешно применяютсяв популярных дистрибутивах, другиедо сих пор значатся экспериментальными. Вэтой статье мы посмотрим на них повнимательнееи определим, насколько оправданнымможет быть их применение.ПРЕДВАРИТЕЛЬНОЕСВЯЗЫВАНИЕ ИЛИ PRELINKПре-связывание есть ни что иное, как модификациязапускаемого файла с целью включитьв него результаты динамического связываниябиблиотек. Что это значит?В стародавние времена приложения былипросты и использовали в своей работе всегонесколько динамически загружаемых системныхбиблиотек. То было время господства форматаисполняемых файлов a.out, особенностькоторых заключалась в предельной простоте.Файлы a.out всегда точно знали, по какому адресуони будут загружены в память процесса, ипо каким адресам будут располагаться их внут-XÀÊÅÐ 08 /139/ 10
WARNINGwarningРедактируем конфигурацию утилитыupdate-initramfsВ установке prelinkдля Ubuntu нетнеобходимости.Этот дистрибутивиспользуетальтернативныйметод, называемыйDT_GNU_HASHи реализованныйна уровне корневойбиблиотеки (glibc).Readahead в графике bootchartренние функции, константы и т.д. Эта особенность, с однойстороны, давала им преимущество в скорости загрузки, а сдругой — создавала проблемы сосуществования библиотекв памяти (что, если две библиотеки будут загружены впамять по одному адресу?). Проблемы надо было решать,поэтому появился формат ELF (его создатели на самом делебыли поклонниками книг Толкиена :)), который снимал сисполняемых файлов ответственность за выбор адресасвоего размещения в виртуальной памяти и перекладывалее на динамический линковщик. Отныне адреса загрузкиприложений, библиотек и всех их символов (переменных,констант, функций т.д.) вычислялись динамически на этапезагрузки.ELF позволил UNIX/Linux сделать огромный шаг вперед истать системой, способной загружать и исполнять огромноеколичество приложений, слинкованных с таким жеколичеством библиотек, без всяких проблем. Однако с точкизрения производительности это был провал. Процедурадинамического связывания очень быстра, и при запускеприложений, зависящих всего от нескольких библиотек,она не вносит в процесс заметных задержек, но если этозапуск громоздкого приложения с зависимостями порядка50 библиотек, то задержка может быть весьма существенной(вплоть до нескольких десятков секунд).Так называемое пре-связывание наделяет ELF-файлы наиболеевыгодной чертой формата a.out. Запускаемые файлымодифицируются таким образом, чтобы уже включать в себярезультат динамического связывания и, соответственно,заранее знать собственные адреса в памяти процесса и нетратить на их вычисление время в течение запуска.Процедура пре-связывания была предложена сотрудникомRed Hat Jakub Jelinek еще в 2004 году и оказалась оченьудачным методом повышения скорости запуска приложений.Согласно тестам, она может дать прирост, равный 50%от первоначальной скорости запуска, а в особо тяжелыхслучаях (OpenOffice, KDE, Gnome) — и того больше. При этомдля ускорения системы достаточно запустить всего однукоманду и немного подождать.Да, задействовать механизм пре-связывания действительнопросто. Для этого уже упомянутый выше Jakub Jelinekнаписал программу под названием prelink. Она доступнапрактически в любом Linux-дистрибутиве, поэтому собиратьиз исходников ничего не придется. Просто установи пакетыprelink, используя пакетный менеджер дистрибутива, ивыполни следующую команду:# prelink -avmRАргументы командной строки в этом случае значат следующее:• v — âûâîäèòü áîëüøå èíôîðìàöèè íà ýêðàí;• a — ïîäâåðãíóòü ïðå-ñâÿçûâàíèþ âñå áèíàðíûåôàéëû;• m — ñîõðàíèòü âèðòóàëüíóþ ïàìÿòü (íóæíî, åñëèáèáëèîòåê î÷åíü ìíîãî);• R — ðàíäîìèçèðîâàòü ïîðÿäîê ñëåäîâàíèÿ ó÷àñòêîâïàìÿòè (ïîâûøàåò óðîâåíü çàùèòû îò àòàê íàñðûâ ñòåêà).После окончания выполнения приложения можно начинатьрадоваться ускорению. Однако стоит помнить о несколькихограничениях:1. Prelink не способен увеличить скорость загрузки бинарников,скомпилированных без опции '-fPIC'. К сожалению,таких библиотек достаточно много, обычно сборщики пакетовнарочно отключают этот флаг для увеличения производительностиприложения;2. Prelink не умеет обрабатывать библиотеки проекта wine,поэтому об ускорении Windows-софта придется забыть;3. Некоторые статические библиотеки могут перестатьзапускаться после обработки prelink;4. После установки новых приложений или библиотек операциюпрелинкинга рекомендуется повторить.Для удаления prelink делаем так:# prelink -auДалее можно тереть пакет из системы.ПРЕДВАРИТЕЛЬНАЯЗАГРУЗКА ИЛИ PRELOADХорошим дополнением к prelink станет демон preload,реализующий механизм предварительной загрузки библиотекдля часто используемых приложений. Работая в фоне,preload анализирует действия пользователя и составляетсписок наиболее часто используемых приложений. Вдальнейшем эта информация применяется для заблаговременнойзагрузки приложений и необходимых им библиотекв память, благодаря чему холодный запуск программызанимает намного меньше времени.Демон preload может существенно повысить скорость загрузкиприложений, но произойдет это только в том случае,если система оснащена достаточно большим объемомпамяти. Два гигабайта — это минимум, при котором preloadINFOinfo• Свой вариантprelink естьи в Mac OS X. Тамон носит имя«prebinding».• Реализация preloadдля Windows носитимя «Prefetcher»(позднее «Super-Fetch») и доступна,начиная с Windows XP.• Вместоклассическойсистемы init,дистрибутив Ubuntuиспользует системупараллельнойзагрузки сервисовupstart, котораяможет сократитьсреднее времяинициализациисистемы до 15-20секунд.• cryopid.berlios.de —домашняя страницаCryoPID.• people.redhat.com/jakub/prelink.pdf —описание Prelink отавторов.• behdad.org/preload.pdf — описание Preloadот авторов.• www.checkpointing.org — список ПО длязаморозки процессов.• dmtcp.sourceforge.net—распределеннаясистема заморозкипроцессов.XÀÊÅÐ 08 /139/ 10 095