Ускорение загрузки

Опубликовано 5 Октября, 2008 под тегами Debian, Cheats, Debian

Мне удалось немного ускорить загрузку своей ubuntu (примерно 19 секунд), убрав время “простоя” системы (нулевой активности жестких дисков и процессора - примерно 15 секунд) и убрав из загрузки лишние модули (еще около 5 секунд).

[caption id=“attachment_101” align=“alignleft” width=“132” caption=“Время загрузки до оптимизации”][Время загрузки до оптимизации](/images/hardy-20081004-1.png)[/caption]

[caption id=“attachment_102” align=“alignleft” width=“85” caption=“После оптимизации”][После оптимизации](/images/hardy-20081004-25.png)[/caption]

Введение

ВО-ПЕРВЫХ, ПРОВЕРЬТЕ, ИМЕЕТ ЛИ СМЫСЛ ПОВТОРЯТЬ ПРЕДЛОЖЕННЫЕ ОПЕРАЦИИ, У ВАС МОЖЕТ БЫТЬ ВСЕ В ПОРЯДКЕ Чтобы посмотреть на таблицу загрузки, установите пакет bootchart:

sudo apt-get install bootchart

и ищите в /var/log/bootchart/ На первой картинке можно наблюдать три периода бездействия. Первый остался у меня с тех пор, как я убрал у себя swap-раздел (4 Gb оперативной памяти - более чем достаточно), второй - это ожидание fsck. Третий - ожидание старта cupsd.

Swap

Первый “провал” отсутствует на большинстве систем, но если он имеет место быть (и у вас отключен swap), то нужно удалить/переместить файл /etc/initramfs-tools/conf.d/resume и выполнить

sudo update-initramfs -u

Возникает он из-за того, что система ожидает инициализации swap-раздела, которого на практике нет.

Fsck

Второй “провал” возникает по той причине, что стандартный скрипт проверки корневой файловой системы пытается писать лог этой самой проверки в /var/log/fsck/, что, естественно, невозможно, если система примонтирована в readonly режиме (а она примонтирована в нем на момент проверки). Поэтому система ждет, пока ФС перемонтируется. Ожидание почему-то затягивается на 5 секунд, хотя перемонтируется ФС значительно раньше. Вариантов как избавиться от этого всего два: либо монтировать на /var другой том, либо отключить лог. Последнее делается простой правкой /etc/init.d/checkroot.sh Строчка

logsave -s $FSCK_LOGFILE fsck $spinner $force $fix -V -t $roottype $rootdev

заменяется на

fsck $spinner $force $fix -V -t $roottype $rootdev

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

Cupsd

Третий, в общем-то, есть лишь следствие модели загрузки, но и от него можно избавиться. Дело в том, что система ожидает, пока демон запустится и “скажет” об этом. Этого радостного события можно не дожидаться, просто запуская демон в фоновом режиме: /etc/init.d/cupsys

case "$1" in
  start)
        log_begin_msg "Starting $DESC: $NAME"
        chown root:lpadmin /usr/share/ppd/custom 2>/dev/null || true
        chmod 3775 /usr/share/ppd/custom 2>/dev/null || true

        mkdir -p `dirname "$PIDFILE"`
        if [ "$LOAD_LP_MODULE" = "yes" -a -f /usr/lib/cups/backend/parallel 
             -a -f /proc/devices -a -f /proc/modules -a -x /sbin/modprobe ]; then
          modprobe -q lp || true
          modprobe -q ppdev || true
        fi

        start-stop-daemon --start --quiet --background --oknodo --pidfile "$PIDFILE" --exec $DAEMON

        log_end_msg $?
        ;;

(для запуска в фоновом режиме в строке start-stop-daemon --start --quiet --oknodo --pidfile "$PIDFILE" --exec $DAEMON добавлен параметр --background )

Дополнительная оптимизация

Как видно из картинок, у меня стоит пакет readahead. Я не уверен в его полезности, но он есть. О нем, наверное, в другой раз. Так же, я отключил загрузку лишних модулей acpi, уменьшил initramfs, и тп. Конкретно: Для уменьшения объема initramfs в /etc/initramfs-tools/initramfs.conf нужно установить

MODULES=dep

после чего выполнить

sudo update-initramfs -u

Для отключения лишних модулей acpi исправьте в /etc/default/acpid строчку MODULES. Для системы типа “настольный” вполне достаточно модулей

MODULES="ac, processor, button, fan, thermal, video"

и то, я не уверен насчет первого. Так же я отключил большинство проприетарных модулей: /etc/default/linux-restricted-modules-common

DISABLED_MODULES="ath_hal fc fglrx ltm"

(у меня видеокарта nvidia, и да, я пользуюсь проприетарными драйверами) Плюс, я выключил запуск bluetooth, но он запускается меньше секунды, поэтому, думаю, это неважно. Помимо прочего, на многоядерном процессоре в /etc/init.d/rc полезно установить

CONCURRENCY=shell

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