LINUX.ORG.RU

Контроль числа чтений сектора


0

0

Кто контролирует число попыток чтенй битого сектора диска? драйвер файловой системы, драйвер диска или кто другой?? Прияина: Нужно при чтении диска, если возникла ошибка, сразу пропустить этот сектор, а не ждать пока произойдут можество попыток чтения (до победного) А если известно кто? То какой параметр или IOCTL нужно послать, чтобы принудительно отказаться "до победного" чтения этого сектора. P.S: уж очень надоело по 10 минут сидеть и ждать пока этот сектор пройдёться (


думаю что проблема не только в ОС которая повторяет
запрос при таймауте, но и в самих винтах которые
подвисают на ББ. Отсюда и лаги, если ОС не получила
ответа от винта то она ему reset шлёт.

У фряшки есть kern.cam.da.retry_count и в файле ./sys/dev/ata/ata-queue.c в районе 
                device_printf(request->dev,
                              "TIMEOUT - %s retrying (%d retr%s left)",
                              ata_cmd2str(request), request->retries,
                              request->retries == 1 ? "y" : "ies");


всё что нужно. А кто инициализирует request->retries и можно ли
это тюнить смотри сам.

Так же наверно можно таймаут уменьшить.

true_admin ★★★★★
()
Ответ на: комментарий от krio

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

Почитай уж, что ли, как последние лет 20 винты работают...

mv ★★★★★
()
Ответ на: комментарий от mv

Так к котроллеру-то диска можно обратиться на прямую, сказав чтбы читал однопроходово? Я понимаю, что у каждго производителя разные...интересует вопрос можно ли?

krio
() автор топика
Ответ на: комментарий от krio

У контроллера диска при повреждении поверхности вообще есть проблемы понять, где он находится. По возможности, битые сектора перемапливаются на резервные. Причём, делается это ещё в тот момент, когда данные можно вытащить. Когда резерв заканчивается, на винте появляются видимые извне плохие сектора. А при сильном повреждении с винтом вообще могут странные вещи твориться, вплоть до подвисания.

mv ★★★★★
()
Ответ на: комментарий от mv

Так мне главное сказать ему не читай ты 10 раз, прйди свои 2 мм по поверхности, отдай что смог и читай куда дальше пошлют. Суть в том, что работает-то всё на "честность": сказали читай стока-то, он и будет читать, хоть скорость вообще до 0 понизить. Есть же диски для RAID'ов. Одно из отличий от "нормальных" как раз заключается в том, что при невозможности прочитать сектор диск достаточно быстро сдается, а не пытается потратить полжизни в безуспешных попытках сектор отковырять. Так я думаю особых ухишрений не использовали просто параметр числа чтения до 1 понизили

krio
() автор топика
Ответ на: комментарий от krio

да у меня тоже не фряха, но во фряхе почему-то такие вещи найти и подправить под себя проще :).

Впрочем, вроде в /usr/src/linux/drivers/ata тоже что-то грепается по timeout и retry.

true_admin ★★★★★
()
Ответ на: комментарий от krio

> просто параметр числа чтения до 1 понизили

Тогда бы вообще ничего не читалось. Посмотри на статистику ошибок в s.m.a.r.t. для Сигейтов, они в показывают счётчики ошибок в чистом виде, и эти счётчики стоят в неслабых значениях.

mv ★★★★★
()
Ответ на: комментарий от mv

У меня есть подозрение что у сегейтов это что-то другое потому как ну очень быстро растёт. Живых сегейтов не осталось чтобы посмотреть, но если стока ошибок чтения то мне кажется он бы не смог raw read под 100метров в секунду читать.

true_admin ★★★★★
()
Ответ на: комментарий от mv

я говорю, что это не кол-во секторов. Как интерпретировать никто не знает. По крайней мере я ответа на этот вопрос ещё не видел. А раз никто не знает то это гадание на кофейной гуще что это за ошибки и ошибки ли вообще.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Конечно, ошибки (не фатальные, просто рабочие). Огромный процент полезной ёмкости накопителей тратится на служебные данные, чтобы вся система в принципе работала.

mv ★★★★★
()
Ответ на: комментарий от mv

Ты не про Seek_Error_Rate? что-то он каждую секунду
у меня на 14 равномерно увеличивается при отмонтированном
диске :). Не знаю что это, но явно не ошибки позиционирования.


# while true; do smartctl -a /dev/sda | grep Seek_Error_Rate; sleep 1; done
  7 Seek_Error_Rate         0x000f   087   060   030    Pre-fail  Always       -       481437529
  7 Seek_Error_Rate         0x000f   087   060   030    Pre-fail  Always       -       481437543
  7 Seek_Error_Rate         0x000f   087   060   030    Pre-fail  Always       -       481437557
  7 Seek_Error_Rate         0x000f   087   060   030    Pre-fail  Always       -       481437571
  7 Seek_Error_Rate         0x000f   087   060   030    Pre-fail  Always       -       481437585
  7 Seek_Error_Rate         0x000f   087   060   030    Pre-fail  Always       -       481437599
  7 Seek_Error_Rate         0x000f   087   060   030    Pre-fail  Always       -       481437613
  7 Seek_Error_Rate         0x000f   087   060   030    Pre-fail  Always       -       481437627
^C

true_admin ★★★★★
()

>Прияина: Нужно при чтении диска, если возникла ошибка, сразу пропустить этот сектор, а не ждать пока произойдут можество попыток чтения (до победного)

В спецификации ata есть специальная команда чтения без повторов (21h вроде), я правда не знаю обязательная она или факультативная, обычная команда (обязательная)для чтения секторов 20h, это все для pio режима. Потом еще на любом уровне выше драйвера контроллера могут быть программные циклы повторов - надо исходники смотреть, например у dd есть ключ пропуска ошибок чтения, а он через обычные read/write работает - просто предварительно заполняет нулями буфер читаемого блока и в случае ошибки и утсановленного флага блок остается с нулями и работа продолжается дальше.

imhotep
()
Ответ на: комментарий от imhotep

Почитал "Кулакова" про спецификацию ATA: 21h чтение секторов без повторов в режиме PIO 20h сповторами. Про dd скажу, что conv=noerror не избавляет от повторного чтения битого сектора. Пропуск ошибок чтеия идёт на уровне файловой системы. Почитал и по рыскал по словам timeout и retry в исходниках, нашёл интересный флажок ATA_QCFLAG_RETRY в libata.h, который, как я понял, отвечает за повторное чтение в случае ошибки. А кто-нить знает поподробнее что за флажок и как его применить для решения задачи топика?

krio
() автор топика
Ответ на: комментарий от krio

>Про dd скажу, что conv=noerror не избавляет от повторного чтения битого сектора.

dd я упоминал в контексте того что любой код выше уровня драйвера контроллера ata может иметь свой собственный цикл повторного чтения - не дошло так не дошло.

>Пропуск ошибок чтеия идёт на уровне файловой системы.

ага - драйвер файловой системы должен знать что у конкретного устройства есть команда чтения без повтора ? бред, и dd вообще не работает с какой-либо фс.

imhotep
()
Ответ на: комментарий от imhotep

Упс.. Это я зачитался про виды ошибок (аппаратные, файловой системы). Дравйвер файловой системы общается с диском через драйвер блочного устройства, который далее уже с ATA. Сосредоточимся на сути: Можно ли управлять многократными попытками чтения битого сектора через ATA_QCFLAG_RETRY в libata.h или же использовать прерывания? Или как по-другому?

krio
() автор топика
Ответ на: комментарий от krio

Происследовав возможности ATA команд и исходники hdparm получилось читать сектора ioctl-запросом через HDIO_TADK_FILE. К сожалению существенного выиграша в скорости нету, но битые сектора теперь явно выявляются и по-быстрому обрабатываются. Дальше копать уже не хочется!

krio
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.