вторник, 12 марта 2013 г.

Оптимизация Linux для SSD

Абсолютно адовый (долго шел к нему) мануал по оптимизации Linux под SSD накопители. Под катом куча ссылок и пункты. Расположены в порядке установке.
Сначала куча ссылок по которым я этот мануал собрал

Смысл простой - уменьшаем запись на SSD, если есть такая возможность - переводим это на HDD. У меня такой не было.
Алсо, вы же понимаете что нет смысла активно использовать tmpfs и при этом делать своп. Мне на 2 Гб RAM хватает держать браузер в tmpfs и не использовать подкачку.

Поехали по шагам

1. Разделы должны быть выравнены
Фишка в том что если разделы не выравнены, то запись по сути дела одной страницы, может затрагивать две. Поэтому надо их выровнять. Для этого необходимо чтобы первый раздел начинался с отступом 2048. Все остальные разделы будут подстраиваться.
Стоит сказать что винда всегда делает первый раздел таковым, то что если первый раздел от Windows, то все уже выровнено.
Тащемта все разделы должны делиться на 2048, хорошее описание что и почему можно прочесть в посте Siduction.
Я так и не понял, сможет ли это сделать установщик (по идее, если таблица разделов gpt - да) и сделал из LiveCD Ubuntu используя GParted, то что можно использовать любой другой LiveCD с GParted.


Если у вас накопитель < 2 Тб, то выбираем таблицу разделов ms-dos, иначе профита от gpt я не вижу, возможно поправьте меня.

Создаем разделы (в моем случае это / и /home).
При создании первого раздела просто указываем отступ в 1 MiB (эта единица измерения используется по умолчанию).


Бутаемся в установщик. На нетбук я решил поставить Ubuntu из mini.iso и накатить Xfce. Делаю это всегда из expert text install, в других вариантах и установщиках процесс аналогичный.


2. Доходим до разбиения дисков (выбора файловой системы)
Выбор тут следующий:
  • Ext2
  • Ext4
  • BTRFS
  • ZFS
  • XFS
  • JFS
Я выбрал BTRFS, т. к. эта ФС проектировалась с оглядкой на SSD и имеет соотв. опцию, CoW, все дела.
На Ext4 обычно предлагают отключать журнал, т. е. делать из нее почти Ext2, но я считаю что при текущем возможном количестве записей на SSD, это не имеет смысла, но как это сделать таки описано ниже.

3. После установки - ставим опции разделов
  • Для BTRFS необходимо добавить к разделам находящимся на SSD опцию ssd
  • Для включения TRIM необходимо добавить к SSD разделам опцию discard, но это может повлиять на производительность и советуется выполнять следующую команду либо по Cron, либо периодически вручную
    sudo fstrim -v /точка/монтирования
  • Добавить либо noatime для выключения записи данных о последнем доступе к файлу или relatime для записи данных лишь о последней записи файла. Атеншн: noatime включает в себя nodiratime
Вот моя часть /etc/fstab с опциями разделов
UUID=171759d0-303e-4684-b3cd-32400238ff26 /               btrfs   defaults,ssd,relatime,subvol=@ 0       1
UUID=61c4754c-337d-46e0-af62-9292a772acc2 /home           btrfs   defaults,ssd,relatime,subvol=@home 0       2

4. Запихиваем некоторые вещи в tmpfs
Вторая часть моего /etc/fstab отвечает за запихивание /tmp и /var/lock, а еще и /var/run в tmpfs и выглядит следующим образом (у вас будет так же, ну может вы еще какие опции додумаете):
tmpfs /tmp tmpfs defaults 0 0
tmpfs /run tmpfs defaults 0 0
Таким же образом можно засунуть в tmpfs любую директорию.
У вас кстати могут быть другие директории, в Ubuntu просто /var/run и /var/lock это симлинки на /lock. Вам же может понадобиться прописать эти директории ручками, для проверки выполните
ls -l /var/
Ну вы понели
Еще: /dev уже везде в devfs, в подобных же псевдофс и /proc с /sys, то что на этом я остановился.
Не кидайте в tmpfs /var/tmp, он для долговременных временных файлов (sic! но да), используется например KDE.

5. Выставляем I/O контроллер
Таковых в настоящее время используется 3:
  • Noop - просто очередь, никаких оптимизаций, но для SSD они и не нужны. Лучше DeadLine на большом количестве мелких файлов.
  • DeadLine - лучше Noop на больших файлах, но медленее на большом количестве мелких, так то. В Ubuntu с 12.10 по дефолту.
  • CFQ - полноценный контроллер для HDD
Тут вот ссылочка с бенчмарком, которая является пруфом к вышенаписанному, то же самое написано в Wiki Debian. Но таки я выставил Noop.
Как сменить?
  • Добавив в /etc/rc.local следующее, где X - буква вашего диска (a, b, c, ...)
  • echo noop > /sys/block/sdX/queue/scheduler
  • Или поставить в /etc/default/grub в строчке GRUB_CMDLINE_LINUX_DEFAULT опцию elevator=noop, это изменит сабж для всех накопителей в системе. После этого нужно сделать
  • update-grub.
  • Еще есть кошерный путь через udev, его можете посмотреть в ArchWiki.
Сменить во время работы можно выполвнив, где X - буква диска, noop пример контроллера:
echo noop | sudo tee /sys/block/sdX/queue/scheduler

5. Отложенная запись
В /etc/sysctl.conf необходимо добавить строки
vm.laptop_mode = 5
vm.dirty_writeback_centisecs = 6000
Первая заставит ядро по возможности откладывать запись на носитель.
Вторая заставит его писать не чаще чем через 60 секунд, некоторые ставят 150.
Можно кстати сразу применить изменения выполнив
sudo sysctl -p

6. Уменьшение агрессивности использования подкачки
Указываем в том же /etc/sysctl.conf следующую строчку
vm.swappiness = 10
Согласно товарищу Мегабаксу, слишком большие значения могут негативно сказаться на вашем SSD, а слишком низкие привести к полной неэффективности подкачки. Это в процентах, поэтому 1-ца как-то мало, не знаю почему в некоторых гайдах ставят такое значение, зачем оно тогда вообще нужно.
Тоже можно сразу применить.

7. Выключаем журнал?
А нужно ли? Серьезно, не так уж и много он пишет, а все таки питание может выключиться или ноут повиснуть, в общем думайте сами, но если у вас нету аварийного источника питания, то я бы не советовал.
Для ext3/4 выполняем, где X это буква диска, Y номер раздела:
sudo tune2fs -O ^has_journal /dev/sdXY
Насколько я понял - для BTRFS отключить журнал нельзя.

8. Отключаем кеширование на диск браузерами
Вот это самая тема, я в браузере сижу почти всегда, поэтому он чаще всего пишет что-то и следовательно отправим это в память.
  • Firefox
  • Вбиваем в адресной строке about:config и в верхней строке страницы фильтруем опции по browser.cache.disk.enable, ставим эту опцию в false. Теперь ищем таким же образом опцию browser.cache.memory.enable, она уже должна быть в true, если нет - поставьте. Дальше ограничим этот кэш: право кнопкой в любом пустом месте на этой страничке, выбираем New -> Integer и в качестве названия указываем browser.cache.memory.capacity, далее нам предложат ввести значение, ставим что-нибудь вроде 524288, что есть 512 Мб. Следить за поглащением памяти можно на страничке по адресу about:cache.
  • Chromium
  • Его для этого надо запускать с опциями
    • --disk-cache-dir="CACHE_DIR"
    • --disk-cache-size=N, где N != 0
    Чтобы не запускать из консоли или руками, можно поправить .desktop файл: Копируем его в локальную папку (ну только не от рута же, а от рабочего пользователя):
    cp /usr/share/applications/chromium-browser.desktop ~/.local/share/applications/
    И правим любым редактором, добавляя к первой встретившейся строчке Exec эти параметры, у меня это выглядит так
    Exec=/usr/bin/chromium-browser --disk-cache-dir=/tmp/dearboy-cache/chromium %U
    Что заставляет его писать кэш в /tmp, который у нас в tmpfs.
    Есть кстати тонкость одна - Xfce у меня отказался эти опции принимать в "Браузер по умолчанию", то что запускать из меню Chromium нужно из раздела "Интернет". Ну и соотв. открыть таким образом браузер, не давая это первым сделать приложению. Ну или юзать Лису :3
  • Opera
  • Не нужна.


Ну вот и все, можно еще добавить как это делать в рантайме (через запись в файлы из /sys), но меня это уже так достало.
Еще скажу что утилита iotop поможет вам следить за интенсивностью записи/чтения диска. Приятного использования вашего SSD :3

И да - на нетбуке не помог, все равно все упирается в проц, а вот на ноут пожалуй поставлю.

Комментариев нет:

Отправить комментарий