Уменьшение операций чтения/записи на Raspberry Pi


Предыдущая | Следующая

Итак, в интернете можно найти статьи о том что в Raspberry флешки «живут» 2-3 месяца, после чего приходят в негодность. Предложенные решения — заменить стандартную microSD карточку на USB HDD. Решение простое, надёжное, плюс повышается скорость чтения/записи. Но почему флешки так быстро «умирают»? Могут ли те же факторы навредить жёсткому диску? И так приступим!
 

Матчасть
У флеш-накопителей есть ограниченное количество циклов записи. Значит если linux будет постоянно что то на неё писать — она может выйти из строя раньше времени. Жёсткие диски работают по другому принципу. Но для них мелкие операции чтения/записи тоже не особо полезны. Головка жёсткого диска может парковаться если он не используется определённый промежуток времени, это может делать система, а так же может быть заложенно в железе. В случае мелких операций чтения/записи, жёсткий диск постоянно не может запарковать головку (не критично) или паркует головку, и тут же начаинает что то читать/писать (вот это уже хуже).

Информация пишется страницами. Обычный размер страниы 4 кБ. Так что если мы хотим записать один байт, то или он поместится в буфер, или будет записанно 4 кБ. Если буфер заполнен, то страница записывается и дальнейшая запись идёт в следующую страницу, которая находится в ОЗУ.

Запись маленьких порций информации используется при журналировании файловой системы (даёт возможность не потерять информацию при сбое, например выключении питания), а так же функции логирования (сохрняют информацию о тех или иных системных событиях, или событиях программ). В raspberry логирование выполняет rsyslog[1]

В Raspbian есть два демона, которые можно отключить для уменьшения нагрузки на корневой носитель информации. Отключив их можно выиграть в операциях записи, но проиграть в надёжности и возможности востановления. Это демон журналирования файловой системы и rsyslog. Так что если есть ценные данные которые будут храниться в корневом диске, то службу журналирования лучше не отключать. Если же raspberry используется как игрушка или есть возможность быстро заменить основной диск, то журналирование файловой системы можно отключить. Насчёт логирования аналогично, если вы не знаете зачем оно нужно, то достаточно сказать что если что то не работает, то неисправность нужно искать изначально в логах. Если захотите задать вопрос кому то на форуме, то скорее всего попросят скинуть логи. Так что если всё работает или вам проще переустановить систему чем разбираться что «посыпалось» — можете смело отключать логи.


Для просмотра обращений к накопителям можно использовать утилиту iotop. Для этого нужно запустить её с параметрами:
 

sudo iotop -o -a

 

Установка iotop
sudo apt-get install iotop


Отключение логирования

Для отключения логирования открываем:
 

sudo nano /etc/rsyslog.conf


и комментируем в нём две сткроки в секции MODULES:
 

$ModLoad imuxsock # provides support for local system logging
$ModLoad imklog   # provides kernel logging support

 

Должно получиться так:

 


После перезагрузки система прекратит логирование. Проверяем:
 

sudo iotop -o -a


В выводе больше нет rsyslog.

Отключение журналирования

Тут есть небольшая сложность — раздел должен быть отмонтирован. Для этого можно использовать:
 


В случае когда у вас microSD карта — раздел на котором стоит система будет определятся как mmcblk0p2.

Тут mmcblk0 — это сама карточка, а p2 — второй раздел на ней (первый по умолчанию boot). Eсли же вы используете USB накопитель, то раздел определиться как sda2. Если вы загружаетесь с другого компьютера то скорее всего он определиться как sdb2.

Далее выполняем:
 

sudo umount /dev/sdb2
sudo tune2fs -O ^has_journal /dev/sdb2
sudo e2fsck -f /dev/sdb2


После этого проверяем:
 

dmesg | grep EXT4


Выдаёт:
 

[ 5890.967580] EXT4-fs (sdb2): mounted filesystem without journal. Opts: (null)


Загружаемся с нашего накопителя, вводим:
 

sudo iotop -o -a


И видим что к жёсткому диску только изредка обращается LXDE. В виду того что эти обращения не систематичны (понаблюдаем минут 5-10) можно сказать что нагрузка на накопитель уменьшилась практически до нуля.

 

Всё вышеперечисленное не очень спасает SD. Велосипед уже изобретён и протюнен как только можно ранее в https://geektimes.ru/post/283802/
+2
В данном случае целью было немного снизить нагрузку. В статье всё же предлагают сделать read only систему. Это даст большой плюс к продолжительности жизни, но всё же наложит органичение на запись в ФС. В случае домашнего сервера, который будет складировать показания датчиков, read only — не самое простое решение.
0

Может вместо отключения журнала в ext4 стоит использовать f2fs? Она как раз для этого и задумана.

0
 
прочитайте статью по ссылке https://xakep.ru/2016/10/10/f2fs-mythology/
смысла почти нет…
0
А на btrfs или на jffs2 кто-нибудь пробовал держать корень?
0
А что скажете про использование ext2 она нежурналируемая
0
В данном случае был использован этот образ. Он был распакован под Windows и файловая система уже была.
0
Какую такую надежность дает журналирование, если флешка внезапно помирает через 3 месяца?
0
Надёжность не в том плане, что запас прочности устройство-носителя контролируется (это делает физический контроллер флешек), а в том, что данные не потеряются и не закорраптятся в случае внезапной потери питания или при каких-то непридвиденных обстоятельствах (при kernel panic, например).
+1
Лучше /var/log переместить в tmpfs, и в journald указать storage=volatile.
0
Тоже сталкивался с тем, что на RPi регулярно помирала ФС на карточке.
Долго мучился с этим, а потом ради интереса восстановил параметры по умолчанию в разделе про оверклокинг и ФС перестала помирать.
0
ещё есть опция noatime при монтировании — прекратится запись информации о времени последнего чтения файла