과거에 우리 회사는 IoT 애플리케이션에 Raspberry Pi를 사용했습니다. 문제는 SD 카드가 마모되어 손상될 수 있다는 것입니다.
이제 Debian을 실행하는 eMMC 스토리지가 포함된 Compulab SBC를 주문했습니다.
그렇다면 내구성이 뛰어난 임베디드 IoT 장치를 구성하기 위한 모범 사례는 무엇입니까?
내가 말할 것:
- eMMC 스토리지가 있는 SBC를 선택하세요
- 저널링 파일 시스템이 있는지 확인하십시오(
has_journal
EXT4에서 활성화됨). - 스토리지 마모를 방지하기 위해 RAM에 로그 쓰기(에서
/etc/systemd/journald.conf
Storage=volatile
) fsck
시작 시 실행되는지 확인하세요 (마지막/etc/fstab
필드는 1 또는 2로 설정됨).- 스와핑을 비활성화해야 합니다(실행-
free
>총 스왑이 0이어야 함).
더 이상 제안이 있으십니까?
파일 시스템 덮어쓰기
Raspbian에는 "raspi-config"->"성능 옵션"->"파일 시스템 재정의"에 옵션이 있습니다. Compulab에게 이 옵션도 사용하도록 권장하는지 물었지만 그들은 이미 파일 시스템 로그만큼 강력하다고 생각하며 fsck는 실행됩니다. 시작에. 오버레이 파일 시스템을 사용하여 장치를 여러 번 재부팅하여 장치를 비활성화하고 나중에 업데이트하려고 할 때 다시 활성화하는 추가 복잡성을 감수할 가치가 있는 저장소에 대한 쓰기를 방지하고 있습니까?
답변1
나는 저장 장치 내구성에 대해 어느 정도 익숙하기 때문에 귀하의 첫 번째 질문에 답하려고 노력할 것입니다.
시스템의 스토리지 사용량에 액세스하지 않고 이를 개선하기 위한 조치를 취하지 않으면 SD와 eMMC 모두 NAND를 사용하므로 SD에서 eMMC로 전환해도 상황이 개선되지 않을 수 있습니다.
스토리지에 기록되는 데이터의 양을 추정했나요? 다음을 사용하여 사용 사례를 평가하세요. [자세한 내용은 [1] 참조]
total bytes written throughout device life = (device capacity in bytes) * (max program/erase cycles) / (write amplification factor)
예를 들어
- 하루에 0.5GiB를 씁니다.
- 귀하의 장비는 5년 동안 작동할 것으로 예상됩니다.
- 데이터를 쓰고 있는 파티션은 총 4GiB입니다. (저장 용량은 이보다 크지만 다른 파티션은 읽기 전용입니다.)
- MLC(다중 레벨 셀) NAND의 경우 최대 프로그램/삭제 주기는 3000입니다.
이는 쓰기 증폭 요소를 제공합니다.
4 * 3000 / (0.5 * 365 * 5) = ~13
쓰기 증폭이란 무엇입니까?
SD 또는 eMMC의 NAND는 NAND 페이지에 기록됩니다. 호스트에서 1KiB(2개의 512바이트 섹터)를 쓰거나 수정하지만 NAND 페이지는 16KiB라고 가정합니다. 따라서 eMMC 컨트롤러는 전체 NAND 페이지를 씁니다. 지우기를 생각하면 상황이 더 복잡해집니다. NAND는 NAND 블록에서 지워지고, NAND 블록은 많은 NAND 페이지로 구성되기 때문입니다.
그렇다면 장비의 수명을 연장하려면 어떻게 해야 할까요?
위의 방정식으로부터 다음을 얻을 수 있습니다.
- 장비 용량 늘리기(단, 비용이 증가함)
- 프로그램/삭제 주기 개선: SLC를 선택하거나 데이터 쓰기 파티션을 MLC에서 pSLC로 변환합니다(그러나 이렇게 하면 용량이 줄어듭니다).
- NAND 페이지 정렬을 수행하고, 호스트에서 NAND 페이지 크기(또는 다중) 쓰기를 수행하고(eMMC EXT_CSD[265] 최적 쓰기 크기 참조), eMMC 캐싱 활성화 등을 수행하도록 애플리케이션을 개선하여 쓰기 증폭을 줄입니다.
너는 어떤 다른 일을 할 수 있니
mmc-utils(https://git.kernel.org/pub/scm/utils/mmc/mmc-utils.git) 또는 sysfs를 실행하고 예기치 않은 오류가 발생하기 전에 필요한 조치를 취하세요.
- eMMC 확장 CSD 레지스터는 다음을 제공합니다.
- SLC 및 MLC 모듈의 서비스 수명을 10% 단위로 예측합니다.
(0x01 = 0-10% 장치 수명이 종료됨, 0x02 = 10-20%, .., 0x0B = 수명이 종료됨)
타입 B(MLC): EXT_CSD[268], 타입 A(SLC): EXT_CSD[269]
- 불량 블록 교체에 사용된 예비 블록 상태
(0x01: 정상, 0x02: 경고: 블록 사용률 80%, 0x03: 긴급: 블록 사용률 90%)
EOL 이전 정보: EXT_CSD[267]
- 공급업체는 EXT_CSD[301:270]에 독점 상태 보고서를 제공할 수 있습니다(그러나 지금까지 여기서는 모두 0만 보았습니다).
예를 들어
mmc-utils:
# mmc extcsd read /dev/mmcblk0
:
eMMC Life Time Estimation A [EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A]: 0x01
eMMC Life Time Estimation B [EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B]: 0x00
eMMC Pre EOL information [EXT_CSD_PRE_EOL_INFO]: 0x01
:
sysfs:
# cat /sys/block/mmcblk0/device/life_time
0x00 0x01
# cat /sys/block/mmcblk0/device/pre_eol_info
0x01
- 공급업체는 mmc 일반 명령 CMD56(mmc-utils 사용,mmc gen_cmd 읽기 <장치> [arg])
좋은 설명은 아래를 참조하세요.
[1]https://www.kingston.com/en/embedded/emmc-embedded-flash "eMMC 수명주기 추정, 검증 및 모니터링"