Ускорение загрузки
Мне удалось немного ускорить загрузку своей 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
это позволяет выиграть еще несколько секунд. Еще несколько секунд может позволить выиграть монолитное ядро, однако это уже требует значительно больших усилий и создает сложности при обновлении не только самого ядра, но и многих модулей, поэтому не рекомендую.