Ключевые слова:boot, tune, linux, init, (найти похожие документы)
From: TuxR
Date: Sun, 19 Nov 2006 17:02:14 +0000 (UTC)
Subject: Быстрая загрузка Linux с параллельным запуском сервисов
Оригинал: http://www.rostovlinux.ru/content/view/927/56/
Написал Mark Alexander Bain, перевод: TuxR (Monday, 01 May 2006)
Оригинал: http://enterprise.linux.com/article.pl?sid=06/04/13/173227
Если долгая загрузка вашего Linux сводит вас с ума, попробуйте технику
параллельной загрузки.
Какие улучшения вы сможете заметить, по сравнению с вашим текущим порядком проц
есса загрузки?
Хорошо, давайте начнем; посмотрим сколько времени это занимает сейчас.
Засеките время, либо напишите простой скрипт для подсчета времени загрузки:
#Filename: time_booting
HOST=$1
RESULT=""
while [ "$RESULT" != "$HOST" ]
do
RESULT=$(ssh bainm@$HOST uname -n 2>&-)
done
Запустите отчет времени и нажмите кнопку включения компьютера.
$ time time_booting hector
real 2m54.014s
user 0m47.140s
sys 0m18.660s
В этом примере загрузка простого сервера занимает около трех минут.
Чтобы посмотреть, какие улучшения возможно сделать, вам нужно посмотреть
на исп ользуемый уровень выполнения (runlevel), какие приложения были
запущены и в каком порядке. Узнайте runlevel, набрав sudo runlevel , а
затем посмотрите соответствующие директории rc.d .
$ sudo ls -l /etc/rc$(sudo runlevel| awk '{print $2}').d
total 0
lrwxrwxrwx 1 root root 18 1999-10-20 01:12 S10sysklogd -> ../init.d/sysklogd
lrwxrwxrwx 1 root root 15 1999-10-20 01:12 S11klogd -> ../init.d/klogd
lrwxrwxrwx 1 root root 13 1999-10-20 01:11 S14ppp -> ../init.d/ppp
lrwxrwxrwx 1 root root 17 1999-10-20 01:43 S18portmap -> ../init.d/portmap
lrwxrwxrwx 1 root root 24 1999-10-20 02:12 S20binfmt-support -> ../init.d/binfmt-support
lrwxrwxrwx 1 root root 15 1999-10-20 01:12 S20exim4 -> ../init.d/exim4
lrwxrwxrwx 1 root root 15 1999-10-20 01:11 S20inetd -> ../init.d/inetd
lrwxrwxrwx 1 root root 13 1999-10-20 01:43 S20lpd -> ../init.d/lpd
lrwxrwxrwx 1 root root 17 1999-10-20 01:10 S20makedev -> ../init.d/makedev
lrwxrwxrwx 1 root root 18 1999-10-20 03:33 S20mono-xsp -> ../init.d/mono-xsp
lrwxrwxrwx 1 root root 15 1999-10-20 12:54 S20mysql -> ../init.d/mysql
lrwxrwxrwx 1 root root 18 1999-10-20 01:44 S20netatalk -> ../init.d/netatalk
lrwxrwxrwx 1 root root 27 1999-10-20 01:44 S20nfs-kernel-server -> ../init.d/nfs-kernel-server
lrwxrwxrwx 1 root root 20 1999-10-20 01:42 S20postgresql -> ../init.d/postgresql
lrwxrwxrwx 1 root root 15 1999-10-20 01:44 S20samba -> ../init.d/samba
lrwxrwxrwx 1 root root 13 1999-10-20 01:43 S20ssh -> ../init.d/ssh
lrwxrwxrwx 1 root root 20 1999-10-20 01:43 S21nfs-common -> ../init.d/nfs-common
lrwxrwxrwx 1 root root 20 2006-04-05 15:44 S22set_time -> /etc/init.d/set_time
lrwxrwxrwx 1 root root 13 1999-10-20 01:12 S89atd -> ../init.d/atd
lrwxrwxrwx 1 root root 14 1999-10-20 01:11 S89cron -> ../init.d/cron
lrwxrwxrwx 1 root root 17 1999-10-20 01:43 S91apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 19 1999-10-20 01:10 S99rmnologin -> ../init.d/rmnologin
lrwxrwxrwx 1 root root 23 1999-10-20 01:10 S99stop-bootlogd -> ../init.d/stop-bootlogd
Во время загрузки скрипт /etc/init.d/rc получает уровень запуска и
смотрит в со ответствующей директории (обычно, называющейся /etc/rc.d ).
Затем скрипт запускает все файлы из директории в алфавитном порядке.
Каждый файл фактически является ссылкой и его имя с буквы S и номера.
Эта схема создает порядок загрузки и гарантирует, что все зависимости
будут правильно обработаны. Например, в предыдущем листинге, S10 не имел
зависимостей , и, следовательно,запускался первым. S11 может зависеть от
S10 и запускаться следующим - и т.д.
В вышеприведенном примере показаны 12 процессов с префиксом S20. Они
запускаются последовательно и в алфавитном порядке. Если запуск каждого
из них потребует 10 секунд, это займет 2 минуты времени загрузки. Так
как каждый процесс имеет такой же уровень зависимостей, вы теоретически
можете запускать их параллельно, уменьшив время загрузки с двух минут
54 секунд до одной минуты и 4 секунд.
Сделаем смелый ход:
Понимание, почему загрузка происходит медленно - это одно, но сделать
что-то, относящееся к этому - совсем другое дело. Перед тем, как вы
начнете делать изменения, убедите сь, что вы сделали бэкап всего - или
еще лучше, используйте тестовый Linux. Нет гарантий, что вы не
сделаете что-то неправильно, а поломанный процесс загрузки может
привести к пол омке Linux.
Если вы уверены и знаете, что делаете, начнем с просмотра вашего
скрипта /etc/ init.d/rc. В конце файла вы найдете что-то вроде следующих
строк (хотя, я его сильно упрости л):
for i in /etc/rc$runlevel.d/S*
do
case "$runlevel" in
0|6) startup $i stop ;;
*) startup $i start ;;
esac
done
Вы можете заставить загрузочные процессы запускаться параллельно, сделав неболь
шое изменение
в коде:
*) startup $i start & ;;
Сделав это, я запустил свою проверку времени и получил эти результаты:
$ time time_booting hector
real 1m44.105s
user 0m0.613s
sys 0m0.674s
Это более, чем на 1 минуту быстрее.
К сожалению, у этой техники есть потенциальный недостаток. При
нормальной загру зке все запускается и завершается в порядке очереди.
Запуская каждый процесс параллельн о, вы не можете гарантировать, что
один процесс не захватит критическую секцию раньше, чем другой, от
которого он зависит будет завершен. Эта техника может работать у вас, но
возмож ны большие отклонения, чем планировалось.
Использование cinit для упрощения процесса
Чтобы избежать потенциальной проблемы, вам нужно модифицировать скрипт
так, что бы он проверял, что все зависимости удовлетворены перед тем,
как сервис будет запущен. Вы можете упростить этот процесс, установив
cinit, программу, спроектированную для включения параллельной загрузки
процессов и обработки зависимостей приложения. Однако, cinit не для
трусов или новичков. Вы не можете просто поменять init на cinit - вам
действительно нужно знать, что вы делаете. Это значит, что если вы
знаете, что делаете, то cinit может быть очень полезен.
Основная идея cinit проста - перейти в директорию, содержащую
упорядоченные наборы ссылок на приложения, которые вам нужно запустить.
Вместо этого, cinit предоставляет набор директорий (в /etc/cinit) - одну
для запуска каждого сервиса. Каждая директория содержит с сылку
(calledon) , которая указывает на приложение, которое должно быть
запущено. Другая особенность - две субдиректории: должны содержать
ссылки на сервисы, которые являются критическими для вашего нового
сервиса, и могут содержать ссылки на второстепенные сервисы, которые вы
хотите запускать раньше вашего нового. Файл параметров содержит (или
может быть ссылкой на) параметры, требующиеся сервису.
Это было краткое описание cinit. Давайте посмотрим пример:
$ ls -l /etc/cinit/pcmcia/modprobe/
lrwxrwxrwx 1 bainm bainm 14 2006-04-06 18:07 on -> /sbin/modprobe
-rw-r--r-- 1 bainm bainm 6 2006-04-06 18:09 on.params
$ cat /etc/cinit/pcmcia_module/on.params
pcmcia
Вы можете видеть, что сервис modprobe не имеет зависимостей. Однако,
следующий пример (cardmgr) требует, чтобы сервис modprobe стоял раньше,
чем он может быть запущен:
$ ls -l /etc/cinit/pcmcia/cardmgr/*
lrwxrwxrwx 1 bainm bainm 13 2006-04-06 18:20 pcmcia/cardmgr/on -> /sbin/cardmgr
pcmcia/cardmgr/needs:
total 0
lrwxrwxrwx 1 bainm bainm 20 2006-04-06 18:22 pcmcia_modules -> /etc/cinit/modprobe/
Вы можете прочесть больше о настройке cinit на веб-сайте Nico
Schottelius. Этот сайт также содержит несколько примеров конфигурации.
После двух дней работы с cinit, я получил следующие результаты:
$ time time_booting hector
real 2m03.003s
user 0m0.841s
sys 0m0.762s
, другой продукт, который использует параллельный запуск сервисов, это другой в
ыбор, заслуживающий проверки. Он все еще находится в процессе
разработки, и не имеет поддержки некоторых вещей, как cron, но похоже,
что он может использоваться и обычными(повседневными) пользователями, а
не только экспертами.
В зависимости от того, как хорошо вы понимаете Linux и насколько вы
отчаяны, вы можете сократить время загрузки. Вы можете пойти быстрым,
но потенциально опасным путем, либо вы можете потратить некоторое время
и силы для менее рискованного решения.