Prelink и Preload для ускорения запуска программ в Linux

    В этой заметке я опишу две утилиты, которые помогут ускорить работу системы Linux, а конкретно — запуск приложений: prelink и preload. Prelink оптимизирует исполняемые файлы для быстрого связывания с библиотеками. Preload кэширует часто используемые библиотеки и программы.
    Подробности под катом.

    Prelink


    Большинство приложений в Linux используют динамически загружаемые библиотеки, которые содержат различные функции, необходимые для их работы. При каждом запуске приложения должны быть также загружены эти библиотеки. В случае тяжелых приложений, имеющих большое количество связей, этот процесс может занять определенное время. При этом выполняемые для связывания библиотек действия одинаковы, если сами библиотеки не меняются. Утилита prelink позволяет прописать связи с библиотеками непосредственно в исполняемый файл, что ускорит запуск приложения. Выполняется это без перекомпиляции приложений.
    Установите приложение prelink средствами вашего дистрибутива. В файле /etc/prelink.conf содержится список путей, файлы по которым prelink будет обрабатывать. Модифицировать этот список вам скорее всего не придется, это за вас сделали авторы вашего дистрибутива. Запустите prelink -amfR (--all --conserve-memory --force --random) для выполнения прелинкинга всех приложений. Описание опций:
    -a — All, применить предварительное связывание ко всем выполняемым файлам.
    -m — Сохраняет пространство виртуальной памяти. Это требуется, если вы имеете много библиотек, которые необходимо связать.
    -f — Вынуждает повторить предварительное связывание для файлов, которые уже подвергались ему. Это необходимо, т.к. программа prelink прекращает обработку существующих старых связанных файлов, зависимые библиотеки которых могли измениться.
    -R — Random, выбирает случайный порядок адресов, это увеличивает безопасность против атак переполнений буферов.
    Учтите, что запускать prelink необходимо после каждого обновления библиотек и/или приложений. Можно назначить его на запуск по cron.

    Preload


    Preload — демон, собирающий информацию о часто используемых программах и библиотеках и кэширующий их в памяти для быстрого запуска. Соответственно нерационально использовать его, если у вас мало оперативной памяти. Настройки находятся в файле /etc/preload.conf. Стандартные значения скорее всего вам подойдут, однако я приведу описание основных опций:
    model.cycle — как часто preload будет получать от системы данные об используемых программ и библиотек.
    model.halflife — как часто preload будет сбрасывать старую информацию.
    model.minsize — ограничение на размер программы или библиотеки, которую preload будет обрабатывать.
    В файле /var/lib/preload/preload.state можно увидеть информацию о работе preload.

    Тестирование


    При помощи утилиты time делались пять замеров выполнения команды «php -v» с интервалом в пару секунд. Сначала пять замеров без оптимизаций, затем была запущена утилита prelink, проведены пять замеров. Наконец, был запущен демон preload, после появления php в кэше preload были снова проведены пять замеров. Результаты отображены на графике (цифры — миллисекунды):



    Следует заметить, что на десктопе выигрыш в производительности будет существенно больше, за счет «тяжелых» DE, имеющих большое количество связанных библиотек.

    Были использованы материалы:
    * www.gentoo.org/doc/en/prelink-howto.xml
    * sourceforge.net/projects/preload

    UPD: В этом комментарии snakeye приводит более корректный график, где ось Y начинается с 0.
    UPD2: В этом комментарии wRAR поправляет насчет описания опции -f prelink.
    Share post

    Similar posts

    Comments 40

    • UFO just landed and posted this here
        +1
        Ок, обновлю график.
          0
          Серьезно взялся за техническое писательство :)
            +13
            ось Y должна быть всё же с нуля внизу начинатся, а не с 92. Иначе это просто обманка — данные отличаются на проценты, а стобцы — в разы.
              0
              Если уж на то пошло, то и тестировать нужно не одну программу, а несколько разноплановых приложений.
                0
                Да, график лжет, такая подача материала для рекламы хороша=)

                Но если иллюстрировать им не фразу «prelink офигенно уменьшает время работы», а «выигрыш от использования preload значительно меньше, чем от использования prelink» то этот график пойдёт.

                Хотя и тест очень сферический, запуск php -v чуть более чем полностью состоит из загрузки php в память, в то время как нормальные программы выполняют после своего запуска хоть какую-то работу (в идеале время потраченное на запуск намного меньше времени работы)
            • UFO just landed and posted this here
              • UFO just landed and posted this here
                • UFO just landed and posted this here
                  • UFO just landed and posted this here
                    • UFO just landed and posted this here
              +1
              preload в opensuse 11.3 с desktop-ядром устанавливается сам
                0
                а почему нет отдельно preload на графике?
                  +2
                  Глянул на график — в 2 раза ускорение, супер! Присмотрелся, всего-то ~ 9%… Не наглядно как-то.
                    +3
                    Да, на графике наглое надувательство!
                    0
                    У меня eclipse будет быстрее 2 часов загружаться?
                      0
                      врядли
                      только jvm стартанет быстрее в лучшем случае
                      +14
                      Из графика создаётся впечатление, что прирост скорости будет более чем в 2 раза. На самом деле, он меньше 10%

                        0
                        Спасибо за корректировку, добавил ссылку на Ваш комментарий в пост.
                        0
                        Есть мнение что Prelink больше не нужен
                        www.google.ru/#q=Prelink++DT_GNU_HASH&hl=ru
                          +1
                          Because these lookups have to be done whether or not the shared libraries involved have been prelinked, prelinking and DT_GNU_HASH are complementary and systems can do both.
                          Конкретную ссылку можете дать?
                          +2
                          буквально, вчера наткнулся на статью habrahabr.ru/blogs/linux/20901/
                          там более подробно расписано о preload.
                          проверил — действительно стало немного шустрей работать.
                            0
                            это для вебсерверов может быть полезным или только для desktop'ов?

                            точнее что можно prelink'овать и preload'ить на вебсервере?
                              0
                              То что часто запускается.
                              / КО
                                0
                                ну тогда к вебсерверам это не применимо, т.к. там все запускается только один раз и постоянно висит в памяти
                                  0
                                  По preload я тоже пока не понял, есть ли в нём смысл при не перезагружающейся машине.
                                    0
                                    При не перезагружающейся — есть. Вы ведь браузер, текстовые радакторы, терминалы, плееры и т.д. постоянно запускаете. На сервере — смысла нет, т.к. там всё запускается всего один раз и без всяких preload'ов из памяти не выгрузится.
                                      0
                                      Однако, например, на сервере мониторинга — актуально. Тот же Nagios постоянно запускает пинги и прочие тесты.
                              +1
                              "-f — Вынуждает повторить предварительное связывание для файлов, которые уже подвергались ему. Это необходимо, т.к. программа prelink прекращает обработку существующих старых связанных файлов, зависимые библиотеки которых могли измениться."

                              -f --force
                              Force re-prelinking even for already prelinked objects whose dependencies are unchanged.
                                0
                                Спасибо за исправление, добавил ссылку на Ваш комментарий в пост.
                                0
                                Взглянул на график и с первого взгляда показалось, что увеличивает скорость более, чем в 2 раза. Но потом посмотрел на шкалу в миллисекундах и понял, что не в 2, а скорее в 1,1 раза. Совсем несущественно.
                                  0
                                  во блин. не обновил страничку. Про график уже отписали. Не успел
                                  0
                                  ммм… что-то мне это напоминает… кажется, тоже на «pre» начинается
                                    0
                                    Насколько использование prelink безопасно? Есть шансы, что всё поломается при следующем обновлении?
                                      0
                                      Ничего не поломается, но после обновления prelink необходимо запустить снова.
                                      0
                                      Спасибо, preload уже давно пользуюсь!
                                        0
                                        ухх, а как эти prelink, updatedb, makewhatis задалбывали пользователя свежеустановленного линукса 3-4 года назад.
                                          +1
                                          Тестирование в статье — чистая и наглая спекуляция.

                                          Утверждаю это, как человек, посвятивший год жизни проблеме времени стартапа приложений (решение этой проблемы в некотором частном случае было темой моего диплома) и сломавший немало копий только на тестировании времени старта.

                                          В комментариях выше уже говорилось про график, начинающийся не от нуля, а также малое количество протестированных приложений.
                                          Но хотелось бы прояснить еще пару моментов.

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

                                          Во-вторых, существуют термины «холодного» и «горячего» старта, то есть когда приложение незакешировано в памяти (до первого запуска) и закешировано, соответсвенно. Разница между холодным и горячем стартом приложения может измеряться секундами, а то и десятками секунд в зависимости от размеров приложения. Соответственно, если автор не гарантировал холодный старт, то тест, вообще говоря, абсолютно ничего не показывает.

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

                                          Поэтому, более показательным был бы пример с полной загрузкой системы (я, например, после использования Preload заметил явное визуальное ускорение в загрузке KDE).
                                            0
                                            нюню… спецы по сусе (от новелла) на форумах пишут, что смысла особого в прелоаде нет. в чём на собственной практике убедился изучив чего он там кеширует и тд… к примеру в сусе, имо, не очень внятные настройки. они кагбе не «самозатачивающиеся» отнюдь. самому менять это можно конечно, я даже сделал…
                                            но особо выйгрыша не получил и забил. не так часто ребутится комп.
                                              0
                                              >>Можно назначить его на запуск по cron.

                                              А как его добавить в расписание cron?
                                              Он разве не только со скриптами работает?

                                              Only users with full accounts can post comments. Log in, please.