Pull to refresh

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

Reading time 4 min
Views 34K
Введение

Итак, в интернете можно найти статьи о том что в 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

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

#  /etc/rsyslog.conf	Configuration file for rsyslog.
#
#			For more information see
#			/usr/share/doc/rsyslog-doc/html/rsyslog_conf.html


#################
#### MODULES ####
#################

#$ModLoad imuxsock # provides support for local system logging
#$ModLoad imklog   # provides kernel logging support
#$ModLoad immark  # provides --MARK-- message capability

# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514


###########################
#### GLOBAL DIRECTIVES ####
###########################

#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

#
# Set the default permissions for all log files.
#
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022

#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf


###############
#### RULES ####
###############

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*			/var/log/auth.log
*.*;auth,authpriv.none		-/var/log/syslog
#cron.*				/var/log/cron.log
daemon.*			-/var/log/daemon.log
kern.*				-/var/log/kern.log
lpr.*				-/var/log/lpr.log
mail.*				-/var/log/mail.log
user.*				-/var/log/user.log

#
# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info			-/var/log/mail.info
mail.warn			-/var/log/mail.warn
mail.err			/var/log/mail.err

#
# Logging for INN news system.
#
news.crit			/var/log/news/news.crit
news.err			/var/log/news/news.err
news.notice			-/var/log/news/news.notice

#
# Some "catch-all" log files.
#
*.=debug;\
	auth,authpriv.none;\
	news.none;mail.none	-/var/log/debug
*.=info;*.=notice;*.=warn;\
	auth,authpriv.none;\
	cron,daemon.none;\
	mail,news.none		-/var/log/messages

#
# Emergencies are sent to everybody logged in.
#
*.emerg				:omusrmsg:*

#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
#daemon,mail.*;\
#	news.=crit;news.=err;news.=notice;\
#	*.=debug;*.=info;\
#	*.=notice;*.=warn	/dev/tty8

# The named pipe /dev/xconsole is for the `xconsole' utility.  To use it,
# you must invoke `xconsole' with the `-file' option:
# 
#    $ xconsole -file /dev/xconsole [...]
#
# NOTE: adjust the list below, or you'll go crazy if you have a reasonably
#      busy site..
#
daemon.*;mail.*;\
	news.err;\
	*.=debug;*.=info;\
	*.=notice;*.=warn	|/dev/xconsole



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

sudo iotop -o -a

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

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

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

  • другой компьютер с линуксом
  • другой накопитель в качестве основного (например обычную флешку)
  • другой компьютер + LifeCD с линуксом

В случае когда у вас 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) можно сказать что нагрузка на накопитель уменьшилась практически до нуля.
Tags:
Hubs:
+28
Comments 16
Comments Comments 16

Articles