27

ALT Linux p9 и диски SSD

Случилось прекрасное. Вы обладатель SSD накопителя, на который установили систему ALT k/Workstation или Simply, тем самым подняв ее быстродействие до запредельных высот. Все хорошо, вот только настоящее устройство обладает ограниченным количеством раз записи информации. А Linux, как и многие другие ОС, весьма часто обращается к накопителям читая и сохраняя временные файлы, журналы работы и различные кэши. В принципе, ничего особо страшного – внутренние механизмы последних ядер скидывают данные на носители реже, предпочитая держать их в памяти, для ускорения доступа. Тем не менее, обмен информацией все же идет.

Будет рассмотрен комплексный подход для ALT Linux 9, позволяющий снизить нагрузку на SSD диск. И начнем мы со свопа. Последний нужен только в тех случаях, когда информация не помещается в памяти. Используется он и для обеспечения быстродействия работы, то есть отключать его совсем нельзя. Но можно перенести своп в память, держа его там упакованным, при помощи программы zram. В ALT установку ее можно произвести через Synaptic или воспользовавшись командной строкой. Понадобится два пакета: alterator-zram-swap и zram-swap. Итак, для консоли:


su -
<вводите пароль root>
apt-get install zram-swap alterator-zram-swap

После, заходим в «Центр управления системой» из главного меню рабочего стола. Ищем «Настройка zram-swap». Кликаем по пункту и в открывшемся окне устанавливаем флажок на «включить модуль zram-swap». Следом «применить» и можно закрывать окно.

Теперь правим подключение физических накопителей. Нужно вначале выяснить, на каком из них находиться SSD. Смотрим командой lsblk. Выдается список всех разделов и их UUID. Вот последние нам и нужны. У меня на представленной картинке «/» и «home» висят на SSD.

Открываем файл /etc/fstab в текстовом редакторе конкретной системы. В Workstation это xed, в той что с индексом k вначале — kwrite, для Simply — mousepad.

Находим все упоминания swap в файле и удаляем содержащие их строки целиком.

Находим записи, относящиеся к SSD, и в конце каждой из них, но перед последними двумя цифрами добавляем опции «,data=writeback,delalloc,nobarrier». Пример:

Идем дальше. Папку /tmp запихиваем в память, и вносим аналогичную запись для /home/tmp. Последнего каталога не существует, но он нужен (честно скажу — хз зачем, но файлы в нем появляются) и мы создадим его вручную позже. Итак, что добавить в конец /etc/fstab:

tmpfs /tmp/ tmpfs nosuid,nodev 0 0
tmpfs /home/tmp tmpfs nosuid,nodev,size=128M 0 0

Обратите внимание, что размер /tmp мной не задан. Система сама разберется сколько нужно. Но ручное ограничение может сыграть плохую шутку в случаях сборок из исходных кодов крупных проектов.


Можно перекинуть аналогично в память /var/log, но некоторым пользователям бывают нужны журналы выполняемых программ. Если все же возникла такая идея, то добавляем в fstab:


tmpfs /var/log tmpfs nosuid,nodev,noexec,size=64M 0 0

Сохраняем, введя пароль администратора и закрываем kwrite.


Подождите перегружаться, еще не все.


Если приведенная настройка выполнялась для раздела «/», – требуется об этом напрямую проинформировать ядро. Открываем через kwrite (или иной текстовой редактор) файл /etc/sysconfig/grub2


Находим строчку, начинающуюся с GRUB_CMDLINE_LINUX_DEFAULT. Перед splash размещенном в одинарных кавычках, указываем « rootflags=data=writeback » (с пробелами до и после). Сохраняем.

Теперь путь наш лежит в консоль. В ней:


su -
<вводим пароль рута>
update-grub

Здесь же создаем точку монтирования tmp в home:


mkdir -pv /home/tmp

Если выкинули в память /var/log, то требуется после перезагрузки восстанавливать его каталоги. Нужно для некоторых программ (Не помню, какая ругалась, но было. Вроде rpc bind). Создаем файл /etc/rc.d/rc.local следующего содержания:


#!/bin/sh
mkdir -p /var/log/ahttpd \
/var/log/audit \
/var/log/chrony \
/var/log/cups \
/var/log/journal \
/var/log/mysql \
/var/log/ppp \
/var/log/private \
/var/log/samba/old \
/var/log/wpslog

Сохраняем, делаем исполняемым из консоли:


su -
<вводим пароль рута>
chmod +x /etc/rc.d/rc.local

Примечание: человек, администрирующий ваш компьютер (если это не вы) может сильно огорчиться узнав, что логи вы держите в памяти и обновляете их с нуля при каждом запуске машины. Ведь они показывают и неисправности. Я крайне не рекомендую помещать в tmpfs /var/log. Но каждый сам кузнец своего счастья.

Ок, первая часть мерлезонского балета окончена. Приступаем ко второй, и сразу поговорим о кэшах браузеров. Запись их на диск выполняется постоянно, что весьма бесит и вредит накопителю SSD. Нужны эти файлы зачастую только в течение текущей сессии работы. Перекидывание кэшей в память решит проблему. К сожалению, прямая установка доступна только Firefox. В отношении остальных придется заняться правкой системного .desktop файла.


Firefox:

Открываем браузер, в строке адреса набираем about:config. Соглашаемся с тем, что мы можем повредить программе.

Находим и меняем параметры:


browser.cache.disk.enable и ставим его в false
browser.cache.memory.enable в True (если не установлен)
browser.cache.offline.enable в false
browser.cache.memory.capacity устанавливаем в -1

Chrome, Edge, Chromium, Yandex browser.

Первое, что нужно сделать найти содержащий их запускающий файл .desktop. Выполняем в консоли:


cd /usr/share/applications
grep -l 'yandex-browser' *.desktop
grep -l 'chrome' *.desktop
grep -l 'chromium' *.desktop
grep -l 'edge' *.desktop

Результат - список .desktop содержащих командные строки запуска браузеров.


Во всех найденных файлах, в конце строчки Exec= добавляем « -disk-cache-dir=/tmp». Сделать это можно при помощи того же kwrite. Внимание! В файле .desktop может быть несколько таких строк. Везде требуется вписать добавочные параметры.

Побочным действием будет некоторое ускорение работы интернет-браузера.


Вот и все!


UPD: Чуть не забыл. В crontab от рута нужно добавить /sbin/fstrim -A на то время, когда машина точно включена. К примеру, у меня строка имеет вид:


0 5 * * * /sbin/fstrim -A

Компьютер работает круглосуточно и в пять утра проходит операция пометки удаленных файлов для отмены их последующего физического сохранения. Процедура ускоряет работу SSD.


UPD2: В связи с частым вопросом зачем нужно размещать своп в память и использовать zram, объясняю в комментарии https://pikabu.ru/story/alt_linux_p9_i_diski_ssd_7914443?cid=188141077


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

GNU/Linux

1.2K поста15.6K подписчика

Правила сообщества

Все дистрибутивы хороши.

Будьте людьми.

Вы смотрите срез комментариев. Показать все
5
Автор поста оценил этот комментарий

Желание разобраться в системе и оптимизировать её работу, это хорошо, но на лицо - полное непонимание принципов свопирования. А главное - это подаётся как некое руководство к действию, которое начинающие пользователи/администраторы могут по незнанию применить.

раскрыть ветку (10)
Автор поста оценил этот комментарий

Вы создатель ядра? Сколько патчей внесли? Досконально разобрались в вопросах свопа/zram/zswap? Написано дополнительным сообщением, на которое пометка в основном тексте есть, зачем все это нужно. Прочитав переписку с остальными рецензорами, можно найти приведенные слова иных специалистов с kernel.org. Ах, да. Мы же все глупее вас, забыл, сорри.

раскрыть ветку (9)
1
Автор поста оценил этот комментарий

Да, досконально. Поэтому ещё раз повторяю: вы неправильно трактуете работу swap'а и даёте вредные советы.

раскрыть ветку (8)
Автор поста оценил этот комментарий

проясни, в чем мои советы вредны. по полкам.

раскрыть ветку (7)
2
Автор поста оценил этот комментарий

Извольте.

Ядро использует понятие "виртуальная память", которая состоит из физической памяти и области подкачки. При нехватке физической памяти ядро в определенный момент начинает размещать неиспользуемые страницы оперативной памяти в область подкачки, чтобы сохранить возможность выделения памяти тем процессам, которые в ней нуждаются.

Предлагая "перенести своп в память" вы не просто не увеличиваете объём виртуальной памяти, а наоборот приближаете момент начала свопирования. Причём, ядро будет делать абсолютно бесполезную работу, перемещая страницы из одной области оперативной памяти в другую.

PS: Ну и про параметр "data=writeback". Его использование приведет к тому, что в случае нештатной перезагрузки системы, открытые в этот момент на запись файлы могут оказаться повреждены.

раскрыть ветку (6)
Автор поста оценил этот комментарий

неиспользуемые страницы оперативной памяти в область подкачки

редко используемые

наоборот приближаете момент начала свопирования

выделено всегда не более 50% от свободной оперативки. Всегда! Приблизить момент я никогда не могу. Механизм свопа начинает работу в пределах параметра swappiness. В стандартном режиме от оперативки ничего не откусывается, так как своп равен нулю. При достижении предела swappines запускается механизм. Своп перекидывается в память со сжатием данных. Тем не менее, скорость работы подобного фокуса быстрее, чем у интерфейсов системы (SATA). Вообще, механизм рекомендуется дополнять своп-файлом на диске с соответствующим приоритетом, мол когда кончиться память и  место в zram - сброс осуществлять туда. Мне не потребовалось ни разу при весьма не большой памяти.

Ну и про параметр "data=writeback"

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

раскрыть ветку (5)
2
Автор поста оценил этот комментарий

выделено всегда не более 50% от свободной оперативки. Всегда!
Откуда у вас эта информация, расскажите? Про swappiness ниже написала вам. Похоже, вы путаете две технологии: zram и zswap. Они обе направлены на сжатие данных, но используются для разных целей.

раскрыть ветку (4)
Автор поста оценил этот комментарий

Более точно сказать - 50%  от остатка свободной оперативки. Откуда инфо? Смотрите исходники ядра. zram уже давно входит в его состав. Про zswap - в курсе

раскрыть ветку (3)
2
Автор поста оценил этот комментарий

Мы явно о разных "исходниках ядра" говорим )))

Если вы такой любитель исходников, то вот вам для экспериментов (сумеете откомпилировать?)


#include <stdlib.h>


int main()

{

int *eater;

while(1) {

    int filler=1024*1024*sizeof(char);

    eater=(int*) calloc(1,filler);

    }

}


расскажите потом про 50% ))
раскрыть ветку (2)
Автор поста оценил этот комментарий

Не понял. В смысле сумеете?

cat <<EOF>test.c
#include <stdlib.h>
int main()
{
int *eater;
while(1) {
int filler=1024*1024*sizeof(char);
eater=(int*) calloc(1,filler);
}
}
EOF
gcc -o test test.c
strip -s test
ls test
-rwxr-xr-x 1 youra youra 17K дек 25 12:34 test

Программа переполняет память пока ее не убьет oomkiller(если настроен, конечно или этот, новый убийца процессов, забыл название, искать лень). Чем бы тут помог своп на жестком диске не понятно. Ну отработала бы она чуть дольше.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Кстати. Про сброс в своп с ваших слов "неиспользуемых данных". Запустите вначале системный монитор. С интересом обнаружите в процессе работы этой чудной программки, что использование свопа растет аналогично памяти, достигая в конце ее работы максимального объема и полного заполнения оперативки ))

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку