Оптимизация использования SD-карты в Raspberry PI

Использование SD-карт в Raspberry PI - достаточно противоречивое решение. С одной стороны, это невероятно удобно: можно легко заменить одну карту на другую, чтобы обновить операционную систему или использовать разные карты для различных приложений. С другой стороны, современные SD-карты имеют ограниченное количество циклов чтения и записи, что уменьшает их срок службы.

В интернете предложено множество способов решения этой проблемы:

  • Использование read-only overlay для файловой системы. Идея заключается в том, что SD-карты гораздо лучше переносят операции чтения, чем записи. Сокращение операций записи может значительно продлить срок службы карты. Однако на практике большинство системных приложений периодически записывают данные на диск, поэтому настройка режима read-only оказывается трудоёмкой и не всегда надёжной.
  • Загрузка с внешних носителей или по сети. Альтернативой SD-карте может быть загрузка с SSD/NVMe, USB-накопителя или даже по сети. Эти методы снижают нагрузку на SD-карту или полностью исключают её использование.

Однако самый простой способ продлить срок службы SD-карты — минимизировать операции записи или их количество. Чтобы определить, какие процессы активно записывают данные на карту, можно использовать утилиту iotop. Установить её можно с помощью команды:

sudo apt install iotop

И запустить:

sudo iotop -a

Эта команда отображает объём данных, записанных и прочитанных каждым процессом или потоком.

На скриншоте выше видно, что процесс r2cloud (java) периодически записывает данные на диск, а поток ядра jbd2, отвечающий за журнал файловой системы ext4, регулярно обновляет этот журнал. Это привлекло моё внимание, поскольку моё приложение в этот момент не должно было выполнять никаких операций. Построив график активности, я заметил, что какая-то периодическая задача постоянно записывает данные на диск:

iotop не показывает, в какие именно файлы производится запись, поэтому я решил разобраться, за что отвечает поток VM Periodic Task. Оказалось, что это нативный поток JVM, который занимается профилированием работы процесса. Этот профилировщик включён по умолчанию. Для отключения профилировщика можно использовать опцию:

-XX:-UsePerfData

В результате любая запись на диск моментально пропадёт:

Ещё один эффективный способ уменьшить нагрузку на SD-карту — выделить директорию /tmp в отдельную файловую систему tmpfs. Эта файловая система хранит данные в оперативной памяти, что исключает запись на SD-карту.