Нестабильность измерения скоростных характеристик жестких дисков

Тема в разделе "WASM.WIN32", создана пользователем HCode, 21 янв 2006.

  1. HCode

    HCode New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2006
    Сообщения:
    72
    Здравствуйте.



    Я столкнулся с нестабильность измерения скоростных характеристик жестких дисков. Предполагаю, что ошибка, проявляющаяся с вероятностью 5-10% связана:

    1. С обращением к жесткому диску другого процесса

    2. С планировщиком вытесняющей многозадачности

    3. С механизмом работы виртуальной памяти



    Как временно ограничить доступ всех процессов на системный раздел жесткого диска? Под ограничением доступа имеется в виду запрет записи и чтения секторов HDD.

    Речь идет именно о системном разделе, т.к. в противном случае это можно сделать так:

    1. DeviceIoControl(hDevice, FSCTL_LOCK_VOLUME...

    2. Work...

    3. DeviceIoControl(hDevice, FSCTL_UNLOCK_VOLUME...
     
  2. HCode

    HCode New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2006
    Сообщения:
    72
  3. iamlamer

    iamlamer New Member

    Публикаций:
    0
    Регистрация:
    20 июн 2005
    Сообщения:
    273
    Адрес:
    Russia
    Мне эта тема тоже интересна и актуальна, но я не стал запускать твою прогу - мало ли что она делает? Да и вообще, гораздо лучше было бы, если бы ты рассказал, _что_ именно мерял, и _как_ именно мерял, тогда и появится пища для обсуждения.



    Пока совет один: если нужны _объективные_ данные о быстродействии винта, читай сектора под ДОСом, и не через INT 13h, а напрямую через контроллер.
     
  4. HCode

    HCode New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2006
    Сообщения:
    72
    см. http://smarthdd.ru



    Это понятно, но к сожалению суровая действительность бытия говорит - DOS уходит в небытие, а необходимость измерения характеристик остается :)
     
  5. iamlamer

    iamlamer New Member

    Публикаций:
    0
    Регистрация:
    20 июн 2005
    Сообщения:
    273
    Адрес:
    Russia
    DOS уходит в небытие, а необходимость измерения характеристик остается :)



    Ну, не буду разубеждать. Хотя, имхо, если в магазинах продаются в основном двухметровые гибкие щипцы, это еще не повод всем подряд удалять зубы исключительно через анальное отверстие, и считать это единственно возможным и единственно правильным способом. :) В конце концов, пиши программу из 15 строчек, грузи ДОС с дискеты и меряй _точно_ и _достоверно_, вместо того, чтобы тратить уйму времени и нервов на отключение от Маздая всего того лишнего и мешающего, что делает его отличным от того же самого ДОСа. Да еще и не будет уверенности, что оключил полностью, и что результаты измерений действительно достоверны. :dntknw:



    ReadFile(hDevice, Buffer^, SizeOf(TSector), BytesRead, nil);



    Кстати, почему размер буфера 1024*256? Это 512 секторов по 512 байт? А сколько дорожек/цилиндров при этом "засосет"? А зачем создавать отдельный поток для измерений, "главного" недостаточно?



    Ну ладно, теперь по сабжу. С перечнем возможных причин в общем согласен, хотя добавил бы еще пару:

    4) обработка аппаратных прерываний от внешних устройств (включая таймер!);

    5) личная инициатива винта (например, включение автокалибровки).



    Имхо, победтиь все 5 причин не выйдет. :dntknw: Но побороться можно. :)



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



    1. Если результаты "естественные", то ничего не делать.

    2. Иначе (пусть массивчика зовут Times) примерно так:



    mid := (max(Times)-min(Times))/2;

    n:=0; sum:=0;

    for i:=0 to 99 do begin

    if Times<mid then begin

    n:=n+1;

    sum:=sum+Times;

    end;

    end;

    average:=sum/n;



    т.е. включать в рассмотрение только "естественные" отсчеты выборки, а "пределом естественности" считать середину диапазона результатов. Это не очень корректно, но можно поюзать и более сложные модели.



    З.Ы. Всем ортодоксам большое аймсорри за "ламерский" Паскаль. В конце концов, каков вопрос - таков должен и ответ.
     
  6. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    вообщето дело вот в чём как мне сдается. Ты измеряешь скорость винта из пользовательского режима, причём абсолютно не заботишься о том, что юзермод это свитчинг контекстов, потом, доступ к винту асинхронен и третье не забывай про кэш и файловой системы и винта. Поэтому измерение скоростной харрактеристики данного устройства есть среднестатистическое значение нескольуих измерений плюс погрешность от вышеперечисленного. Могу предложить вариант такой: писать дравину прямого взаимодействия с винтом, при этом перехватить порт драйвер винтового контроллера и не давать в течение определенного времени спускать сверху по стеку ирпы к драйверу контроллера. В это время поработать с винтом и получить интересующие нас данные).
     
  7. HCode

    HCode New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2006
    Сообщения:
    72




    Это позиционирование приблизительно на среднюю дорожку перед началом анализа линейной скорости чтения.







    В стандартном "де-факто" режиме LBA понятия цилиндр, головка, сектор - CHS не существуют. Увеличение размера считываемого блока больше 256кб, как показали исследования , не улучшает стабильность измерений.







    Да, так как считывание блока данных в "Ultra DMA" режиме практически не загружает CPU то планировщик раздает кванты времени "голодающим", несмотря на
    Код (Text):
    1. SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
    2. SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
     
  8. HCode

    HCode New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2006
    Сообщения:
    72
    >CARDINAL. Да я думал об этом, но уж больно сложна реализация.
     
  9. iamlamer

    iamlamer New Member

    Публикаций:
    0
    Регистрация:
    20 июн 2005
    Сообщения:
    273
    Адрес:
    Russia
    HCode



    В стандартном "де-факто" режиме LBA понятия цилиндр, головка, сектор - CHS не существуют



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



    Да я думал об этом, но уж больно сложна реализация.



    И я того же мнения. Можно жизнь убить на борьбу с Майкрософтовскими наворотами :dntknw:, а можно просто правильно обработать результаты измерений. :)
     
  10. HCode

    HCode New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2006
    Сообщения:
    72




    LBA использует специальную таблицу "транслятор". Номер сектора это индекс в "трансляторе", т.е. вычислить CHS на основе LBA невозможно.
     
  11. H2SO4

    H2SO4 New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2005
    Сообщения:
    6
    Адрес:
    стеклянная пасуда
    DOS уходит в небытие, а необходимость измерения характеристик остается :)

    А если попробывать порубать все процессы при начальной загрузке, вместо explorer-a запустить свою прогу, а swap-файл отрубить в настройках?

    Зачем бороться с ними в realtime, когда им можно не дать грузануться.
     
  12. iamlamer

    iamlamer New Member

    Публикаций:
    0
    Регистрация:
    20 июн 2005
    Сообщения:
    273
    Адрес:
    Russia
    LBA использует специальную таблицу "транслятор".



    В то-то и дело, и я именно об этом! Никто же не знает, сколько раз головка сдвигается. Является ли читаемый фрагмент винта "характерным" для данного винта? 512*512 непрерывным куском - не маловато ли?
     
  13. HCode

    HCode New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2006
    Сообщения:
    72




    При чтении 1Мб данных навряд ли головка перейдет на другую дорожку, но такая вероятность существует.
     
  14. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    м.б. у тебя уже винт старый и физ. сектора разбросаны по диску до кучи