на главную add bookmark :: set homepage
MENU
Главная
Каталог статей
Софт насущный
Книжная полочка
Wall'ный креатив
Гостевая книга
Форум сайта
Обмен ссылками
Поиск на сайте
UNDERWORD
Слово об удовольстиях
NEW
VISITS
Rambler's Top100
CONTENTS: главная » статьи » софт » книги » обои » ссылки » поиск

От чего зависит производительность жестких дисков в файловой системе

 Автор: Сергей Андрианов

Накопитель на жестких магнитных дисках имеет две основные физические характеристики, влияющие на производительность: среднее время доступа и средняя устоявшаяся скорость передачи данных. Пользователя же больше интересует скорость работы с файлами. Давайте попытаемся установить, как второе зависит от первого.

Предположим, что у нас есть накопитель с временем поиска 15 мс (будем считать это постоянной, а не средней величиной), скоростью устоявшейся передачи данных (с пластин) 50 Мбайт/с и скоростью обмена с буфером 90 Мбайт/с.

Для начала рассмотрим, что было бы в случае отсутствия внутреннего буфера накопителя и кэширования диска со стороны ОС. Пусть нам надо считать файл длиной 1 Кбайт. Тогда время, затраченное на это, равно сумме времени доступа и времени, необходимого на чтение. Последнее, в свою очередь, равно отношению размера файла к скорости чтения (для простоты вычислений будем применять десятичные меры объема и скорости обмена):

tфайла = tдоступа + Lфайла/Wобмена = 0,015 с + 103 байт / 50*106 байт/с = 0,015 с + 0,00002с = 0,01502 с.

Отнеся размер файла к затраченному времени, получим эффективную скорость передачи данных:

Wэфф = Lфайла / tфайла = 103 байт / 0,01502 с = 66,6*103 байт/с.

Следовательно, в данном случае эффективная скорость почти на три порядка ниже той, на которую мы рассчитывали. Зависимость эффективной скорости от объема файла приведена на рисунке (часть кривой “непрерывное чтение” левее линии “без кэширования”). Как видно, более или менее приемлемых величин эффективная скорость обмена достигает лишь при объеме файла порядка 1 Мбайт. На самом деле это абсолютно нереальная величина, поскольку длинные файлы никогда не читаются за один раз — они всегда читаются по частям, причем размер части обычно равен размеру кластера — 4—32 Кбайт. (Если прикладная программа читает более мелкими порциями, например по 1 байту, то кэширование в пределах одного кластера — обязанность ОС.) Эффективная скорость обмена при этом составляет от 0,27 до 2,1 Мбайт/с, поэтому в современных накопителях всегда применяется буфер, в который помещаются данные опережающего чтения либо данные, подлежащие записи.

При условии кэширования можно реально достичь скоростей, близких к предельно возможным. Зависимость скорости обмена от объема файла в условиях непрерывного чтения приведена на рисунке. Под непрерывным чтением здесь подразумевается, что программа пытается выполнять чтение максимально быстро. В действительности такое встречается при копировании по 1-Гбит сети, при копировании с одного физического диска на другой и... в программах, измеряющих эту самую скорость, т. е. на практике это бывает довольно редко. Гораздо чаще приходится иметь дело либо с копированием в пределах одного физического накопителя (пусть даже между разными логическими дисками), либо когда чтение данных перемежается с другой работой, например, когда порции данных поочередно читаются, декодируются и выводятся на экран или звуковую плату при просмотре видеофильма или прослушивании музыки. В последнем случае при отсутствии фрагментации данные передаются прикладной программе из буфера опережающего чтения. Тогда под затраченным временем следует понимать сумму всех интервалов времени на запрос данных (кривая “мультимедийное чтение” на рисунке).

С записью дело обстоит несколько иначе. Если при чтении накопитель не может сообщить программе данные до тех пор, пока они не оказались у него в буфере (перед этим он должен считать их с пластин), то при записи данные можно просто “запихнуть” в буфер в надежде записать их на поверхность диска уже после того, как программа продолжит заниматься своими делами. Поэтому мелкие файлы “пишутся” очень быстро, пока не будет исчерпан объем буфера. В дальнейшем же придется все равно ждать, пока часть данных не будет записана на диск и, таким образом, не освободится часть буфера (кривая “непрерывная запись” на рисунке). Если же программа периодически сбрасывает данные небольшими порциями, так что буфер успевает очищаться, то теоретически достижима максимальная производительность — скорость обмена данными с буфером (кривая “мультимедийная запись” на рисунке). К сожалению, в реальности кроме полезной информации приходится записывать и служебную, например, сведения об имени файла, его размещении, дате создания, атрибутах, etc. А это связано помимо прочего еще и с перемещением головки. Так что на практике теоретический максимум оказывается недостижим.

Еще один случай, о котором мы упомянули, но который пока не проанализировали с точки зрения производительности, — копирование файлов в пределах одного накопителя. При этом происходит циклическое чередование нескольких этапов. В простейшем случае выполняется позиционирование на зону чтения — чтение, позиционирование на зону записи — запись. В более сложном — к перечисленному добавляются чтение и запись служебной информации с позиционированием в соответствующих зонах. Кстати, любопытно, что если знать основные характеристики накопителя, то по объему и времени копирования длинного файла можно примерно оценить размер тех фрагментов, по которым происходит копирование. Для этого надо определить среднюю скорость копирования, разделив объем файла на время, а затем умножить ее на 2, так как половина времени приходится на чтение и половина — на запись. Потом следует по графику “непрерывная запись” найти объем фрагмента. Пусть у нас файл объемом 700 Мбайт копируется 2,5 мин (150 с). Тогда средняя скорость копирования составит 700 000 000/150 * 2 = 9 300 000. По графику это соответствует примерно 150 Кбайт. Впрочем, с учетом необходимости доступа к служебной информации объем может быть в 1,5—2 раза больше. В данном случае он, вероятно, равен 256 Кбайт.

Отдельный вопрос — мелкие файлы. В данном случае "мелкие" означает, что чистое время собственно чтения файла существенно меньше среднего времени поиска. Фактически в этом режиме можно говорить о постоянной скорости, если ее выражать не в байтах в секунду, а в файлах в секунду. Примерную границу можно провести по отметке 1 Мбайт. Поскольку на компьютере таких файлов подавляющее большинство, то можно сделать вывод, что среднее время поиска должно значительно сильнее влиять на производительность накопителя, чем скорость линейной передачи данных. При небуферизованном обмене полное время чтения практически равно удвоенному времени доступа к данным: первый раз — к служебным данным о длине и размещении файла; второй — к самому файлу.

При кэшировании прежде всего проявится экономия за счет хранения в памяти служебной информации, например таблицы размещения файлов. Но это уже работа ОС. А вот как оптимизировать обработку мелких файлов, в частности при архивации, и как распределить небольшое буферное пространство между упреждающим чтением и отложенной записью — эти два вопроса относятся к сфере деятельности внутреннего контроллера накопителя. И выбор оптимального алгоритма кэширования — также задача непростая и, значит, здесь программисты, пишущие микропрограммы, имеют немалую свободу для творчества. В общем, накопители, обладающие, казалось бы, одинаковыми возможностями в физическом плане (скорость обмена, время доступа, объем буфера), могут показывать заметно различающиеся результаты при работе с файловой системой.

:: на начало ::
Windows Info Edition
 Поиск:     
Original idea, design: Daemon © 2003-2005 «Windows Info Edition»
Сайт создан в системе uCoz