Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Настройка системы
Насилуем Линукс!
[ Мануал :: Unix-Linux ]

Оптимизация Линукс... У многих, наверно, при этом слове сжимается сердце и отвисает челюсть. Типа "что там оптимизировать-то? Линукс и так - рулез форева!" Нда... Молодой человек, вас я попрошу удалиться. А всех тех, кто уже всласть потрахался с этой дивной ОСью и понял, что пора лезть своими шаловливыми ручонками внутрь системы, - приглашаю к чтению. Сегодня состоится жесткий садо-мазо-сеанс, на котором ты после небольшого надругательства заставишь свою ОСь доставлять тебе наибольшую отдачу и удовлетворение. Let's go!

Зачем это надо?

"Зачем вообще что-либо оптимизировать? Ведь вроде и так все в *никсах рулем..." - скажешь ты и будешь абсолютно не прав. Все дело в том, что после инсталляции в преобладающем большинстве случаев по дефолту все настройки системы произведены с минимальной оптимизацией, которая включает в себя минимальные настройки производительности, скорости большинства девайсов, программ, etc. Можно, конечно, забить на все и продолжать сидеть в такой минимально оптимизированной Оси, а можно, что присуще кульному хацкеру, немного повозиться и заметно ускорить и улучшить работу своего друга Линукса. Ведь, в конце концов, это несложно.

Оптимизируем выполнение программ

Вполне естественно, что все настройки исполняемых программ находятся в файле /etc/profile . Немного пошаманив с файлом profile, мы можем получить хорошее увеличение производительности всех компилируемых прог. Все, что нужно сделать, так это добавить некоторые флаги в этот файл. Что нам нужно в первую очередь? Естественно, увеличение скорости. Поэтому добавляем в /etc/profile следующую строку:

CFLAGS='-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions'

Чтобы подстроить выполнение под свой проц, нужно просто задать конкретную модель:

-mcpu=cpu_type и -march=cpu_type

Таким образом, чтобы получить максимальное ускорение при компиляции программы, используется флаг 09, но при этом несколько увеличивается и вес программы.

Затем добавим в строку export файла "/etc/profile" переменные "CFLAGS LANG LESSCHARSET": export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL INPUTRC CFLAGS LANG LESSCHARSET

И остался последний шаг: перезайти в систему, чтобы все изменения вступили в силу. Стоит отметить, что будущая оптимизация компилируемых программ будет работать с компилятором Egcc, но это не трабла, т.к. он входит в Линукс по умолчанию.

Файловая система

Далее пунктом вторым у нас идет оптимизация святая святых всякого гика: файловой системы. Для этого нам понадобится файл bdflush, так как он, скажу тебе по секрету, связан с виртуальной памятью ядра Линукс. Находится он по адресу: /proc/sys/vm/bdflush . Что мы можем с ним сделать? В принципе, что угодно, но сейчас мы просто изменим некоторые дефолтовые значения в нем. Итак, начнем. Выполни следующую команду:

echo "100 1200 128 512 15 5000 500 1884 2">/proc/sys/vm/bdflush

Таким образом, меняются некоторые значения в файле bdflush. Говоря простым языком, мы меняем максимальное число буферов, содержимое которых должно быть записано на диск. Чтобы каждый раз не геморроиться с набиванием этой команды (мы же гики! :), просто добавим эту команду в /etc/rc.d/rc.local, и теперь она будет выполняться всякий раз при загрузке Линукса. В итоге мы имеем вот что: запись на диск заполненных буферов (что неминуемо подтормаживает систему) осуществляется позже, чем обычно. Следовательно, как я уже отметил, шансы на возникновение конфликтов оборудования значительно снижаются.
Следующим пунктом у нас идет атрибут noatime. Линукс вообще имеет опцию монтирования файловой системы через noatime. Надеюсь, и у тебя она стоит? Если нет, то срочно иди в /etc/fstab и добавляй атрибут noatime в поле опций. Кульность опции noatime в том, что теперь у системы для файлов, которые просто читаются, нет резона записи в файловую систему. А так как таких файлов не мало, то твоя работа с ними будет гораздо быстрей. Позволь задать тебе один глупый вопрос: ты к файлам часто обращаешься? Так вот знай, что Линукс ведет подробную статистику последних обращений к тому или иному файлу. Естественно, любым нормальным людям эта инфа не нужна, да к тому же на ее ведение расходуются системные ресурсы. Поэтому убиваем эту статистику контрольным выстрелом в лоб! Заюзай команду chattr +A filename для одного часто используемого файла, а для всех файлов в каталоге - chattr -R +A directory. Теперь, думаю, можно закончить с улучшением файловой системы.

Снимаем ограничения

Ты можешь удивиться, но по умолчанию даже для рута, вроде бы полного Бога системы, некоторые настройки выставлены "не как надо". То есть и на его работу наложены ограничения. Сейчас мы займемся тем, что будем эти ограничения резать! Сначала разберемся с процессами. Нет, со своими бракоразводными процессами ты разберешься как-нибудь сам, а мы займемся процессами, идущими (а у некоторых и стоящими) в твоей ОСи. Каждый пользователь, включая и рута, имеет право запустить только ОПРЕДЕЛЕННОЕ конкретно под себя количество таких процессов. Всем этим занимается параметр "Max Processes". Установим право на НЕОГРАНИЧЕННОЕ выполнение процессов для рута. Чтобы это воплотить в жизнь, нужно просто изменить указанный параметр "Max Processes". Для этого просто добавь в строку /root/.bashrc строчку: ulimit -u unlimited . Теперь ребутни систему, зайди рутом и проверь нашаманенное тобой командой: ulimit va. Параметр "Max Processes" должен быть равен ?unlimited│. Теперь количествово запускаемых процессов ограничено лишь твоими системными ресурсами :). Увеличим также системные ограничения на открытые файлы. Надеюсь, ты не вылез из /root/.bashrc? Именно там нужно добавить эту строчку: ulimit -n 90000. Теперь у рута есть возможность открытия 90000 файловых дескрипторов вместо 31000. Но для выполнения этой операции убедись, что ядро у тебя не ниже 2.2.12. Соответственно, как и в первом случае, для проверки перелогинься под рутом и используй команду: ulimit -a. В строке с open files твой соколиный глаз должен заметить текст "90000".

Жесткий диск

Ну а теперь приступим к самому дорогому, что есть у тебя, порнушника и варезокачателя, - винту, а именно последовательно проведем оптимизацию всех его разделов, что неминуемо приведет к увеличению скорости и стабильности его работы. Все операции проделаем в статусе рута, естественно. Вначале необходимо узнать, как обозначается твой винт: hda, hdb... Это ты должен знать уже после установки Линукса, но если запамятовал, то используй команду dmesg. Выяснив обозначение жесткого диска (пусть для примера это будет hda, как наиболее часто встречающийся), выясни, что поддерживает твой винт с помощью команды hdparm -I /dev/hda. Теперь пришло время отметить скорость винчестера: hdparm -t /dev/hda. Запомни результат - потом сверишь с полученным :). Следующим шагом будет просмотр значений, которые твой хард имеет по дефолту (командой hdparm /dev/hda). Так, видим, что режим мульти-чтения с диска отключен. Что ж, впору исправить это: hdparm -c3 -m16 /dev/hda. Эта команда включит режим многопоточного считывания. Теперь проверь скорость винта еще раз. Ну что, видишь прирост скорости? :) Следующим шагом будет включение DMA и 32-битной разрядной поддержки (взамен 16-битной). Для этого есть команда: hdparm -d1 /dev/hda.

Осталось последнее - записать все изменения в файл, чтобы они были в силе после того как ты ребутнешь/выключишь комп. Для этого в знакомом /etc/rc.d добавь в самый конец файла rc.local следующую строчку: hdparm -c3 -m16 /dev/hda. Теперь проверяем скорость и видим не менее чем 2-ух кратное увеличение. Все, диск оптимизирован, с чем тебя и поздравляю!

Кстати, еще одна фича относительно винта. Настоятельно советую тебе разместить свой swap-раздел вблизи НАЧАЛА диска, а не конца, что иногда наблюдается у некоторых НЕчитателей ][ ;). Результат сей операции не замедлит сказаться: за один оборот диска головка будет охватывать гораздо большую поверхность, что не замедлит сказаться и на его работе, а именно будет считывать больше данных. Все дело в том, что НАЧАЛО диска физически располагается на внешней стороне цилиндра - вот и весь секрет :). На этом разговор об оптимизации жесткого диска, приятель, позволь считать оконченным. Эй! Секундочку! По домам еще расходиться рано! Продолжаем...

Ядро

Ну, наконец-то наши шаловливые ручки дотянулись до архиважного элемента Линукса - ядра. Поэтому его оптимизация отразится на всей системе в целом. Но, как сам понимаешь, в отличие от других элементов Оси, к твикингу ядра нужно отнестись с осторожностью. Но и бояться не стоит. Главное - сразу решить, что тебе нужно, а что - нет. Подумай, от чего тебе есть резон отказаться. Если у тебя на компе вместе с *никсами заинсталлена Вынь98, то, скорее всего, есть смысл ВООБЩЕ отказаться от видео и графики, тулз для game'инга и т.д. Если же у тебя на тачке только Linux, то, парень, во-первых, разреши пожать твою мужественную руку, а во-вторых, резать ядро тебе придется самую малость, я полагаю. Короче, каждый должен решить для себя сам. Но общие советы все-таки я дам. Вначале ядро нужно как можно более уменьшить, освободить от всего того, что явно не требуется. Используем cd /usr/src/linux; make xconfig (make menuconfig). Далее можно полностью подстроить и оптимизировать ядро под себя. Выполняем следующее:

1) В качестве семейства процессоров установить PPro/6x86MX для Pentium II/III систем и разрешить MTRR для PentiumPro//II/III.

2) Если у тебя не сервер, то обязательно запрети 'Advanced Power Management'.

3) Обязательно разреши использование DMA по дефолту (Use DMA be defaults).

4) Поставь поддержку только своего чипсета, поддержку остальных сноси к чертовой матери.

5) Установи максимальное число Unix98 PTYs в 128 для стабильности.

6) Сноси на фиг поддержку джойстиков, портов для инфракрасных девайсов, etc.

7) И, наконец, запрети поддержку всех не нужных тебе сетевых устройств. Мысли - типа "А может понадобится в дальнейшем..." - прибивай сразу :). Вот когда понадобятся, тогда и перекомпилишь ядро. А <про запас> - это стиль Билли.

8) Также некоторые маньяки могут запретить поддержку видео, драйверов для звуковых карт. Но это уже дело вкуса и личной необходимости.

Интернет без тормозов!

Думаю, для тебя не секрет, что все *nix-системы, и Линукс в частности, идеально подходят для выхода в сеть: ведь TCP/IP-протокол для таких Осей - родной. Но все-таки, несмотря на это, предлагаю тебе оптимизировать и скорость твоего бесконечного выхода в Инет. Линукс Линуксом, но качество наших российских телефонных линий оставляет желать лучшего. Во-первых, еще до соединения с Интернетом нужно время самих TCP-подключений уменьшить, тем самых позволив системе обработать большее число соединений за то же время. Также можно уменьшить время, которое Линукс ждет на закрытие "устаревших" соединений. Вот параметры, которые нужно подправить в Кровавой Шапке (aka RedHat):

tcp_fin_timeout "180"

tcp_keepalive_time "7200"

tcp_window_scaling "1"

tcp_sack "1"

tcp_timestamps "1"

Для примера возьму 6.1 версию Red Hat. Чтобы исправить эти параметры в шелле, в статусе рута, введи:

echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

echo 1800 >/proc/sys/net/ipv4/tcp_keepalive_time

echo 0 > /proc/sys/net/ipv4/tcp_window_scaling

echo 0 > /proc/sys/net/ipv4/tcp_sack

echo 0 > /proc/sys/net/ipv4/tcp_timestamps

Конечно, чтобы эта команда каждый раз выполнялась, не забудь добавить ее в /etc/rc.d/rc.local .

Теперь мне придется набить твою умную хацкерскую голову небольшой теорией - не бойся, это не долго :). Вот, вкратце, что происходит, когда ты пытаешься зайти на какой-либо сайт. Вначале твой комп посылает запрос на соединение с выбранным сайтом, который имеет открытый 80 порт. Затем проверяется, нет ли этого сайта на твоем собственном компе или твоей локалке, т.е. сравнивается IP-адрес. Для этого проверяется файл /etc/hosts и локальный файл "nameserver" в каталоге /etc/resolv.conf. Если твой собственный IP и тот адрес, к которому ты хочешь законнектиться, не совпадают, то компьютер, естественно, начинает коннектиться к этому IP. Таким образом, "nameserver" просто переводит www.xxx.com в IP-адрес, сравнивая его со своими и другими базами. (Помнишь, ты устанавливал первичный и вторичный DNS провайдера в настройках? Вот они и есть те самые базы.) "nameserver" занимает ключевое место в этом процессе. Поэтому мы сейчас сотворим с ним что-нибудь такое: авось и убыстрим соединение с Инетом! :) Фишка в том, что можно произвести небольшую модернизацию этого файла и заставить его делать DNS-кеширование ко всем пагам, которые ты посетил, что заметно ускорит их загрузку. Итак, иди в /etc/named.conf и отредактируй этот файл таким образом:

options {

directory "/var/named"; forwarders {

123.123.123.123;

123.123.123.124; };

};

....

Тем самым, если создастся ситуация, что один IP недоступен, будет загружен следующий за ним и т.д. Наконец, теперь изменим файл /etc/resolv.conf , просто добавив эти строки:

# nameserver 321.321.321.321

nameserver 127.0.0.1

Вторая строчка означает, что все запросы не должны перенаправляться, если могут быть загружены с твоего локального nameserver'a. Т.е. ты ставишь вторичным nameserver-ом свой собственный комп. Осталось лишь перезагрузить свой nameserver командой:

killall -HUP named

ОК, мы с тобой настроили свой nameserver так, чтобы делалось DNS-кеширование и, соответственно, увеличивалась скорость загрузки страничек!

Напоследок

Осталось поговорить только об общих командах и советах, описывать которые подробно совершенно бессмысленно, но выполнить их не помешает, опять-таки следуя принципу <режем все, что тормозит систему!> Во-первых, воспользовавшись командой ntsysv, снеси на фиг все ненужные запускаемые во время загрузки приложения. Во-вторых, не пожалей денег на оперативку и камень побольше. Проверить, насколько перегружен твой милый проц, можно командой sar -q. Если %runocc > 90, а runq-sz > 1, то считай, дружище, что ты попал :), так как все выполняемые процессы ждут больше времени на выполнение, и, следовательно, ВСЯ твоя Ось подтормаживается. Поэтому, может быть, стоит подумать о покупке камня побыстрее.

Ну и, в-третьих, будь гиком, и все у тебя будет зашибись и по жизни, и в Линуксе!

Нагорский Артем aka Cordex