단일 드라이브 읽기 오류로 인한 소프트웨어 RAID-1 커널 오류

단일 드라이브 읽기 오류로 인한 소프트웨어 RAID-1 커널 오류

저는 소프트웨어 RAID-1(mdadm) 설정을 사용하여 두 개의 동일한 Seagate 1GB 드라이브에서 Fedora 19(커널 3.11.3-201.fc19.x86_64)를 실행하고 있습니다.

# cat /proc/mdstat 
Personalities : [raid1] 
md1 : active raid1 sdb3[1] sda3[0]
      973827010 blocks super 1.2 [2/2] [UU]

unused devices: <none>

최근 두 드라이브 중 하나에 몇 가지 오류가 발생했습니다. smartd가 "현재 읽을 수 없는(보류 중인) 섹터 1개"와 "수정할 수 없는 오프라인 섹터 1개"를 감지했습니다. RAID 어레이가 일부 섹터를 "재배열"했습니다. 약 하루 후, 커널은 다양한 I/O 메시지/예외를 생성했습니다.

Oct 18 06:39:20 x smartd[461]: Device: /dev/sdb [SAT], 1 Currently unreadable (pending) sectors
Oct 18 06:39:20 x smartd[461]: Device: /dev/sdb [SAT], 1 Offline uncorrectable sectors
...
Oct 18 07:09:20 x smartd[461]: Device: /dev/sdb [SAT], 1 Currently unreadable (pending) sectors
Oct 18 07:09:20 x smartd[461]: Device: /dev/sdb [SAT], 1 Offline uncorrectable sectors
...
Oct 18 07:30:28 x kernel: [467502.192792] md/raid1:md1: sdb3: rescheduling sector 1849689328
Oct 18 07:30:28 x kernel: [467502.192822] md/raid1:md1: sdb3: rescheduling sector 1849689336
Oct 18 07:30:28 x kernel: [467502.192846] md/raid1:md1: sdb3: rescheduling sector 1849689344
Oct 18 07:30:28 x kernel: [467502.192870] md/raid1:md1: sdb3: rescheduling sector 1849689352
Oct 18 07:30:28 x kernel: [467502.192895] md/raid1:md1: sdb3: rescheduling sector 1849689360
Oct 18 07:30:28 x kernel: [467502.192919] md/raid1:md1: sdb3: rescheduling sector 1849689368
Oct 18 07:30:28 x kernel: [467502.192943] md/raid1:md1: sdb3: rescheduling sector 1849689376
Oct 18 07:30:28 x kernel: [467502.192966] md/raid1:md1: sdb3: rescheduling sector 1849689384
Oct 18 07:30:28 x kernel: [467502.192991] md/raid1:md1: sdb3: rescheduling sector 1849689392
Oct 18 07:30:28 x kernel: [467502.193035] md/raid1:md1: sdb3: rescheduling sector 1849689400
...
Oct 19 06:26:08 x kernel: [550035.944191] ata3.01: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
Oct 19 06:26:08 x kernel: [550035.944224] ata3.01: BMDMA stat 0x64
Oct 19 06:26:08 x kernel: [550035.944248] ata3.01: failed command: READ DMA EXT
Oct 19 06:26:08 x kernel: [550035.944274] ata3.01: cmd 25/00:08:15:fb:9c/00:00:6c:00:00/f0 tag 0 dma 4096 in
Oct 19 06:26:08 x kernel: [550035.944274]          res 51/40:00:1c:fb:9c/40:00:6c:00:00/10 Emask 0x9 (media error)
Oct 19 06:26:08 x kernel: [550035.944322] ata3.01: status: { DRDY ERR }
Oct 19 06:26:08 x kernel: [550035.944340] ata3.01: error: { UNC }
Oct 19 06:26:08 x kernel: [550036.573438] ata3.00: configured for UDMA/133
Oct 19 06:26:08 x kernel: [550036.621444] ata3.01: configured for UDMA/133
Oct 19 06:26:08 x kernel: [550036.621507] sd 2:0:1:0: [sdb] Unhandled sense code
Oct 19 06:26:08 x kernel: [550036.621516] sd 2:0:1:0: [sdb]  
Oct 19 06:26:08 x kernel: [550036.621523] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Oct 19 06:26:08 x kernel: [550036.621530] sd 2:0:1:0: [sdb]  
Oct 19 06:26:08 x kernel: [550036.621537] Sense Key : Medium Error [current] [descriptor]
Oct 19 06:26:08 x kernel: [550036.621555] Descriptor sense data with sense descriptors (in hex):
Oct 19 06:26:08 x kernel: [550036.621562]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
Oct 19 06:26:08 x kernel: [550036.621606]         6c 9c fb 1c 
Oct 19 06:26:08 x kernel: [550036.621626] sd 2:0:1:0: [sdb]  
Oct 19 06:26:08 x kernel: [550036.621638] Add. Sense: Unrecovered read error - auto reallocate failed
Oct 19 06:26:08 x kernel: [550036.621646] sd 2:0:1:0: [sdb] CDB: 
Oct 19 06:26:08 x kernel: [550036.621653] Read(10): 28 00 6c 9c fb 15 00 00 08 00
Oct 19 06:26:08 x kernel: [550036.621692] end_request: I/O error, dev sdb, sector 1822227228
Oct 19 06:26:08 x kernel: [550036.621719] raid1_end_read_request: 9 callbacks suppressed
Oct 19 06:26:08 x kernel: [550036.621727] md/raid1:md1: sdb3: rescheduling sector 1816361448
Oct 19 06:26:08 x kernel: [550036.621782] ata3: EH complete
Oct 19 06:26:08 x kernel: [550041.155637] ata3.01: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
Oct 19 06:26:08 x kernel: [550041.155669] ata3.01: BMDMA stat 0x64
Oct 19 06:26:08 x kernel: [550041.155694] ata3.01: failed command: READ DMA EXT
Oct 19 06:26:08 x kernel: [550041.155719] ata3.01: cmd 25/00:08:15:fb:9c/00:00:6c:00:00/f0 tag 0 dma 4096 in
Oct 19 06:26:08 x kernel: [550041.155719]          res 51/40:00:1c:fb:9c/40:00:6c:00:00/10 Emask 0x9 (media error)
Oct 19 06:26:08 x kernel: [550041.155767] ata3.01: status: { DRDY ERR }
Oct 19 06:26:08 x kernel: [550041.155785] ata3.01: error: { UNC }
Oct 19 06:26:08 x kernel: [550041.343437] ata3.00: configured for UDMA/133
Oct 19 06:26:08 x kernel: [550041.391438] ata3.01: configured for UDMA/133
Oct 19 06:26:08 x kernel: [550041.391501] sd 2:0:1:0: [sdb] Unhandled sense code
Oct 19 06:26:08 x kernel: [550041.391510] sd 2:0:1:0: [sdb]  
Oct 19 06:26:08 x kernel: [550041.391517] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Oct 19 06:26:08 x kernel: [550041.391525] sd 2:0:1:0: [sdb]  
Oct 19 06:26:08 x kernel: [550041.391532] Sense Key : Medium Error [current] [descriptor]
Oct 19 06:26:08 x kernel: [550041.391546] Descriptor sense data with sense descriptors (in hex):
Oct 19 06:26:08 x kernel: [550041.391553]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
Oct 19 06:26:08 x kernel: [550041.391596]         6c 9c fb 1c 
Oct 19 06:26:08 x kernel: [550041.391616] sd 2:0:1:0: [sdb]  
Oct 19 06:26:08 x kernel: [550041.391624] Add. Sense: Unrecovered read error - auto reallocate failed
Oct 19 06:26:08 x kernel: [550041.391636] sd 2:0:1:0: [sdb] CDB: 
Oct 19 06:26:08 x kernel: [550041.391643] Read(10): 28 00 6c 9c fb 15 00 00 08 00
Oct 19 06:26:08 x kernel: [550041.391681] end_request: I/O error, dev sdb, sector 1822227228
Oct 19 06:26:08 x kernel: [550041.391737] ata3: EH complete
Oct 19 06:26:08 x kernel: [550041.409686] md/raid1:md1: read error corrected (8 sectors at 1816363496 on sdb3)
Oct 19 06:26:08 x kernel: [550041.409705] handle_read_error: 9 callbacks suppressed
Oct 19 06:26:08 x kernel: [550041.409709] md/raid1:md1: redirecting sector 1816361448 to other mirror: sda3

컴퓨터는 약 한 시간 후까지 시스템 로그에 몇 가지 항목을 계속 기록하다가 마침내 완전히 응답하지 않게 되었습니다. 시스템 로그에 "커널 죄송"이 기록되지 않습니다. RAID 어레이가 다시 동기화되는 동안 컴퓨터를 다시 시작해야 합니다. 다시 동기화한 후에는 모든 것이 괜찮아 보이고 드라이브도 제대로 작동하는 것 같습니다.

나는 또한 재배열된 모든 섹터가 정확히 8 섹터 떨어져 있다는 것을 알아차렸는데, 이는 나에게 이상하게 보였습니다.

마지막으로 재부팅 후 약 하루나 이틀 정도 지나서 RAID 재동기화가 완료된 후 드라이브는 읽을 수 없는(보류 중) 및 오프라인으로 수정할 수 없는 섹터 수를 재설정했는데, 드라이브가 이 섹터를 오프라인으로 가져가서 다시 매핑했기 때문에 정상이라고 생각했습니다. :

Oct 20 01:05:42 x kernel: [    2.186400] md: bind<sda3>
Oct 20 01:05:42 x kernel: [    2.204826] md: bind<sdb3>
Oct 20 01:05:42 x kernel: [    2.209618] md: raid1 personality registered for level 1
Oct 20 01:05:42 x kernel: [    2.210079] md/raid1:md1: not clean -- starting background reconstruction
Oct 20 01:05:42 x kernel: [    2.210087] md/raid1:md1: active with 2 out of 2 mirrors
Oct 20 01:05:42 x kernel: [    2.210122] md1: detected capacity change from 0 to 997198858240
Oct 20 01:05:42 x kernel: [    2.210903] md: resync of RAID array md1
Oct 20 01:05:42 x kernel: [    2.210911] md: minimum _guaranteed_  speed: 1000 KB/sec/disk.
Oct 20 01:05:42 x kernel: [    2.210915] md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for resync.
Oct 20 01:05:42 x kernel: [    2.210920] md: using 128k window, over a total of 973827010k.
Oct 20 01:05:42 x kernel: [    2.241676]  md1: unknown partition table
...
Oct 20 06:33:10 x kernel: [19672.235467] md: md1: resync done.
...
Oct 21 05:35:50 x smartd[455]: Device: /dev/sdb [SAT], No more Currently unreadable (pending) sectors, warning condition reset after 1 email
Oct 21 05:35:50 x smartd[455]: Device: /dev/sdb [SAT], No more Offline uncorrectable sectors, warning condition reset after 1 email

smartctl -a /dev/sdb지금 보여줘

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
...
  5 Reallocated_Sector_Ct   0x0033   096   096   036    Pre-fail  Always       -       195
...
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
...

몇 가지 문제가 발생합니다.

1) 재배열된 모든 섹터가 정확히 8개로 떨어져 있는 이유는 무엇입니까?

2) 커널이 응답하지 않고 재부팅이 필요한 이유는 무엇입니까? 이러면 안 된다정확히RAID-1은 시스템 충돌 없이 이러한 상황을 처리하도록 되어 있습니까?

3) 공격대 재동기화 완료 후 23시간 만에 읽을 수 없고 오프라인으로 수정할 수 없는 개수가 재설정되는 이유는 무엇입니까?

답변1

1) 재배열된 모든 섹터가 정확히 8개로 떨어져 있는 이유는 무엇입니까?

이러한 섹터 수의 격차는 예상할 수 있는 일이지만, 문제는 이러한 격차가 얼마나 큰지(4k 이상)입니다. 8x 512바이트는 4k이며, 이는 대부분의 파일 시스템에서 사용되는 섹터 크기입니다. 따라서 파일 시스템은 RAID에서 4k 읽기를 요청할 수 있으며 RAID는 /dev/sdb해당 데이터를 요청할 것입니다. 첫 번째 섹터(로그에 표시되는 섹터 번호)에서 읽기가 실패하고 RAID가 전환되어 /dev/sda거기에서 4k를 제공합니다. 그런 다음 파일 시스템은 다음 4k를 읽고 /dev/sdb섹터 번호 +8로 돌아가도록 요청하지만 다시 실패합니다. 이는 다시 로그에 표시됩니다.

2) 커널이 응답하지 않고 재부팅이 필요한 이유는 무엇입니까?

정상적인 상황에서는 그런 일이 일어나서는 안 됩니다. 문제는 재분배 사건이 받을 수 있는 비용 중 가장 비싸다는 점이다. 실패한 각 읽기는 다른 디스크로 리디렉션되어야 하며 원본 디스크에 다시 작성되어야 합니다. 동시에 로그 파일이 가득 차면 새로운 쓰기 요청이 발생하여 다시 재할당되어야 합니다. 이 경우 디스크를 완전히 제거하는 것이 더 저렴할 것입니다.

또한 나머지 하드웨어(예: SATA 컨트롤러)가 고장난 드라이브를 어떻게 처리하는지에 대한 문제이기도 합니다. 컨트롤러 자체에 문제가 있으면 성능이 더욱 저하될 수 있습니다.

로그 항목이 없으면 정확히 무슨 일이 일어났는지 말하기가 어렵습니다. 이는 Linux 커널의 약점이며, 상황이 정말 나빠지면 마지막 메시지를 보관할 수 있는 쉬운 해결책이 없습니다.

3) 공격대 재동기화 완료 후 23시간 만에 읽을 수 없고 오프라인으로 수정할 수 없는 개수가 재설정되는 이유는 무엇입니까?

일부 값은 오프라인 데이터 수집(업데이트된 오프라인 열)을 수행할 때만 업데이트되므로 시간이 다소 걸릴 수 있습니다. 이 작업을 자동으로 수행하도록 설정된 경우(예: 4시간마다) 디스크에 따라 다릅니다. 디스크에 의존하고 싶지 않다면 smartmontools를 사용하여 설정해야 합니다.

관련 정보