Tips for DBA: выравнивание кластеров NTFS и блоков RAID-массивов

Недавно Кевин Кляйн в очередной раз поднял тему выравнивания размеров кластера и блока, проблему, которая, казалось бы, давно хорошо всем известна, документирована и не обходит ни один из известных мне списков рекомендаций по оптимизации работы дисковой подсистемы сервера баз данных. Статья Кевина How to Improve Application and Database Performance up to 40% in One Easy Step получила довольно большой резонанс в профессиональной блог-сфере, точно также, как в былые времена об этом писалось множество статей, шумели в форумах или nntp-конференциях… Размышляя о причинах всеобщей забывчивости о подобных проблемах, я склонен к таковым в первую очередь отнести то, что, увы, всё меньше стало возможностей получения систематизированных знаний (так и не образовалось школ администрирования, а техническая литература практически умерла на территории бывшего СССР), и то, что современные модели организации инфраструктуры IT всё меньше способствуют творческому и разностороннему подходу к задачам администрирования серверного парка организации. Узкие специализации и большие, я бы даже сказал масштабные, нагрузки на специалистов поддержки жизнедеятельности центров обработки данных приводят к тому, что ускользают такие детали, как, например, выравнивание размеров кластера и блока… Жизнь показывает, что такие просчёты для серверов баз данных могут стоить до 40% потери производительности дисковых операций.

Давайте перейдём к сути проблемы и начнём с её описания. Сразу хочу отметить, что если вы для размещения файлов баз данных используете RAW-партиции, или это простые диски, не входящие ни в какой RAID-массив с собственным контроллером, то вам беспокоиться не о чем. Не выровненными могут быть только кластеры NTFS и блоки RAID-массива (пусть даже это RAID0 из одного диска). Когда форматируется раздел, вы выбираете размер кластера, который является по сути своей тем же самым, что и блок разметки дисков у RAID-контроллера. Наверняка, в форумах или в рекомендациях разных вендоров вам попадались слова, что размер блока и размер кластера желательно устанавливать одинаковыми, например, для баз данных SQL Server очень часто слышны рекомендации выбирать и там и там 64Кб. Однако, операционная система создает самый первый кластер (блок начальной загрузки) размером в 63Кб. Эта особенность NTFS означает, что каждый последующий кластер будет сдвинут на 1Кб на предыдущий блок. Т.е. кластеры окажутся смещёнными относительно границ блоков массива. Такая ситуация приводит к тому, что одна операция чтения или записи кластера будет затрагивать два сектора и будет приводить к удвоению числа запросов ввода-вывода.

Наиболее наглядно это показал Дэнни Черрай (Denny Cherry) в своей статье Optimize disk configuration in SQL Server. Вот рисунок из его статьи:

А вот выигрыш от выравнивания наиболее наглядно продемонстрировал в статье своего блога Линчи Шеа, которую вы можете посмотреть здесь.

Ещё один подробный тест производительности SQL Server со смещением или без опубликовал в своём блоге Илгиз Мамышев: Выравнивание кластеров NTFS и блоков RAID массива (детальный тест для SQL Server)

Обнаружить и устранить смещение кластеров относительно блоков можно с помощью утилиты из состава Windows Server 2003, которая называется DISKPART.EXE. В Windows 2000 она имела несколько укороченное имя DISKPAR.EXE и входила в состав Windows 2000 Resource Kit.

Существует несколько статей Майкрософт, которые подробно обсуждают эту тему: 

Ещё несколько примеров использования DISKPART.EXE для нужд SQL Server вы можете найти в этих статьях: 

Имейте в виду, что когда вы будете применять команды DISKPART для выравнивания границ, данные на этих дисках будут полностью утеряны, так что позаботьтесь об их резервировании загодя.

Для того чтобы проверить существование сдвига, вы можете использовать следующий порядок использования утилиты DISKPART: Перейдите в командную строку и там, получив приглашение командной сроки, наберите и выполните команду: diskpart.exe. После этого вы должны увидеть приглашение запущенной утилиты DISKPART>. С помощью команды LIST DISK просмотрите список имеющихся дисков. Для того чтобы сделать текущим один из исследуемых дисков, введите команду SELECT DISK n, где n - номер выбранного диска по порядку операционной системы. После позиционирования диска, дайте команду LIST PARTITION, которая выведет на экран подробную информацию о разделах диска, включая начальное смещение.

Аналогичную информацию можно получить с помощью утилиты DiskExt, или запросом WMI, например, воспользовавшись методом, предложенным в блоге Боба Даффай, оригинальное сообщение о котором можно посмотреть здесь. Сам запрос имеет очень простой вид:

    SELECT * FROM Win32_DiskPartition

Он, как и вызов команды LIST PARTITION, вернёт в числе своих результатов информацию о начальном смещении. Те цифры, которые вы увидите, необходимо будет разделить на величину размера сектора диска, например, так:

    32256 / 512 = 63

Если полученный результат деления будет такой, как в примере, а размер блока дискового массива равен 64, значит между кластерами и блоками существует смещение в 1 Кб. Для того, чтобы выровнять раздел, нужно удалить смещённый раздел, а потом для выбранного диска задействовать команду DISKPART> CREATE PARTITION PRIMARY ALIGN=64. Эта команда создает новый раздел со смещением первого кластера на 64КбБ, что позволяет выровнять границы кластеров и блоков и тем самым оптимизировать работу дисковой подсистемы. Опция ALIGN появилась в сервисном пакете Windows 2003 SP1.

Published Fri, Oct 17 2008 8:29 by gladchenko
Filed under: , ,

Comments

# re: Tips for DBA: выравнивание кластеров NTFS и блоков RAID-массивов

Все то, о чем написал Александр, конечно же нужно делать ДО ТОГО как. Ну а для тех, кто как я, забывает сделать это вовремя, может оказаться полезной инструкция как исправить геометрию дискового массива ПОСЛЕ ТОГО как на нем  был установлен и пропатчен SQL Server.

Итак имеем:

4-х узловый кластер Win2003 с 3-мя SQL Server 2005 инстансами;  необходимо исправить геометрию RAID массива каждого инстанса.

1. Каждый SQL Server инстанс должен находиться на отдельном узле.

2. На первом узле перевести все ресурсы в режим offline, за исключением дискового ресурса на котором был установлен SQL Server, скажем диска R.

3. Запустить Disk Management и посмотреть какой физический диск соответствует логическому диску R; допустим это диск 1.

4. В командной строке набрать:

diskpar –i 1

где 1 это номер физического диска.

Эта команда покажет Drive Partition Information, которая будет выглядеть примерно так:

StatringOffset = 32256 – это значение некорректно и должно быть изменено

PartitionLength = 2017118283264

HiddenSectors = 63 – это значение некорректно и должно быть изменено

PartitionNumber = 1

PartitionType = 7

5. Скопировать ВСЮ информацию с диска R на локальный диск C используя команду xcopy с параметрами копирования файлов и каталогов включая ownership и ACL.

xcopy R:\*.* C:\DiskR /E /K /O /X

6. Перевести диск R в режим offline.

7. Проверить существующие зависимости ресурса диск R от других ресурсов (должна быть только одна зависимость от службы SQL Server) и удалить ее.

8. Удалить ресурс диск R из кластерной группы.

9. Запустить Disk Management и удалить логический раздел R на физическом диске 1.

10. В командной строке запустить утилиту DISKPART и выполнить следующие команды:

DISKPART> select disk 1

Disk 1 is now the selected disk.

DISKPART> create partition primary align=64

DiskPart succeeded in creating the specified partition.

DISKPART> exit

11. Проверить геометрию дискового массива 1 после исправления

diskpar –i 1

Теперь Drive Partition Information должна выглядеть примерно так:

StatringOffset = 65536  –  новое корректное значение

PartitionLength = 2017118249984

HiddenSectors = 128 –  новое корректное значение

PartitionNumber = 1

PartitionType = 6

12. Запустить Disk Management и пересканировать диски. Присвоить букву R физическому диску 1. Отформатировать диск R с 64 KB allocation unit size.

13. Создать ресурс диск R в кластерной группе.

14. Установить зависимость диска R от службы SQL Server.

15. Перевести диск R в режим online.

16. Скопировать информацию с локального диска C обратно на диск R.

xcopy C:\DiskR\*.* R:\ /E /K /O /X

17. Перевести все оставшиеся ресурсы кластерной группе в режим online.

18. Перезагрузить сервер на узле 1 (последнее может быть не обязательно, но так, на всякий случай).

19. Повторить 1 – 18 для оставшихся кластерных групп.

Tuesday, October 21, 2008 1:16 AM by Serhiy Snisarenko

# re: Tips for DBA: выравнивание кластеров NTFS и блоков RAID-массивов

Сергей, спасибо!

Один только вопрос, а почему у тебя смещение 128Кб? ...такой размер блока был выбран на RAID-массиве?

Tuesday, October 21, 2008 3:36 AM by gladchenko

# re: Tips for DBA: выравнивание кластеров NTFS и блоков RAID-массивов

Ещё один тест на сравнение производительности с выравниванием и без: forums.microsoft.com/.../ShowPost.aspx

Thursday, November 06, 2008 3:25 AM by gladchenko

Leave a Comment

(required) 
(required) 
(optional)
(required) 
If you can't read this number refresh your screen
Enter the numbers above: