dd CF에 쓰기가 지연되었습니다.

dd CF에 쓰기가 지연되었습니다.

나는 CardBus 어댑터가 있는 랩톱(커널 2.6.38)에서 사용하는 오래된 64MB CF 카드를 가지고 있습니다. 이 CF 카드에 64MB 이미지를 쓰면 쓰기 속도가 200MB/s를 넘습니다.

T42 ~ # fdisk -lu

Disk /dev/sda: 40.0 GB, 40007761920 bytes
255 heads, 63 sectors/track, 4864 cylinders, total 78140160 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00043afc

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    73947135    36972544   83  Linux
/dev/sda2        73949182    78139391     2095105    5  Extended
/dev/sda5        73949184    78139391     2095104   82  Linux swap / Solaris

Disk /dev/sdb: 64 MB, 64225280 bytes
8 heads, 32 sectors/track, 490 cylinders, total 125440 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *          32      125300       62634+   4  FAT16 <32M
Partition 1 has different physical/logical endings:
     phys=(488, 7, 32) logical=(489, 3, 21)
T42 ~ # mount | grep -i sdb
T42 ~ # time dd if=64MB of=/dev/sdb bs=10M
6+1 records in
6+1 records out
64225280 bytes (64 MB) copied, 0.320419 s, 200 MB/s

real    0m0.624s
user    0m0.000s
sys 0m0.304s
T42 ~ #

64MB를 0.32초 안에 전송한다는 것은 10년 된 CF 카드로서는 당연히 비현실적이며, 완료 후 바로 노트북에서 카드를 제거하면 출력에 dd if=64MB of=/dev/sdb bs=10M많은 오류가 보일 것입니다 <timestamp> end_request: I/O error, dev sdb, sector <sector number>. dmesg이 동작의 원인은 무엇입니까?

답변1

블록 장치 쓰기는 커널에 의해 버퍼링됩니다. 이는 파일 시스템이 마운트될 때 명확하게 표시됩니다(마운트 해제할 때 버퍼를 플러시해야 하므로 때로는 반환되기까지 오랜 지연이 발생함 umount). 더 많은 RAM을 사용할 수 있게 되면 이러한 지연은 더욱 악화되는 것 같습니다. 커널이 데이터 전송을 시작하기 직전에 0.5GB를 쓸 수도 있습니다. 전송이 완료된 후 몇 분 동안 커널이 장치에 투명하게 쓸 수 있습니다.

이 기능은 여러 가지 이유로 유용합니다. 이를 통해 장치의 읽기 및 쓰기에 대한 응답 속도가 빨라지고 데이터도 투명하게 전송할 수 있습니다.읽다쓰기 후 실제 물리적 쓰기가 완료되기 전에 버퍼에서 읽습니다. 장기간 장착된 하드 드라이브의 경우 커널은 시간이 있을 때 쓰기가 발생하도록 예약하는 동시에 사용자 관점에서 장치의 응답성을 향상시킵니다. 특히 자기 하드 드라이브의 경우 큰 블록을 순차적으로 쓰는 것이 드라이브 전체의 여러 위치에 작은 블록을 쓰는 것보다 빠릅니다. 블록은 물리적 장치에 푸시되기 전에 정렬 및 그룹화될 수 있습니다(하드 드라이브는 일부 버퍼링 및 데이터 정렬도 수행하지만). 하드웨어 내에서). 즉, 장치가 얼마나 느린지 알 수 없으며 네트워크에 탑재된 드라이브나 하드 드라이브가 최대 절전 모드에서 부팅되어야 하는 경우 초기 지연도 알 수 없습니다.

블록 장치에 직접 접근할 경우 호출을 하지 않고 umount전송이 완료되는 시점을 실제로 인지하지 못하기 때문에 버퍼링이 다소 아쉽습니다.sync어쨌든 전화해야 해.

답변2

운영 체제가 데이터 dd(및 기타 명령) 를 캐싱하고 있으므로 syncCF를 제거하기 전에 다음을 수행해야 합니다.동기화가 완료될 때까지 기다리세요.

캐싱/버퍼링은 성능상의 이유로 중요하며, 예를 들어 HD의 단일 트랙에 대한 모든 쓰기가 한 번에 올바른 순서로 완료되도록 커널/드라이버가 기본 하드웨어에 대한 쓰기를 재정렬할 수 있도록 합니다(헤드 이동 횟수 감소).

관련 정보