Добавить в избранное | Сделать стартовой страницей

Большая Linux библиотека для пользователей OS Linux и ПО для нее
Есть что сказать? Нужен совет? Посети наш форум.




Продвинутая оптимизация Linux.

Автор : X-Stranger

Эта статья проведет вас через различные шаги настройки вашего Linux и файловой системы под конкретный тип процессора, объем памяти и сеть.
Обычно такие настройки используются для серверов, позволяя повышать их быстродействие, но также будет полезно их использовать и для обычных настольных систем.

Первое, что мы будем изменять, это файл /etc/profile. Файл /etc/profile содержит системное окружение всех исполняемых программ. Все настройки, добавленные в этот файл, отражаются на переменные окружения вашей системы. Так, поместив в этот файл флаги оптимизации, мы получим увеличение производительности компилируемых программ. Чтобы выжать максимальную эффективность из ваших программ, при компиляции вы можете использовать флаг -09, обозначающий полную оптимизацию по скорости. В Makefile многих программ, которые вы компилируете, содержится опция -02. Но, поставив вместо нее -09, мы получим высший уровень оптимизации, при которой размер файла увеличивается, но увеличивается и скорость выполнения.
Замечание. Использование опции -09 не всегда приводит к наилучшим результатам. Опцию следует использовать для процессоров x686 и выше, но не для более старых процессоров.
Также при компиляции можно использовать опцию -fomit-frame-pointer, которая говорит, что для доступа к переменным нужно использовать стек. К сожалению, с этой опцией практически невозможна отладка. Также можно использовать переключатели -mcpu=cpu_type и -march=cpu_type, при помощи которых создается код, оптимизированный под определенный CPU. Полученный код будет работать только на заданном процессоре или более новом.

Итак, приведенные ниже оптимизационные флаги запишем в файл /etc/profile (они влияют только на программы, которые вы будете компилировать в дальнейшем, и не оказывают никакого действия на существующие файлы):
? для CPU i686 или PentiumPro, Pentium II, Pentium III в файл "/etc/profile" добавьте следующую строку: CFLAGS='-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions'
? для CPU i586 или Pentium в файл "/etc/profile" добавьте следующую строку: CFLAGS='-O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-mem -fforce-addr -malign-double -fno-exceptions'
? для CPU i486 в файл "/etc/profile" добавьте следующую строку: CFLAGS='-O3 -funroll-all-loops -malign-double -mcpu=i486 -march=i486 -fomit-frame-pointer -fno-exceptions'

Сразу же после выбора типа процессора добавим в строку export файла "/etc/profile" переменные "CFLAGS LANG LESSCHARSET":
export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL INPUTRC CFLAGS LANG LESSCHARSET
Теперь выйдите из системы и вновь в нее войдите, чтобы опции, определенные переменной CFLAGS, вступили в силу и все программы и другие configure-утилиты стали ее учитывать. Оптимизация под Pentium (Pro/II/III) будет работать только с компиляторами egcs и pgcc. Egcc уже входит в стандартную поставку Linux. Ниже приведено описание опций, которые мы использовали:
-funroll-loops ? выполняется оптимизация развертыванием циклов. Осуществляется для циклов, число итераций которых может быть определено во время компиляции или во время выполнения.
-funroll-all-loops ? выполняется оптимизация развертыванием циклов. Развертывает все циклы, и обычно программы, скомпилированные с этой опцией, медленнее запускаются.
-ffast-math ? эта опция разрешает GCC нарушать некоторые ANSI или IEEE правила и/или спецификации в интересах оптимизации кода по скорости выполнения. Например, это позволяет компилятору предполагать, что параметры к функции sqrt ? неотрицательные числа.
-malign-double ? контролирует, выравнивает ли GCC double, long double и long long переменные на двусловной границе или однословной границе. 

Выравнивание double переменных на двусловной границе создает код, который выполняется на Pentium-процессорах несколько быстрее, расходуя больше памяти.
-mcpu=cpu_type ? определяет значение типа процессора при планировании используемых инструкций. При определении конкретного типа CPU, GCC будет использовать инструкции специфичные для него. Если эта опция не определена, то будут использоваться только команды, работающие на i386 процессоре. Тип процессора I586 эквивалентен Pentium, i686 эквивалентен Pentium Pro, K6 ? AMD.
-march=cpu_type ? использовать инструкции для процессора cpu_type. Выбор типа процессора производится так же, как и для опции mcpu. Кроме того, использование опции -march=cpu_type подразумевает и использование опции -mcpu=cpu_type.
-fforce-mem ? принуждает копировать операнды, хранящиеся в памяти, в регистры перед выполнением арифметических операций над ними. В результате получается более лучший код, в котором все ссылки на ячейки памяти потенциально общие подвыражения. Когда они не являются общими подвыражениями, то комбинации команд должны устранить отдельную загрузку регистра.
-fforce-addr ? вынуждает копировать постоянные адреса памяти в регистры перед выполнением арифметических операций над ними. В результате может создаваться более хороший код, так же как и при -fforce-mem.
-fomit-frame-pointer ? не сохранять frame pointer в регистре для функций, которые не нуждаются в этом. Это позволяет избежать инструкций на сохранение, определение и восстановление frame pointer, в то же время освобождая регистры для других функций. Это также делает невозможным отладку программы.

Следующее, на что стоит обратить внимание, это файл bdflush. Он вплотную связан с операциями в подсистеме виртуальной памяти ядра Linux и имеет некоторое влияние на использование диска. Этот файл (/proc/sys/vm/bdflush) контролирует операции демона ядра bdflush. Мы используем этот файл для улучшения производительности файловой системы. Изменяя некоторые значения в файле, принятые по умолчанию, мы добьемся, чтобы система стала более "отзывчивой", например, она ждет чуть больше при осуществлении записи на диск, что позволяет таким образом избегать некоторых конфликтов доступа.
За основу возьмем Red Hat Linux. По умолчанию bdflush в Red Hat Linux использует следующие значения: "40 500 64 256 500 3000 500 1884 2". 

Для изменения значений в bdflush введите следующие команды на вашем терминале:
echo "100 1200 128 512 15 5000 500 1884 2">/proc/sys/vm/bdflush

Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера. Для более свежих дистрибутивов следует использовать другой способ: в файл /etc/sysctl.conf добавьте следующую строку:
vm.bdflush = 100 1200 128 512 15 5000 500 1884 2

Чтобы изменения вступили в силу, надо перезагрузить систему.
В вышеприведенном примере согласно файлу документации /usr/src/linux/Documentation/sysctl/vm.txt первый параметр в % определяет максимальное число "грязных" буферов в кэше буферов. "Грязные" означают то, что содержимое буфера должно быть записано на диск. Присвоение этому параметру высокого значения означает, что Linux в течение долгого времени может задерживать запись на диск, но в то же время это означает, что когда это все же потребуется, то сброс всех буферов будет осуществляться дольше, т.к. самих "грязных" буферов будет больше. Низкое значение будет распределять операции ввода-вывода более равномерно.

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

Третье значение (nrefill=128) определяет число буферов, которые bdflush будет добавлять в список свободных при вызове функции refill_freelist(). Чем выше число, тем больше памяти будет потрачено впустую и тем реже будет необходимо вызывать refill_freelist().

Следующий параметр ? nref_dirt=512. Когда refill_freelist() натолкнется на больше, чем nref_dirt "грязных" буферов, то просыпается демон bdflush.
Параметры age_buffer (50*m) и age_super parameters (5*m) обозначают максимальное время, которое Linux ждет перед записью грязных буферов на диск. Значение выражено в мигах (clockticks), число мигов в секунду m=100. Как описывается в английской литературе, "age_buffer это "возраст" блоков данных, а age_super ? "возраст" метаданных файловой системы" (дословный перевод).

Пятый параметр (15) и последние два (1884 и 2) не используются системой, так что мы оставим их значения по умолчанию.
Замечание. Читайте /usr/src/linux/Documentation/sysctl/vm.txt о том, как улучшить параметры ядра, связанные с виртуальной памятью.

Файл buffermem. Этот файл тесно связан с работой подсистемы виртуальной памяти Linux ядра. Значения в этом файле (/proc/sys/ vm/buffermem) контролируют, как много памяти используется под буферную память (в процентах). Следует отметить, что проценты берутся от общей системной памяти. Значение по умолчанию в buffermem для Red Hat:
"20 10 60"
Для изменения значений параметров используйте следующие команды:
echo "80 10 60" >/proc/sys/vm/ buffermem
Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера. Или отредактируйте файл "/etc/sysctl.conf" и добавьте следующую строку:
vm.buffermem = 80 10 60
Чтобы изменения вступили в силу, стоит перезагрузить систему.
В вышеприведенном примере согласно файлу документации /usr/src/linux/Documentation/sysctl/vm.txt первый параметр (80%) говорит использовать минимум 80% системной памяти под буферный кэш (минимальное число процентов памяти, которое должно быть использовано под буферную память). Последние два параметра (10 и 60) не используются системой, и мы их оставляем без изменений.
Замечание. О том, как улучшить параметры ядра, связанные с виртуальной памятью, читайте в файле /usr/src/linux/Documentation/sysctl/vm.txt.

Файл ip_local_port_range. Этот файл содержит два целых числа, определяющих интервал портов, которые используют TCP и UDP при выборе локального порта. Первое число ? это нижнее возможное значение, а второе ? верхнее. В серверных системах эти числа имеют значения 32768 и 61000 соответственно. По умолчанию в Red Hat файл ip_local_port_range содержит значения "1024 4999". Чтобы изменить эти значения, используйте следующие команды:
echo "32768 61000" > /proc/ sys/net/ipv4/ip_local_port_range
Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера. Или отредактируйте файл /etc/sysctl.conf и добавьте следующую строку:
net.ipv4.ip_local_port_range = 32768 61000
Чтобы изменения вступили в силу, стоит перезагрузить систему.

Файл /etc/nsswitch.conf. Этот файл используется для настройки того, какой сервис использовать для получения такой информации, как имя хоста, файл паролей, файл с группами и т.д. Два последних пункта (файл с паролями и файл с группами) рассматриваться не будут. Таким образом, акцентируем наше внимание на строке hosts. Отредактируйте файл nsswitch.conf и измените строку hosts, чтобы она читалась:
hosts: dns files
которая говорит программам, желающим определить адреса, что вначале необходимо воспользоваться службой DNS, а затем, если DNS не отвечает, файлом "/etc/hosts". Также настоятельно рекомендуется удалить все вхождения NIS из каждой строки, если вы не используете NIS. В результате файл /etc/nsswitch.conf может выглядеть следующим образом:
passwd: files
shadow: files
group: files
hosts: dns files
bootparams: files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files
automount: files
aliases: files

Файл file-max. Значение в этом файле определяет максимальное число дескрипторов файлов, которые может распределить ядро. Мы настраиваем этот файл на увеличение числа открытых файлов. Для серверных систем рекомендуется следующее правило: увеличьте значение /proc/sys/fs/file-max до значения примерно равного 256 на каждые 4M RAM, например, для машины со 128 M установите значение равное 8192 (128/4=32, 32*256=8192). По умолчанию в Red Hat file-max равен 4096. Чтобы изменить эти значения, используйте следующие команды:
echo "8192" >/proc/sys/fs/file-max
Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера. Или отредактируйте файл "/etc/sysctl.conf" и добавьте следующую строку:
fs.file-max = 8192
Чтобы изменения вступили в силу, стоит перезагрузить систему.
Замечание. Когда вы начинаете получать много ошибок о выходе за пределы файловых дескрипторов (running out of file handles), увеличьте значение file-max. Файловому и веб-серверам нужно много открытых файлов.

Файл inode-max. Этот файл (/proc/sys/fs/inode-max) определяет максимальное число дескрипторов блоков индексов (inode). В нашем примере мы настраиваем этот файл на увеличение числа открытых блоков индексов (inode), увеличивая "/proc/sys/fs/inode-max" до значения в 3-4 раза большего (8192*4=32768) числа открытых файлов (file-max). Это обусловлено тем, что на каждый открытый файл приходится как минимум 1 блок индекса, а для больших файлов ? намного больше. По умолчанию в Red Hat inode-max равен 16376. Чтобы изменить эти значения, используйте следующие команды:
echo "32768" >/proc/sys/fs/ inode-max
Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера. Или отредактируйте файл /etc/sysctl.conf и добавьте следующую строку:
fs.inode-max = 32768
Чтобы изменения вступили в силу, стоит перезагрузить систему.
Замечание. Если вы регулярно получаете сообщение run out of inodes, то вам необходимо увеличить значение inode-max. Помните, что этот параметр зависит от file-max. Файловому и веб-серверам требуется много открытых индексных блоков.

Параметр ulimit. Linux имеет ограничение "Max Processes" для каждого пользователя. Этот параметр показывает, как много процессов может иметь пользователь. Для улучшения производительности вы можете спокойно увеличить это значение для пользователя root, сделав его неограниченным. Добавьте следующую строку в файл /root/.bashrc:
ulimit -u unlimited
Теперь вы должны перелогиниться (сделать logout и login). Для проверки, что вы все сделали правильно, дайте команду (как root):
ulimit -a
в строке с max user processes должен быть текст "unlimited".
Увеличим также системные ограничения на открытые файлы. Процесс в Red Hat 6.0 с ядром 2.2.5 может открыть не меньше 31000 файловых дескрипторов и процесс на ядре 2.2.12 ? не меньше 90000 файловых дескрипторов (согласно установленным ограничениям). Верхняя граница зависит от доступной памяти. Увеличение этого числа до 90000 для пользователя root делается следующим образом: отредактируйте файл /root/.bashrc, добавив следующую строку:
ulimit -n 90000
Теперь вы должны перелогиниться. Для проверки, что вы все сделали правильно, дайте команду (как root):
ulimit -a
в строке с open files должен быть текст "90000".

Атрибут atime (access time). В дополнении к информации о дате создания и последней модификации файла, Linux создает запись о последнем обращении к файлу. Эта информация не очень полезна и при этом происходят затраты системных ресурсов на ее ведение. Файловая система ext2 позволяет суперпользователю маркировать отдельные файлы, чтобы запись о времени последнего доступа к ним не велась. Это может существенно улучшить эффективность системы, особенно, если установить этот атрибут для часто используемых файлов, например, для /var/spool/news. Для установки атрибута на один файл используется команда:
chattr +A filename
Для всех файлов в каталоге:
chattr -R +A /var/spool/
Для снятия же атрибута надо писать не +A, а -A.

Атрибут noatime. Linux имеет опцию монтирования файловой системы, называемую noatime. Она может быть добавлена в поле опций файла /etc/fstab. Если файловая система смонтирована с этой опцией, то при доступе к ней по чтению информация atime изменяться не будет. Важность установки опции noatime в том, что она устраняет необходимость операции записи в файловую систему для файлов, которые просто читаются. Так как запись "дорогая" операция, то ее отсутствие может существенно улучшить эффективность системы. Обратите внимание, что информация wtime продолжает изменяться при записи в файл. В нашем примере мы устанавливаем опцию noatime для файловой системы /mnt/linux_games. Отредактируйте файл /etc/fstab и добавьте, например, такую строку:
/dev/hda7 /mnt/linux_games ext2 defaults,noatime 1 2
Перезагрузите вашу систему и проверьте, что у вас получилось:
reboot
cat /proc/mounts
В результате одной из строк, выводимых на экране, должна быть
/dev/hda7 /mnt/linux_games ext2 rw,noatime 0 0
Мы видим, что /mnt/linux_games имеет атрибут noatime.

Swap-раздел. Поместите ваш swap-раздел вблизи начала вашего диска, которое физически располагается на внешней стороне цилиндра. В результате за один оборот головка охватывает большую поверхность. При помощи команды hdparm -t я вижу, что с разделом, помещенным в конце диска, скорость работы на 3 MB/s медленнее.

Настройка производительности IDE-дисков. Быстродействие IDE-дисков увеличивается при использовании UDMA. Ядро использует консервативный режим работы с дисками, пока ему не скажешь изменить это. "Волшебная" команда для изменения установок ? это hdparm. Включение 32-bit I/O через шину PCI:
/sbin/hdparm -c 1 /dev/hda (или hdb, hdc и т.д.)
Руководство man для hdparm говорит, что для некоторых чипсетов нужно использовать "-c 3". Все (E)IDE диски до сих пор имеют 16-разрядное подключение через ленточный кабель к интерфейсной карте. Включение DMA:
/sbin/hdparm -d 1 /dev/hda (или hdb, hdc и т.д.)
Возможность использования этой команды зависит от поддержки чипсета вашей материнской платы ядром. При включении DMA отменяется синхронизация буферизированного чтения диска, в результате чего быстродействие может увеличиться в 2 раза. Для включения multiword DMA mode 2:
/sbin/hdparm -d 1 -X34 /dev/ hda (или hdb, hdc и т.д.).
Эта установка используется для (E)IDE/ATA2 дисков (посмотрите документацию к вашему диску). Для включения UltraDMA mode2:
/sbin/hdparm -d 1 -X66 /dev/ hda (или hdb, hdc и т.д.)
Вам нужно будет заранее подготовить ваш чипсет к использованию UltraDMA, так что прочитайте man-ы к hdparm. Используйте этот режим очень осторожно!
Для включения multiple sector mode I/O:
[root@deep]# /sbin/hdparm -m XX /dev/hda (или hdb, hdc и т.д.)
где "XX" ? максимальные установки, поддерживаемые вашим диском. Для поиска максимальных значений установленных жестких дисков может использоваться флаг -i (в выводимой информации смотрите значение MaxMultSect).

Многосекторный режим (IDE Block Mode) поддерживается большинством современных IDE жестких дисков, передача нескольких секторов за одно I/O прерывание быстрее, чем обычное односекторное. Когда эта возможность включена, обычно, понижаются "накладные расходы" на операциях ввода/вывода на 30-50%. На многих системах в результате также увеличивается пропускная способность от 5% до 50%. Вы можете проверить, чего добились, запустив hdparm в режиме проверки производительности:
/sbin/hdparm -t /dev/hda (или hdb, hdc и т.д.)
Как только вы определили все параметры hdparm, не забудьте добавить соответствующие команды в файл /etc/rc.d/rc.local.

Последнее, что мы сделаем, это заставим Linux обрабатывать большее число TCP/IP соединений за определенное время. Нижеописанные настройки уменьшают время TCP/IP подключения, чтобы можно было обработать больше соединений за тот же интервал. Также будет уменьшено время, которое Linux ждет до закрытия соединения, и время, через которое Linux разрывает устаревшее соединение. Эти настройки отключат некоторые расширения протокола TCP/IP, которые нам не нужны. Значения параметров TCP/IP стека, принятые в Red Hat по умолчанию:
tcp_fin_timeout "180"
tcp_keepalive_time "7200"
tcp_window_scaling "1"
tcp_sack "1"
tcp_timestamps "1"
Чтобы изменить параметры TCP/IP, используйте следующие команды:
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, чтобы они выполнялись каждый раз при загрузке компьютера. Или отредактируйте файл /etc/sysctl.conf и добавьте следующие строки:
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0
Чтобы изменения вступили в силу, стоит перезагрузить систему.

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

Начнем с того, что заставим наш Linux занимать меньше места на винчестере. Для этого нам понадобятся следующие инструменты: архиваторы gzip или bzip2 (жмет лучше, чем первый), входящие в любой современный дистрибутив, и упаковщик исполняемых файлов upx, который можно найти в Интернете. Не помешает также иметь ровные руки и трезвую голову:).

Итак, приступим. Для начала мы удалим исходные тексты ядра. Вы могли их поставить просто случайно, ставя первый раз Линукс или просто так, но я практически на сто процентов уверен, что вы ими не пользуетесь. А так как исходные тексты ядра занимают 20-100 и больше мегабайт, то, скорее всего, вы захотите их удалить. Если так, то откомпилируйте новое ядро, которое будет работать с вашей машиной, и освободитесь от исходных текстов. Они лежат в /usr/src/linux. Но удалять их лучше разынсталлируя пакет, их содержащий. Не рекомендуется удалять исходные тексты ядра до тех пор, пока вы не удостоверитесь, что новое ядро, которое вы, возможно, создали, правильно установлено и работает. Кроме того, вам могут понадобиться header-файлы ядра для того, чтобы компилировать программы на C.

Теперь приступим к удалению лишних приложений. Решите, какие приложения вам на самом деле необходимы. Некоторые могут оказаться излишествами: например, уверены ли вы в том, что вам очень нужен Emacs? Вместо него можно использовать другой, более мелкий и удобный текстовый редактор. От вас зависит, что оставлять, а что удалять. Вот несколько основных принципов:

? компилятор gcc довольно велик по размеру. Он используется для компиляции ядра и практически всех программ Linux. Разумеется, он вам понадобится, если вы будете писать собственные программы на C, поэтому определитесь с вашими потребностями, перед тем как удалить его. Также можно удалить все остальные пакеты для разработки программ, если вы не программист;
? X11/X-Window система еще больше, но это вещь, которую хотелось бы иметь под рукой. Если вы решились его удалить, то не удаляйте все, постарайтесь обойтись необходимым минимумом: нужный Х-сервер, один простенький менеджер окон, единственный xterm, никаких шрифтов на 100 dpi, и т.п.;
? TeX и сопутствующие программы занимают большой объем. Уход от LaTeX и переход на чистый TeX сэкономит много места; это же дает удаление программ предварительного просмотра в X11, таких как xdvi и ghostview, и, возможно, если у вас есть dvitty, dvivga или некоторые им подобные;
? игры никогда не являются "необходимостью";).

Практически все программы можно удалить, просто удалив пакет, который их содержит. Для этого используются программы kpackage и gnorpm.
Теперь давайте приступим к уменьшению объема самих программ. Перейдите в /usr/bin и наберите команду
strip *
Она удалит из запускамых файлов всю информацию, которая может понадобиться только тем, кто занимается debug'ом программ, но не относится к телу программы. Повторите это действие в /usr/X11R6/bin и других каталогах, содержащих исполняемые программы (не забывайте про программы TeX и gcc), но не делайте этого в /sbin, /bin или /usr/sbin, т.к. здесь это особо не уменьшит размер файлов, но может повредить некоторые из них.
Следующий шаг ? сжатие программ при помощи upx. Сначала установите upx и прочтите документацию к нему. Затем перейдите в /usr/bin и запустите там команду
upx *
Она закомпрессирует все исполняемые файлы. Повторите эти действия во всех каталогах, описанных выше. Помните, что архивировать исполняемые файлы надо всякий раз, когда вы устанавливаете новую программу. Т.е. заново пересжимать уже сжатые файлы, конечно, никто не будет, но только что установленные будут сжаты.
Есть множество других файлов, которые можно заархивировать раз и навсегда. Начнем с каталога /usr/doc. Перейдите в этот каталог и наберите команду
find. -type f -exec gzip -9 {} ; 2> /dev/null
Эта команда сожмет все файлы документации, расположенные в данном каталоге. Но это не помешает их смотреть, т.к. при просмотре в большинстве случаев автоматически происходит распаковка сжатых gzip или bzip2 файлов. Помните, что архивировать документацию надо всякий раз, когда вы устанавливаете новую программу, к которой прилагается документация. Здесь справедлив тот же принцип, который применялся к предыдущему пункту. Повторите эти действия в других ваших каталогах, содержащих документацию. Если же использовать при сжатии архиватор bzip2, то результат операции будет лучше, но распаковка будет чуть медленнее. Если вы уверены, что документация вам не нужна, то вы просто можете удалить все эти каталоги.

С "обрезанием" и уменьшением Linux'а покончено. Теперь можно приступить к освобождению памяти.
Начнем с ядра. Все ядра Linux, которые поставляются вместе с дистрибутивами, раздуты и поддерживают множество возможностей, которые вам могут никогда не понадобиться. Если вы еще не пересобирали ядро, то можете попробовать это сделать, но здесь нужен трезвый ум и полное понимание того, что делаешь. Существуют множество прекрасных книг и руководств по Linux, которые также рассказывают об этом, а я тоже писал про это в последних "Вопросах и ответах".
Если вы пересобираете ядро, запомните, что совсем не надо использовать все возможности ядра. Например, как часто вы включаете, к примеру, поддержку PLIP в ядро? Как часто вы будете это использовать? Маленькое ядро требует меньше времени для загрузки, меньше памяти и меньше загружает процессор.
Другая важная вещь в ядре ? модули. Использование модулей позволяет не держать код ядра, который реализует какую-нибудь фишку, в памяти, а подгружать его только тогда, когда это необходимо.
Виртуальные консоли ? это прекрасный путь освободить память. Большинство дистрибутивов Linux запускают около 6 виртуальных консолей ? именно между ними вы переключаетесь, используя комбинации Alt+F1 ? Alt+F6. В среднем, использование 6 консолей требует около 4 Мб памяти. Если убрать пару консолей, можно освободить пару мегабайт памяти. Большинство пользователей используют 3-4 консоли. Например, я использую только две. Сколько консолей вы оставите ? это ваше личное дело. Просто запомните, что чем меньше виртуальных консолей вы используете, тем больше памяти остается для работающих приложений. Количество используемых консолей описывается в файле /etc/inittab. Для того чтобы убрать виртуальную консоль, загрузите /etc/inittab в текстовый редактор, найдите строки, похожие на:
c1:12345:respawn:/sbin/getty tty1 38400 linux
c2:12345:respawn:/sbin/getty tty2 38400 linux
Начиная с наибольшего номера (например, c6), закомментируйте строку, поставив знак '#' в начале строки. Повторите этот шаг столько раз, сколько вам нужно. Запомните, каждая закомментированная строка убирает одну виртуальную консоль. Перезапустите систему, чтобы изменения вступили в силу.
Большинство дистрибутивов Linux запускают множество демонов (что это такое, я уже писал раньше; но _грубо_ говоря это типа сервисов, как в Win2k, но только лучше), которые никогда не используются. Чаще всего они запускаются через скрипты. Где находятся скрипты и какие из них запускаются, зависит от дистрибутива. Чаще всего их можно найти в /etc/rc.d/rc.*.

Прежде чем продолжить, стоит сказать, что вам было бы неплохо уметь писать скрипты. Книга по скриптам лежит на моем сайте в разделе документации. Для тех, кто уже знаком со скриптами, напомню, что скрипт должен начинаться со строки "#!/bin/sh" или подобной, после которой каждая строка запускается командным интерпретатором так, как будто она была введена с клавиатуры (так что скрипт ? не что иное, как простые макросы клавиатуры).
Строки, начинающиеся с '#', являются комментариями и не исполняются. Большинство скриптов запуска демонов выглядят следующим образом:
if условие then
что-то
fi
Все, что мы хотим сделать ? это закомментировать строки между if и fi.
Для того чтобы найти скрипт, в котором запускается демон, нужно поискать скрипт на предмет наличия в нем названия демона. Если я хочу найти, где запускается inetd, то должен сделать следующее:
cd /etc/rc.d
grep -n inetd rc.*

Кратко перечислю демоны, которые можно удалять (список не претендует на полноту и достаточность):
? inetd ? этот демон поддерживает такие вещи, как telnet, ftp и talk. Если вы не используете свою машину как сервер или не хотите иметь удаленный доступ к своей машине, то можете убрать inetd;
? lpd ? используется для печати файлов на принтере командой lpr. Если вы не пользуетесь печатью на своей машине, то можете убрать lpd;
? nfsd и mountd ? это два демона, образующие NFS сервер. Если вы не используете свою машину как NFS сервер, то можете спокойно убрать эти два демона;
? portmap ? этот демон используется для поддержки сервиса RPC. Если вы не используете NFS или любую другую программу, использующую RPC, то можете убрать portmap;
? sendmail ? это еще один демон, требующий достаточно много памяти. Если вы не используете свою машину в качестве почтового сервера, то можете убрать sendmail. Если вы пользуетесь электронной почтой, то программу чтения почты можно настроить на другой почтовый сервер.
Могут быть также другие демоны в системе, которые вам не нужны. Удалите их, если они не нужны. Вы должны обязательно оставить только два демона ? это syslogd и klogd, которые ведут логи вашей Линукс-системы.

В более новых дистрибутивах запуск демонов прописан другим способом. В etc/rc.d есть другие подкаталоги, каждый из которых соответствует определенному runlevel'у. Для отключения какого-либо сервиса достаточно удалить соответствующую символическую ссылку в нужном каталоге на скрипт, запускающий этот сервис. Все скрипты, как правило, лежат в /etc/rc.d/init.d. Стоит также заметить, что еще проще и удобнее делать отключение сервисов при помощи соответствующих конфигурационных программ: linuxconf, drakconf (для Mandrake Linux).

Вот и все. Стоит заметить, что результат выполнения вышеописанных действий зависит лишь от того, насколько вы разобрались в Linux. Так что используйте эти принципы на свой страх и риск. А также побольше читайте документацию (RTFM ? кто знает, тот поймет;). Удачи!


Обсудить данную тему на нашем форуме "Все о Linux"