понедельник, 18 апреля 2016 г.

Перенос браузера на ram диск в linux

Я тут задумался над оптимизацией работы своей системы с диском. И задался целью выявить, кто же больше всего пишет на диск, благо в Linux это сделать не сложно. Нужно запустить из консоли:
sudo iotop -oPa
Для пущего эффекта перед запуском команды закройте браузер, а потом запустите вновь. Не скажу как насчёт Chrome и остальных, а вот Firefox с парой десяток вкладок в первые 5 минут после запуска запросто записывал на диск - пол гигабайта. Даже когда я в нём ничего не делал, он продолжал что-то писать. Ни один другой процесс больше у меня так активно с диском не работал.


Для системы на HDD такое поведение будет выливаться в тормоза. А для SSD мы получим уменьшение ресурса диска. Решать проблему будем переносом профиля и кеша браузера на Tmpfs. Оперативки сейчас у всех много, она быстрее чем SSD и уж точно чем HDD, а ресурс перезаписи у неё не ограничен в отличии от SSD.

Способ первый, специфичный для Firefox

Заходим в "about:config" и выставляем параметр "browser.cache.disk.enable" в "false" запрещая кеширование на диск. Находим там же "browser.cache.memory.enable" и убеждаемся, что он "true". Вот собственно и всё. Понятно, что такой способ перезагрузку или аварийное завершение браузера не переживёт. Плюс ещё хочется хранить в памяти профиль пользователя.


Делаем вручную и сами

В принципе делается это относительно просто. Находим раздел который живет на tmpfs:
df -h
Это зачастую "/tmp". После монтирования создаём там директорию, ну например "/tmp/firefox-username" копируем туда файлы из профиля "~/.mozilla" и из кеша "~/.cache/mozilla", а потом настоящие директории заменяем ссылками на вновь созданные. Далее, допустим раз в час, синхронизируем данные из "/tmp/firefox-username" куда-нибудь в постоянное хранилище на случай неожиданной перезагрузки. А при выключении машины возвращаем все на место.

Отловить события включение/выключения при помощи systemd можно например вот так, а синхронизация раз в час реализуются при помощи Systemd/Timers. Копирование лучше выполнять при помощи rsync, так надёжнее и удобнее будет. Плюс неплохо было бы добавить backup на случай аварийной ситуации при копировании.

В целом сделать это можно, но повозится прийдётся.

Используем готовый софт

Конечно существует уже готовый скрипт, который делает то, что описано в предыдущем разделе - profile-sync-daemon, плюс ещё немного. Но прежде чем приступить к его использованию нужно подготовиться. Сначала желательно уменьшить размер кеша в браузере. Для Firefox это "Настройки\Дополнительные\Сеть\Использовать под кеш не более" и выставить тут вменяемый размер, это нужно, если у вас не много памяти.

Далее желательно засунуть файлы браузера в одну директорию. Например Firefox создаёт директории по всему "/home" разделу ("~/.adobe", "~/.macromedia", "~/.mozilla", "~/.cache/mozilla" и т.п.), конечно тут и плагины постарались, но не суть. Единственный способ собрать это в одном месте, что я нашёл, написать скрипт:
#!/bin/bash
HOME=$HOME/.local/share/firefox /usr/bin/firefox "$@"
Назвать его "firefox" и положить в директорию, которая находится в "PATH" раньше, чем "/usr/bin". Таким образом файлы относящиеся к браузеру будут лежать в "~/.local/share/firefox". Заодно очистите корень от мусора. Думаю подобный способ сработает и с другими браузерами.

Затем ставим profile-sync-daemon, для Arch Linux - вот так:
yaourt -S profile-sync-daemon
Для остальных - смотрите по ссылке выше, автор расписал способы для большинства популярных дистрибутивов.

К сожалению "из коробки" директорию "~/.local/share/firefox" утилита "подхватить" не сможет, поэтому создаём файл "/usr/share/psd/browsers/firefox-my":
DIRArr[0]="$homedir/.local/share/firefox"
PSNAME="firefox"
А потом прописываем новый профиль в конфиг "~/.config/psd/psd.conf", например вот так:
USE_OVERLAYFS="yes"
BROWSERS="firefox-my"
USE_BACKUPS="yes"
Настройку "USE_BACKUPS" рекомендую включать, что бы в случае проблем у вас была недавняя рабочая копия.

Настройка "USE_OVERLAYFS" более интересна. Она позволяет включить хранение данных на OverlayFS, т.е. в памяти будет храниться только то, что браузер записал за текущий сеанс работы. Это экономит память, и увеличивает скорость синхронизации. Что бы использовать эту возможность, требуется поддержка в ядре - OverlayFS версии 22 или новее, а так же нужно дать "/usr/bin/psd-overlay-helper" право на sudo, добавив в "/etc/sudoers" строчку:
...
user_name    ALL = NOPASSWD: /usr/bin/psd-overlay-helper
Проверяем конфигурацию:
psd preview
Если всё хорошо, на всякий случай создаём бекап профиля Firefox и включаем сервис:
systemctl --user enable psd
После перезагрузки браузер будет жить на ram диске.

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

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