Твердотельные накопители становятся все доступнее и занимают все большую часть рынка. Вот и я решил заменить hdd c windows seven своего нетбука Lenovo IdeaPad S10-2 на SSD c Ubuntu Netbook.

В этой записи я собрал нагугленные заметки по оптимизации работы Linux на SSD для рабочей станции.

Разметка диска и файловая система

В первую очередь, нужно забыть про раздел подкачки, все прекрасно работает и без него. Для SSD лучше использовать не журналируемую файловую систему. Журнал нужен для того, чтобы, после пропадании электропитания, восстановить незавершенные транзакции — не потерять данные и оставить ФС целостной. Так как большинство SSD используются в ноутбуках/нетбуках, где присутствует батарея, пропадание электропитания практически невозможно, журнал не нужен. Я использую 100 Мб под /boot с ext2, 20 Гб как / с ext4 и все остальное под /home, так же с ext4. Файловую систему ext4 я выбрал так как она позволяет отключать журнал после создания файловой системы, делается это так:

root@localhost:~$ tune2fs -o journal_data_writeback /dev/sda1
root@localhost:~$ tune2fs -O ^has_journal /dev/sda1
root@localhost:~$ e2fsck -f /dev/sda10

Так же, для увеличения производительности, к опциям монтирования в fstab рекомендуется добавить:

relatime,nodiratime,discard,commit=60

Здесь у некоторых может возникнуть подозрение, что использование noatime эффективнее чем relatime. Это не так, relatime обновляет время доступа только при изменении файла или изменении времени доступа. Это нужно для нормальной работы некоторых программ, в том числе почтовых клиентов. Опция discard включает поддержку TRIM. Так же откладываем до раза в минуту запись изменений на накопитель commit=60.

Логи на рабочей станции мало кому нужны после перезагрузки, поэтому целесообразно разместить их, как и временные файлы, в оперативной памяти. Для этого добавим такие строки в fstab:

tmpfs	 /tmp           tmpfs	defaults,noatime,mode=1777	0 0
tmpfs	 /var/tmp	tmpfs	defaults,noatime,mode=1777	0 0
tmpfs	 /var/log	tmpfs	defaults,noatime,mode=0755	0 0

I/O планировщик

Планировщик cfq, используемый по умолчанию в большинстве дистрибутивов лучше заманить на noop. Для этого к опциям ядра в конфиге загрузчика нужно добавить:

elevator=noop

Параметры ядра

Включаем «режим ноутбука» для подсистемы виртуальной памяти, в таком режиме, ядро будет откладывать запись на диск, пока в этом не появится неотложная необходимость. Кроме того повысим таймаут между сбросом буферов до 15 секунд:

vm.laptop_mode = 5
vm.dirty_writeback_centisecs = 15000

Firefox & Chrome

Временные файлы мы перенесли в оперативную память, но браузеры хранят свой кеш в домашнем каталоге пользователя, который у нас на SSD. Нужно либо переместить кеш с SSD, либо выключить его. Я выбрал последний вариант.

Для этого в адресной строке Firefox введем about:config и изменим параметр:

browser.cache.disk.enable: false

В Chrome немного сложнее, запретить кеш раз и навсегда нельзя, вместо этого нужно каждый раз запускать браузер с параметром --disk-cache-size=0:

google-chrome --disk-cache-size=0

Или создать alias:

alias google-chrome='google-chrome --disk-cache-size=0'

Кэш пакетных менеджеров

Так же может быть полезным вынести кэш менеджера пакетов в ОЗУ. Для deb-based дистрибутивов нужно добавить в fstab:

tmpfs   /var/cache/apt/archives tmpfs   defaults        	0 0

Для rpm-based дистрибутивов нужно добавить в fstab:

tmpfs   /var/cache/yum tmpfs   defaults        			0 0

UPD20130310: Обновлены обции монтирования, добавлен вынос кеша пакетных менеджеров в ОЗУ.

Тем кто использует такие операционные системы как Gentoo и FreeBSD пакеты ccache и distcc должны быть хорошо знакомы, те кто использует бинарные дистрибутивы так же могли о них слышать.

Ccache — кеш C/C++ компиляторов. При компилировании какого-либо файла вычисляется его хэш, если файл с таким хэшем есть в локальном кеше, то файл не будет повторно компилироваться, вместо этого будет использован файл из кеша. Так как при обновлении программы, как правило, изменяются не все файлы исходного кода, использование кеша позволяет существенно ускорить не только повторную компиляцию программы, но и ее обновлений.

Distcc — позволяет компилировать исходные коды C/C++/ObjC на нескольких компьютерах. Поддерживает кросс-платформенное компилирование. Для отсутствия ошибок в программ скомпилированных посредством distcc на всех компьютерах должна быть установлена одинаковая версия gcc, например 4.3.x, при этом x — может отличаться.

Рассмотрим установку и настройку ccache и distcc в бинарном дистрибутиве, на примере Debian Linux. Некоторые могут сказать, подобные программы в бинарном дистрибутиве не нужны, в общем то это справедливо, но только до тех пор, пока не требуется использование apt-build, make-kpkg и вас полностью устраивает набор ПО и их версий включенных в текущий релиз.

Пакеты ccache и distcc включены в стандартные репозитории Debian, поэтому их установка сводится к выполнению одной команды:

root@localhost:~$ apt-get install ccache distcc

Настройка Ccache

Чтобы начать использовать ccache во время компиляции нужно установить несколько переменных окружения, сделаем это через .profile или .bashrc, добавим такие строки:

export PATH=/usr/lib/ccache:$PATH
export CC="ccache gcc"
export HOSTCC="ccache gcc"
export HOSTCXX="ccache g++"
export CCACHE_DIR="/var/cache/.ccache"

Переменная CCACHE_DIR — устанавливает каталог где хранится кеш C/C++ компиляторов, по умолчанию она равна $HOME/.ccache.

Настройка Distcc

Данная будет полезна только тем у кого в распоряжении есть несколько компьютеров с одной версией gcc, например ПК и ноутбук, или ноутбук или домашний сервер.

Все настройки демона distcc в Debian находятся в файле /etc/default/distcc:

 
STARTDISTCC="true"
 
ALLOWEDNETS="127.0.0.1 192.168.0.0/24"
 
LISTENER="0.0.0.0"
 
JOBS="4"

Число джобов не должно быть больше числа ядер:

root@localhost:~$ cat /proc/cpuinfo |grep processor |wc -l
4

Таким образом следует настроить distcc на каждом хосте. После настройки демонов их нужно запустить:

root@localhost:~$ invoke-rc.d distcc start

Теперь клиентская часть, в .profile или .bashrc, добавим:

export CCACHE_PREFIX="distcc"
export CONCURRENCY_LEVEL=7
export DISTCC_HOSTS="localhost/3 192.168.0.2/2 192.168.0.3/2"

В переменной DISTCC_HOSTS указывается перечень хостов, через слеш указывается максимальное число параллельных задач компиляции которое может быть принято хостом, кроме того, если хост находится не в локальной сети, есть смысл включить lzo-компрессию. Для локальной машины стоит указать число задач на 1 меньше максимального, так как, кроме непосредственно процесса компиляции, она будет обрабатывать задачи отправляемые на удаленные хосты посредством distcc.
Переменная CONCURRENCY_LEVEL устанавливает максимальное число параллельных задач компиляции в момент времени.

На последок, немного практики, соберем ядро Linux 2.6.36 на копьютере с процессором Intel Atom D510:

root@localhost:/usr/src/linux-2.6.36$ time make-kpkg --initrd --revision=atom1 kernel_image
kernel_headers
...
real	64m37.225s
user	135m48.470s
sys	27m38.509s

Подчистим за собой

root@localhost:/usr/src/linux-2.6.36$ make mrproper
root@localhost:/usr/src/linux-2.6.36$ make-kpkg clean

И соберем ядро еще раз:

root@localhost:/usr/src/linux-2.6.36$ time make-kpkg --initrd --revision=atom1 kernel_image
kernel_headers
...
real	21m36.359s
user	31m15.794s
sys	12m5.879s

Статистика ccache выглядит при этом примерно так:

root@localhost:/usr/src/linux-2.6.36$ ccache -s
cache directory                     /var/ccache/.ccache
cache hit (direct)                 17112
cache hit (preprocessed)              18
cache miss                          8624
called for link                      110
unsupported source language          117
unsupported compiler option         4494
no input file                       4224
files in cache                     25844
cache size                           1.5 Gbytes
max cache size                       2.0 Gbytes

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

В качестве плеера используем mpd, благодаря своей клиент-серверной архитектуре он подходит для таких целей идеально. Серверная часть работает как демон, воспроизводит музыку и принимает управляющие команды от клиентского приложения. При этом клиентом может быть графическое GTK/Qt приложение, консольная утилита или веб-интерфейс (есть даже [urlspan]плагин для firefox[/urlspan]). Для использования с консольным сервером наиболее пригоден последний вариант — веб-интерфейс, он позволяет управлять музыкальным центром как с ПК, так и с любого мобильного устройства имеющего браузер и подключение к домашней WiFi-сети.

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

Установим требуемые пакеты:


Все настройки mpd расположены в конфигурационном файле /etc/mpd.conf:
music_directory         "/media/music"
playlist_directory      "/media/playlists"
db_file                 "/var/lib/mpd/db"
 
bind_to_address         "localhost"
port                    "6600"
 
default_permissions     "read,add,control,admin"
 
audio_output {
        type            "alsa"
        name            "My ALSA Device"
        device          "hw:0,0"
        format          "44100:16:2"
        mixer_device    "default"
        mixer_control   "PCM"
        mixer_index     "0"
}
 
audio_output {
        type            "shout"
        name            "My Shout Stream"
        host            "localhost"
        port            "8000"
        mount           "/stream.ogg"
        password        "secret"
        bitrate         "128"
         protocol       "icecast2"
        user            "source"
        description     "My Stream"
        timeout         "2"
}
 
mixer_type              "software"
 
filesystem_charset      "UTF-8"

В приведенной конфигурации управление mpd возможно только с локального компьютера, именно поэтому разрешены все команды без пароля. После указания music_directory попросим mpd принудительно обновить базу данных аудио-файлов:

root@localhost:~$ invoke-rc.d mpd stop
root@localhost:~$ mpd --create-db

Пока база создается, скачаем и установим веб-интерфес для mpd. К сожалению проект pitchfork мертв, из живых мне больше всего понравился ExtJS MPD.

root@localhost:~$ cd /var/www
root@localhost:/var/www$ wget http://crsw.dk/Projects/Mpd/ExtMPD_1.3.tgz
root@localhost:/var/www$ tar xfv ExtMPD_1.3.tgz
root@localhost:/var/www$ chmod -R www-data: ExtMPD

Этого достаточно чтобы открыв в браузере http://<ip сервера>/ExtMPD/ увидеть примерно следующее:

Осталось настроить сервер потокового мультимедиа в лице icecast. Для этого в файле /etc/icecast2/icecast.xml исправим следующее:

    <authentication>
        <!-- Sources log in with username 'source' -->
        <source-password>secret</source-password>
        <!-- Relays log in username 'relay' -->
        <relay-password>secret</relay-password>
 
        <!-- Admin logs in with the username given below -->
        <admin-user>admin</admin-user>
        <admin-password>secret</admin-password>
    </authentication>
...
    <listen-socket>
        <port>8000</port>
        <bind-address>0.0.0.0</bind-address>
    </listen-socket>

Чтобы изменения вступили в силу, рестартуем icecast:

root@localhost:~$ invoke-rc.d icecast2 restart

После этого аудио поток будет доступен по адресу http://<ip сервера>:8000/stream.ogg. Приятного прослушивания!

Иногда нужно склеить несколько видео-файлов (с одинаковым разрешением и битрейтом) в один. Например несколько серий любимого сериала или фильм на двух CD. Для avi и mpeg в Linux процедура описана далее.

Логично предположить, что нам нужно объеденить файлы:

root@localhost:~$ cat fille01.avi file02.avi file03.avi > file00.avi

Если попытаться открыть итоговый файл медиаплеером — ничего хорошего не получится. Дело в том, что мы просто склеили файлы, теперь нужно перестроить индекс, в этом нам поможет mencoder:

root@localhost:~$ mencoder -forceidx -oac copy -ovc copy file00.avi -o file.avi

mencoder video1.avi video2.avi -oac copy -ovc copy -o new_input.avi

mencoder *.avi -oac copy -ovc copy -o new_input.avi

Полученный на выходе файл готов к употреблению.

Начиная с FreeBSD 10, в базовый состав операционной системы не входит DNS-сервер и его нужно устанавливать из портов отдельно. Этим мы и займемся.
Настройка будет серверная, а потому наш named, как и положено на защищенном сервере, будет резвиться в песочнице и отдавать только свои зоны.