Как Linux md-RAID обрабатывает ошибки чтения диска?

Есть 2 случая:

  • команда чтения отключается на уровне ядра (по умолчанию 30 секунд),
  • привод сообщает о своей неспособности прочитать данный сектор, прежде чем ядро ​​потеряет терпение (в данном случае я заинтересован).

Таймаут ядра

Поскольку доступ к диску обычно проходит через уровень SCSI Linux, я думаю, что тайм-аут полностью обрабатывается этим слоем. В соответствии с этой документацией он несколько раз пытается выполнить команду после сброса диска, затем шины, затем хоста и т. Д. Если это не работает, уровень SCSI отключит устройство. На данный момент, я думаю, что уровень md просто «обнаруживает», что один диск ушел, и отмечайте его как отсутствующий (не удалось). Это верно?

Ошибка при записи диска

Некоторые диски могут быть настроены для сообщения об ошибке чтения после достижения определенного таймаута, что прерывает попытки внутреннего восстановления. Это называется ERC (или TLER, CCTL). Тайм-аут диска обычно настроен для запуска до истечения времени ожидания ОС (или RAID-контроллера hw), чтобы последний знал, что на самом деле произошло, а не просто «ожидание и прерывание».

Мой вопрос: как Linux (и md) обрабатывает ошибки чтения сообщений о диске?

Будет ли он повторять попытку, сделать что-нибудь умное или просто отключить диск, не пройдя все попытки, описанные в «Тайм-аут ядра» выше? Знает ли когда-нибудь, когда такое происходит?

Некоторые полагают, что ERC опасен для Linux, поскольку он не даст достаточно времени для восстановления диска. Они также говорят, что ZFS-рейд хорош, потому что, если возникает ошибка чтения, он будет вычислять недостающие нечитаемые данные сектора благодаря избыточности RAID и перезаписывать его на диске. Последний должен затем перестать пытаться читать неприятный сектор, автоматически помечать его как плохой (больше не использовать) и переназначать его в хорошем здравом секторе.

Является ли md также способным это сделать?

Это подробно описано на странице руководства md (4), раздел RECOVERY .

[…] ошибка чтения вместо этого заставит md попытаться восстановить, перезаписав плохой блок. т.е. он найдет правильные данные из других источников, запишет их по незавершенному блоку, а затем попытается прочитать его снова. Если сбой записи или повторного прочтения, md будет обрабатывать ошибку так же, как обрабатывается ошибка записи, и выйдет из строя все устройство.

Что касается тайм-аутов, в то время как есть сообщения о том, что диски выгнали, если они были в режиме ожидания, это никогда не случалось для меня. У меня есть 7 жестких дисков, которые обычно вращаются (поскольку основная система работает с SSD и может работать без доступа к жесткому диску в течение длительных периодов времени), и она работает без проблем (за исключением того, что md пробуждает один диск после другого, а не все -один раз).

Я думаю, это зависит от того, что другие слои сообщают md .

Что касается того, что TLER опасен, я думаю, что нет. На самом деле, я до сих пор не могу поверить, что эта функция когда-либо была необходима; ни один диск не должен повторять эту длинную попытку. Даже всего 7 секунд достаточно даже для медленного привода с частотой вращения 5400 об / мин, чтобы повторить несколько сотен раз. Если вы не сможете добиться этого сразу после нескольких, не говоря уже о нескольких сотнях попыток, тогда вы никогда не пойдете.