저는 Linux 2.6을 실행하는 ARM 머신을 사용하고 있습니다(불행히도 저는 이 커널 버전을 사용해 왔습니다). 이 상자는 SD 카드에서 부팅되며 저장을 위해 보조 SD 카드를 사용합니다. 상자에는 약 256MB의 메모리가 있습니다.
두 SD 카드 모두 dm-crypt로 암호화되어 있는데, 디스크 암호화를 구현하기 전까지는 성능이 매우 나빴기 때문에 이것이 읽기/쓰기 성능에 큰 영향을 미치지는 않을 것 같습니다. 이를 백업할 정확한 숫자는 없지만, 예를 들어 dm-crypt를 사용하지 않고 SD 카드에 1GB를 쓰는 데 1시간 이상이 걸립니다.
일반적인 사용에서는 읽기 및 쓰기 속도가 충분합니다. 그러나 소스 코드에서 소프트웨어를 구축하는 것과 같은 특정 작업은 한 번에 몇 분 동안 I/O 작업을 잠그는 경향이 있습니다. 특히 쓰기 작업은 장기 차단 작업이라고 생각합니다. 나는 마침내 유용한 정보를 제공하는 도구 iostat를 발견했습니다.
프로그램(예: 구성 스크립트)이 차단되었을 때 실행할 수 있습니다 watch iostat
. Blk_wrtn 필드를 관찰하면 잠금을 유발하는 병목 현상이 쓰기 작업인 것으로 확인됩니다. 구체적으로, 차단 쓰기 작업 중에 dm-1 장치(두 번째 SD 카드의 잠금 해제된 파티션)는 N 블록을 쓰고 mmcblk1(두 번째 SD 카드)은 M 블록을 씁니다. 여기서 M < N입니다. M은 다음과 같이 증가합니다. 최종적으로 N과 같아질 때까지 시간이 흐르고, 이 시점에서 쓰기 작업이 완료되고 프로그램이 계속됩니다. 이 글을 쓰는 시점에서 mmcblk1 및 dm-1의 Blks_wrtn/s는 약 10입니다.
나는 이 관찰을 통해 블록이 dm-1 의사 장치에 즉시 기록된 다음 물리적 디스크에 플러시된다는 결론을 내렸습니다. 이 플러시 작업은 예상보다 오래 걸립니다.
다음은 SD 카드 쓰기 성능을 향상시키기 위해 시도/고려한 옵션입니다.
- 더 나은 드라이버/성능을 갖춘 최신 커널로 업그레이드: 최신 커널을 갖고 싶지만 우리는 제조업체가 제공하는 것을 고수하고 있습니다. 나는 아직도 최신 커널을 사용할 수 있는지 알아내려고 노력 중입니다.
- SD 카드에 대해 다른 IO 스케줄러 사용: 눈에 띄는 성능 차이 없이 데드라인, CFQ 및 noop 간 전환을 시도했습니다.
- 더 높은 등급의 SD 카드를 사용하세요. 실제로 제조사에서 제공하는 SD 카드의 등급이 무엇인지는 잘 모르겠지만, 동일한 성능을 지닌 4등급 SD 카드를 대신 사용해 보았습니다. SD 카드 자체가 병목 현상이라고 생각하지 않습니다. 리더 자체가 병목 현상일 수도 있지만 이를 확인하는 방법을 모르겠습니다.
- SD 카드에서 다른 파일 시스템 사용: 현재 Ext4를 사용하고 있습니다. 파일 시스템이 다르면 큰 차이가 있습니까?
SD 카드 쓰기 속도를 높이는 방법이 있나요?
답변1
사용 가능한 RAM이 충분하면 RAM에서 /tmp를 실행할 수 있습니다.
컴파일 타임이나 /tmp에서 임시 소켓을 사용하는 데몬을 사용할 때 성능이 향상됩니다.
또 다른 전략은 syslog에 전혀 로그를 기록하지 않도록 지시하거나(가장 좋은 아이디어는 아님) 로그를 원격 서버로 보내도록 지시하는 것입니다. 가능한 디스크 기반 데이터베이스의 경우에도 마찬가지입니다.
또한 syslog 데몬 및 구성에 따라 로그 파일에 주의하세요. 여러 syslog 파일에 한 줄을 쓰면 해당 파일의 fsync가 트리거/강제될 수 있습니다.
불필요한 데몬이 있는지, RAM이 부족한지 확인하세요. 예를 들어 필요하지 않을 때 웹 서버를 중지하면 도움이 될 수 있습니다.
카드의 경우 클래스 10 카드를 사용할 수 있을 정도로 가격이 떨어졌습니다.