Жесткий диск в последнее время сдает позиции в борьбе с SSD на стороне которого быстродествие и отсутсвие панического страха к вибрациям, спасаясь только за счет дешевой стоимости размещения гигабайта данных и большего количества циклов перезаписи. Давайте подумаем, помогут ли несколько следующих идей дать фору для HDD.
Жесткий диск состоит из одного или нескольких тонких дисков с ферромагнитной поверхностью закрепленных на шпинделе, раскручиваемых двигателем до скорости в несколько тысяч оборотов в минуту. Отдельной частью является блок головок который перемещается вдоль радиуса диска. Если раньше использовались системы которые перемещали блок головок по прямой (наподобие системы которая используется в CD/DVD), то сейчас как правило используется коромысло. На одном конце коромысла закреплены головки, с другой стороны располагается система перемещения. По началу за все перемещения отвечали сервоприводы, но после того как научились делать сильные магниты «много и дешево» начал использоваться механизм взаимодействия магнитного поля магнита и электромагнитных полей катушки провода на которую подается электрический ток.
В качестве хранилища жесткий диск дает три измерения:
- сilinder – представляет из себя некую дистанцию от центра диска, вдоль которой происходят операции чтения, записи, и перед тем как их начать, необходимо переместить блок головок на тот или иной цилиндр;
- head -каждая сторона диска на поверхности которой можно размещать данные, и над которой соответственно размещена головка, так-же есть понятие «дорожка» которое определяет данные размещенные на определенной поверхности на заданном цилиндре;
- segment – кусочек окружности дорожки размещенной на одной из рабочих поверхностей вдоль которого собственно и размещен кусочек данных.
Для того, чтобы считать сегмент данных, жесткий диск должен переместить блок головок к необходимому цилиндру, выбрать поток данных с нужной головки и дождаться пока диск не повернется нужным сегментом под блок головок и только после этого можно прочитать или записать данные.
Время доступа к данным варьируется от того на сколько вы счастливчик, и тут есть несколько ситуаций.
Случай 1: вы везунчик, и после поступления команды на чтение жесткий диск увидел, что блок головок расположен на нужном цилиндре, начинает считывать данные и первый считанный сегмент оказывается тем, что нужен. Для того чтобы посчитать насколько вам повезло, попробуем посчитать время сколько займет данная операция:
Определим переменные:
- t1-время передачи команды жесткому диску;
- t2-время обработки команды жестким диском;
- t3-позиционирование блока головок;
- t4-время перемещения сегмента к блоку головок;
- t5-время считывания одного сегмента;
- t6-время передачи данных от жесткого диска по интерфейсу
t3 и t4 для описанного случая стремятся к нулю и мы их проигнорируем, так-же как время передачи команды t1 (для 10-12 байт команды это будет 1/100 часть от данных) и время обработки команды t2 (зависит от сложности вычислений и быстродействия процессора, но будем считать что он достаточно быстр чтобы проигнорировать этот период).
Остаются t5 и t6, чтобы рассчитать эти значения возьмем характеристики интерфейсов и потоковое считывание с диска (скорость считывания некоторого количества сегментов подряд с одной дорожки). Для простоты расчетов, определим что сегмент объемом 1000 байт (в реальности он 512 или 4096 байт данных плюс некоторое количество служебных данных), а потоковое считывание как 50 Мб/с (есть больше, есть меньше).
t5 — 1000 байт * (1 / 50000000 байт/с) = 20 мкс на считывание/запись одного сегмента
t6 — зависит от скорости передачи данных, посчитаем его для разных интерфейсов:
IDE
- DMA33 – 33 Мб/с = 1000* (1/33 000 000) = 30 мкс (больше чем время потраченное на считывание)
- DMA66 – 66 Мб/с = 1000* (1/66 000 000) = 15 мкс
- DMA100 – 100 Мб/с = 1000* (1/100 000 000) = 10 мкс
SATA
- SATA I -1500 Гбит/с=150 Мб /с = 1000* (1/150 000 000) = 6.6 мкс
- SATA II/SAS -3000 Гбит/с=300 Мб /с = 1000* (1/300 000 000) = 3.3 мкс
- SATA III/SAS 2 -6000 Гбит/с=600 Мб /с = 1000* (1/600 000 000) = 1.6 мкс
Почему я поделил скорость SATA на 10 хотя в байте 8 бит? Дело в том что передача происходит в последовательном режиме и для того чтобы передать данные достоверно, используются либо сигналы синхронизации (стартовый и стоповый биты, привет COM-порт) либо данные перекодируются для того чтобы не получить на выходе насыщенный канал используются кодирование такое что не смотря на значение исходного потока байта (все 0 или 255), в результате получаем комбинацию с равным количеством нулей и единиц, так-же за счет перекодирования сигнала снижается частота сигнала (да, частота меньше а скорость больше).
Итого, получаем, что в случае везения, вы получите свои данные через 21.6 – 50 мкс, причем из расчетов данного случая вы понимаете зачем производители создают новые скоростные интерфейсы не смотря на то что скорость чтения с дисков значительно медленнее (чем быстрее интерфейс связи, тем быстрее ваши данные могут быть переданы с момента их готовности между отправителем и получателем).
Случай 2: вам повезло не так сильно, и нужно переместить блок головок на другой цилиндр, а после того как будет найден нужный цилиндр, необходимо подождать еще когда диск повернется на 180 градусов для доступа к нужному сегменту.
К сожалению о времени перемещения и позиционирования головки мне не известно, зато можно посчитать сколько времени нужно для перемещения сегмента по кругу, и примем время позиционирования равным половине времени оборота диска, а эта величина известна, и так, считаем время оборота диска (половина на позиционирование, половина на доворот диска для считывания).
Для того, чтобы посчитать нужно узнать сколько оборотов происходит за секунду, и далее узнать период разделив 1 на количество оборотов:
5400 об/мин – 1(5400/60)= 11мс
5900 об/мин – T=10 мс
7200 об/мин – T=8 мс
10000 об/мин – T=6 мс
15000 об/мин – T=4 мс
Какие-то знакомые значения, не находите? Точно! Среднее время доступа данных для диска примерно или равняется периоду оборота диска, почему среднее? Потому что есть:
Случай 3: вам не повезло, блок головок находится на первом цилиндре, а сегмент расположен на последнем, время перемещения блока головок заняло почти или столько же как и период вращения диска, после того как блок головок был позиционирован на нужном цилиндре, и началось считывание данных, оказалось что мы получили следующий после нужного сегмент, и для того чтобы его прочитать, нужно подождать когда диск совершит еще один оборот, при этом я промолчу про случай 4: когда данные с первого (и возможно и последующего) раза не были прочитаны (посчитать сколько времени это займет легко, миниум 2 * T об.).
Какой можно сделать вывод на данном этапе? «Эврика: нужно раскрутить шпиндель до 100500 оборотов!». Но не все так просто, если вы крутились на карусели, вы должны знать что если карусель крутится не слишком быстро, то на ней легко удержаться в любой части, если карусель раскручена слишком быстро, единственный способ удержаться это быть ближе к центру и крепко держаться. Что произойдет с дисками если их раскрутить сильно: сначала края диска начнут разбегаться в разные стороны за счет центробежных сил, и диск начнет сначала расплываться в разные стороны увеличиваясь, а так как скорость вращения не уменьшается, а размер диска увеличивается, с ним увеличиваются и центробежные силы, что приводит к разрушению молекулярных связей и получаем «бигбадабум», и несколько кусков от диска. Вот по причине воздействия центробежных сил высокооборотные диски делают меньшего диаметра, чтобы их не порвало.
Вот тут и появляется первая нелепая идея: почему нельзя сделать два блока головок расположенных друг напротив друга вместо одного (а если получится с двумя, то пробовать 3, 4 может даже и 5, 6). Что это нам дает:
1) с увеличением количества деталей, «уменьшается надежность» системы, но так как мы получаем дублирующую систему, мы «увеличиваем надежность».
2) блоки головок перемещаются синхронно (импульсы вызванные перемещением головок не действуют во время считывания/записи данных), и если сегмент только что проскочил, то второй блок головок получит шанс считать его через T об./2 (для этого нам в классическом случае нужно было бы раскрутить шпиндель в два раза быстрее).
3) блоки головок действуют по отдельным заданиям (влияние импульсов перемещения блока головок не существенно для операций чтения/записи), контроллер зная где находится тот или иной сегмент, может переместить самый выигрышный по позиции блок головок, для уменьшения времени теряемых на вращении шпинделя и количество операций ввода вывода увеличится в два раза.
4) Есть две ситуации, когда нам нужно обработать большое количество данных сразу:
-копирование/перемещение большого файла (привет Blu-ray);
-чтение-модификация-запись одного файла (привет базам данных).
В классическом варианте жесткого диска, при копировании, мы считываем блок данных в буфер, перемещаем блок головок в другую часть, записываем данные, возвращаемся за новой порцией данных, при небольшом объеме буфера, мы теряем огромное количество времени на перемещениях блока головок при большом объеме данных. В случае с модификацией одного файла, мы заполняем буфер, модифицируем его (это можно делать параллельно со считыванием, как только получены первые данные в нужной комплектации), и после модификации записываем. В модифицированной схеме, мы можем скопировать файл на максимальной скорости, одним блоком головок считывая данные, а вторым блоком записывая их на максимально-возможной скорости, которое будет зависеть в первую очередь от фрагментации файла, сейчас для жестких дисков такое возможно в случае применения двух дисков, с одного считывать, на другой записывать.
Вторым аспектом работы жесткого диска является его надежность, а в частности типовые неисправности, опустим неисправности логики программы, это нужно чинить в другом месте, озвучу только неисправности, которые зависят от конструктивных особенностей жесткого диска:
- заклинивание шпинделя во время старта (ну тут есть шанс прокрутить шпиндель внешним воздействием, запустить диск, считать данные и отправить на упокой);
- заклинивание шпинделя во время работы (тут последствия уже все зависит от вашего везения);
- в результате длительной работы без должного охлаждения, в случае отключения диска, есть вероятность того что опустившись на поверхность головки прикипят, и во время старта или шпиндель не сможет раскрутить диски (клин) либо головки получат новые оси свободы (данную ситуацию производители дисков начали обходить паркуя блок головок вне поверхности диска, и они ее не касаются в обычной ситуации);
- во время работы диска он получает импульс воздействия направленный перпендикулярно поверхности диска, что может привести к касанию головок с поверхностью, что в свою очередь может привести к разрушению поверхности, с выбиванием частиц, которые начнут летать внутри гермоблока периодически влетая в головки или под них, плодясь и умножая себе подобных они рано или поздно приведут к разрушению и невозможности считать данные;
- другой случай когда во время работы, диск получает внешнее воздействие направленное параллельно рабочей поверхности, во время считывания диск не сможет прочитать данные и сделает второй заход, а во время записи, такое воздействие может привести к тому что записываемый сегмент данных будет записан не в цилиндре а поперек нескольких.
Всем известно что самую большую ценность представляет из себя не стоимость жесткого диска (привет $-у), а те гигабайты бережно собранного «по… лезной информации». Для того, чтобы сохранить данные, используются RAID системы разного уровня, для которых необходимо использовать несколько жестких дисков. Вот на этом появляется вторая нелепая идея: использование технологий RAID в рамках одного диска.
В случае полного отказа диска конечно не спасет но в случае потери данных с 1-2 сегментов, вполне поможет исправить ситуацию.
Подход первый, который легко реализуется программным методом, заключается в том чтобы всю поверхность, или только критические или важные данные (0 сегмент, таблица разделов, файлы конфигурации системы) размещать по технологии RAID 5: А+Б=Сумма, получив две части из трех мы легко восстановим третью, зеркало или дублирование довольно широко используется например в NTFS дублируется несколько записей Master File Table, но это мало чем спасает в случае серьёзного сбоя, кроме того «зеркало» теряет половину объема в дубле, тогда как в случае сбора статистики по нечитаемым сегментам, можно реализовать возможность размещения данных по принципу «А+Б+В+Г+Д+Е+Ж+З=И» мы потеряем 1/9 часть объема, но увеличим вероятность восстановления данных в случае потери 1 сегмента данных.
Подход второй, связанный с модификацией логики работы контроллера заключается в том, чтобы используя принцип с контрольной суммой, размещать данные не вдоль одной дорожки, а на разных поверхностях дисков, такая реализация позволит спасти ситуацию когда одна из рабочих головок перестала совсем отвечать, мы всегда считав значения с других поверхностей получим исходные данные, ну а сохранив данные мы можем торжественно упокоить страдальца.
Собственно третьей нелепой идеей (впрочем она касается уже внешних накопителей как класса) будет следующая: делегировать поддержку размещения файлов и поддержку файловой системы контроллеру диска.
Чем это поможет: центральный процессор будет передавать только дескриптор файла, и какой кусок ему нужен, перестав отвлекаться на прерывания связанные с построением цепочки FAT например, а контроллер сам просчитает, где указанные куски хранятся, и выдаст контроллеру только нужный кусок файла.
Реализовать это можно:
- разработкой и заменой заводской прошивки (возможно и на текущем железе, но затратно в плане последующих модификаций, и количества вариантов дисков, привет разработчикам мобильных приложений);
- разработка файловой системы которую будут поддерживать прошивки производителей дисков;
- разработка и внедрение в прошивку языка программирования с помощью которого можно описать работу с файловой системой
Вот собственно три нелепых идеи, которые сложно проверить самому, а спокойно спать они не дают.
P.S. случайное использование зарегистрированных товарных знаков или патентов является случайным. Все оригинальные идеи доступны для использования по лицензионному соглашению «муравейник».
Автор: kasperos