
Выравнивание размеров кластеров файловой системы и блоков RAID массива позволит увеличить производительность дисковых операций. — А на сколько и на каких операциях?
Я решил сам проверить это! Потестируем…
Внимание:
Выравнивание необходимо только для серверов версии ниже Windows Server 2008.
Цель теста:
Измерить прирост производительности дисковой подсистемы в контексте дисковых операций MS SQL Server и оценить степень этого прироста.
Материальное обеспечение теста:
- Сервер HP DL560 G1 2 CPU, 4GB RAM, Windows Server 2003 R2 SP2 Standard;
Дисковый массив HP MSA 1000;
4 диска Ultra SCSI 320 300GB 10K;
I. Калибровка дисков
Задача: На этом этапе мы должны убедиться, что используемые диски работоспособны, определить разброс скоростей чтения и записи по дискам, чтобы потом учитывать возможности каждого диска при распределении дисков в массивах.
Поскольку диски с повреждениями или существенными отклонениями от средней производительности, скорее всего, ведут себя одинаково плохо под разными типами рабочей нагрузки, а также потому, что дальнейшее тестирование также может выявить проблемные диски, мы ограничимся одним, грубым тестом. Для проведения этого
1. С помощью поставляемых с дисковым контроллером HP MSA 1000 специализированных утилит, установленных на сервере, конфигурируем все диски полки как 4 массива RAID0, каждый из которых состоит из одного диска, размер каждого массива выбирается равным всему доступному размеру диска, размер блока низкоуровневой разметки выбираем равным 64Кб, для чистоты измерений кэширование чтения и записи для этих дисков отключаем.
2. С помощью оснастки управления дисками, входящей в состав mmc-консоли управления компьютером, создаем для каждого физического диска полки RAW-раздел (без форматирования NTFS) величиной на весь диск, и без присвоения буквы диска (буквы присваивать можно, но это не обязательно).
3. Установить программу SQLIO Disk Subsystem Benchmark Tool. Везде по тексту настоящей статьи местоположение программы sqlio.exe выбрано следующее: C:\SQLIO\sqlio.exe
Более подробно об утилите можно узнать в статье — Эталонный тест дисковой подсистемы SQLIO.
4. Подготовим командный файл, который будет запускать программу sqlio.exe в разных режимах для каждого диска и сохранять результаты в файлы. Текст командного файла:
1: sqlio -kR -s300 -b64 -f1 -i4200000 -o1 -t1 -R1 -LP -a2 -BN > R01-b64-f1-i4200000-o1-t1.log 2: timeout /T 30 3: sqlio -kW -s300 -b64 -f1 -i4200000 -o1 -t1 -R1 -LP -a2 -BN > W01-b64-f1-i4200000-o1-t1.log 4: timeout /T 30 5: sqlio -kR -s300 -b64 -f1 -i4200000 -o1 -t1 -R3 -LP -a2 -BN > R03-b64-f1-i4200000-o1-t1.log 6: timeout /T 30 7: sqlio -kW -s300 -b64 -f1 -i4200000 -o1 -t1 -R3 -LP -a2 -BN > W03-b64-f1-i4200000-o1-t1.log 8: timeout /T 30 9: sqlio -kR -s300 -b64 -f1 -i4200000 -o1 -t1 -R4 -LP -a2 -BN > R04-b64-f1-i4200000-o1-t1.log 10: timeout /T 30 sqlio -kW -s300 -b64 -f1 -i4200000 -o1 -t1 -R4 -LP -a2 -BN > W04-b64-f1-i4200000-o1-t1.log 11: timeout /T 30 12: sqlio -kR -s300 -b64 -f1 -i4200000 -o1 -t1 -R5 -LP -a2 -BN > R05-b64-f1-i4200000-o1-t1.log 13: timeout /T 30 14: sqlio -kW -s300 -b64 -f1 -i4200000 -o1 -t1 -R5 -LP -a2 -BN > W05-b64-f1-i4200000-o1-t1.log
В этом файле каждый вызов программы sqlio.exe имеет одинаковые аргументы, кроме аргумента R, который имеет значения 1, 3, 4, 5 — номера дисков согласно консоли «Управление дисками». Каждый диск тестируется на чтение и, после 30 секундной паузы, на запись (аргумент k). Время тестирования каждого диска 300 секунд (аргумент s), размер блока 64Кб (аргумент b), Число блоков в строке равно единице (аргумент f), число строк равно 4200000 (аргумент i), число очередей тоже равно единице (аргумент o), число потоков равно единице (аргумент t). Суммарный размер файла рабочей нагрузки на каждом диске составляет ~270Гб, что почти совпадает с размером диска.
Образец вывода программы sqlio.exe
1: sqlio v1.5.SG 2: calibrating timestamp counter for latency timings... done (MHz measured at 2956) 3: 1 thread reading for 300 secs from file 5: 4: using 64KB IOs over 64KB stripes with 4200000 IOs per run 5: enabling multiple I/Os per thread with 1 outstanding 6: buffering set to not use file nor disk caches (as is SQL Server) 7: affinity mask is 0x2 (2) 8: initialization done 9: CUMULATIVE DATA: 10: throughput metrics: 11: IOs/sec: 843.64 MBs/sec: 52.72 12: latency metrics: 13: Min_Latency(ms): 1 14: Avg_Latency(ms): 1 15: Max_Latency(ms): 24 16: histogram: 17: ms: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24+ 18: %: 0 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5. Запустим командный файл на исполнение, а потом сведем собранные в файлы результаты в общую таблицу, для дальнейшего сравнения и анализа (отберем только интересующие нас данные — метрику «MBs/sec»).
На Рисунке 1 показан результат калибровочного тестирования 4-х дисков.
Наиболее важной задачей нагрузочного тестирования является выявление дисков, характеристики которых существенно отличаются от остальных. На Рисунке 1 диски практически идентичны, как по записи, так и по чтению.
II. Выбор размера блока и уровня RAID
Таблица 1. Характеристики для основных типов нагрузки ввода – вывода SQL Server
Многие специалисты рекомендуют устанавливать размер блока для форматирования NTFS раздела операционной системы Windows равным 64 Кб и делать такого же размера размер страйпа при монтировании дискового массива. Данная тема многократно обсуждалась во многих источниках.
На этом не задерживаемся — выбираем 64K.
В выборе уровня RAID я остановлюсь на RAID10. Выбор оптимального уровня RAID не цель этой статьи, — это много раз обсуждалось и обсуждается в других источниках.
RAID будет подвержен тестовым сериям измерения скорости чтения и записи, для разных размеров блока. Размер блока (который задаётся параметром –b) будет принимать следующий набор значений: 1024, 512, 256, 128, 64, 8. Размеры блока соответствуют размерам основных типов запросов ввода-вывода.
III. Тест производительности без выравнивания кластеров NTFS и блоков RAID массива
С помощью поставляемых с дисковым контроллером HP MSA 1000 утилит создаем массив RAID10 из четырех имеющихся дисков, размер выбирается максимально доступный, размер блока низкоуровневой разметки выбираем равным 64Кб, кэширование чтения и записи для этого диска отключаем.
С помощью оснастки «Управление дисками», входящей в состав mmc консоли «Управление компьютером» создаем раздел величиной в весь диск, форматируем в NTFS, с размером кластера 64K.
Диск готов.
Узнаем, для информации, смещение кластеров NTFS на созданном разделе.
Смещение равно 32K
Запускаем тест (см. командный файл в Приложении 1).
Получаем результаты (см. Рис.4).
IV. Тест производительности с выравниванием кластеров NTFS и блоков RAID массива
RAID10 на дисковой полке остается без изменений с предыдущего теста.
Удаляем раздел из оснастки «Управление дисками».
Создаем раздел с использованием:
1: DISKPART 2: CREATE PARTITION PRIMARY ALIGN=64
С помощью оснастки «Управление дисками», входящей в состав mmc консоли «Управление компьютером» форматируем раздел в NTFS, с размером кластера 64K.
Диск готов. Запускаем тест (см. командный файл в Приложении 1).
Получаем результаты (см. Рис.4).
На рисунке 4 показана сводная таблица с результатами тестов.
На рисунке 5 показаны результаты тестов в виде графиков.
Выводы:
В результате выравнивания кластеров NTFS и блоков RAID массива повышается производительность дисковых операций.
Повышение производительности зафиксировано на операциях чтения и записи блоками по 8K и 64K.
Практически все основные типы нагрузки ввода-вывода SQL Server получили выигрыш от этой оптимизации от 9 до 13%.
Отрицательный и близкий к нулю прирост производительности в таблице результатов тестов можно отнести к погрешностям измерений.
P.S.: Выражаю благодарность Александру Гладченко за оказание помощи методическими материалами.
Приложение 1
Командный файл:
1: sqlio -kW -s180 -frandom -o8 -b8 -LP -BN -Fparam.txt > WR-b8-LP-BN-F(2-0x0-2048).log 2: timeout /T 30 3: sqlio -kW -s180 -frandom -o8 -b64 -LP -BN -Fparam.txt > WR-b64-LP-BN-F(2-0x0-2048).log 4: timeout /T 30 5: sqlio -kW -s180 -frandom -o8 -b128 -LP -BN -Fparam.txt > WR-b128-LP-BN-F(2-0x0-2048).log 6: timeout /T 30 7: sqlio -kW -s180 -frandom -o8 -b256 -LP -BN -Fparam.txt > WR-b256-LP-BN-F(2-0x0-2048).log 8: timeout /T 30 9: sqlio -kW -s180 -frandom -o8 -b512 -LP -BN -Fparam.txt > WR-b512-LP-BN-F(2-0x0-2048).log 10: timeout /T 30 11: sqlio -kW -s180 -frandom -o8 -b1024 -LP -BN -Fparam.txt > WR-b1024-LP-BN-F(2-0x0-2048).log 12: timeout /T 30 sqlio -kW -s180 -fsequential -o8 -b8 -LP -BN -Fparam.txt > WS-b8-LP-BN-F(2-0x0-2048).log 13: timeout /T 30 14: sqlio -kW -s180 -fsequential -o8 -b64 -LP -BN -Fparam.txt > WS-b64-LP-BN-F(2-0x0-2048).log 15: timeout /T 30 16: sqlio -kW -s180 -fsequential -o8 -b128 -LP -BN -Fparam.txt > WS-b128-LP-BN-F(2-0x0-2048).log 17: timeout /T 30 18: sqlio -kW -s180 -fsequential -o8 -b256 -LP -BN -Fparam.txt > WS-b256-LP-BN-F(2-0x0-2048).log 19: timeout /T 30 20: sqlio -kW -s180 -fsequential -o8 -b512 -LP -BN -Fparam.txt > WS-b512-LP-BN-F(2-0x0-2048).log 21: timeout /T 30 22: sqlio -kW -s180 -fsequential -o8 -b1024 -LP -BN -Fparam.txt > WS-b1024-LP-BN-F(2-0x0-2048).log 23: timeout /T 30 sqlio -kR -s180 -frandom -o8 -b8 -LP -BN -Fparam.txt > RR-b8-LP-BN-F(2-0x0-2048).log 24: timeout /T 30 25: sqlio -kR -s180 -frandom -o8 -b64 -LP -BN -Fparam.txt > RR-b64-LP-BN-F(2-0x0-2048).log 26: timeout /T 30 27: sqlio -kR -s180 -frandom -o8 -b128 -LP -BN -Fparam.txt > RR-b128-LP-BN-F(2-0x0-2048).log 28: timeout /T 30 29: sqlio -kR -s180 -frandom -o8 -b256 -LP -BN -Fparam.txt > RR-b256-LP-BN-F(2-0x0-2048).log 30: timeout /T 30 31: sqlio -kR -s180 -frandom -o8 -b512 -LP -BN -Fparam.txt > RR-b512-LP-BN-F(2-0x0-2048).log 32: timeout /T 30 33: sqlio -kR -s180 -frandom -o8 -b1024 -LP -BN -Fparam.txt > RR-b1024-LP-BN-F(2-0x0-2048).log 34: timeout /T 30 sqlio -kR -s180 -fsequential -o8 -b8 -LP -BN -Fparam.txt > RS-b8-LP-BN-F(2-0x0-2048).log 35: timeout /T 30 36: sqlio -kR -s180 -fsequential -o8 -b64 -LP -BN -Fparam.txt > RS-b64-LP-BN-F(2-0x0-2048).log 37: timeout /T 30 38: sqlio -kR -s180 -fsequential -o8 -b128 -LP -BN -Fparam.txt > RS-b128-LP-BN-F(2-0x0-2048).log 39: timeout /T 30 40: sqlio -kR -s180 -fsequential -o8 -b256 -LP -BN -Fparam.txt > RS-b256-LP-BN-F(2-0x0-2048).log 41: timeout /T 30 42: sqlio -kR -s180 -fsequential -o8 -b512 -LP -BN -Fparam.txt > RS-b512-LP-BN-F(2-0x0-2048).log 43: timeout /T 30 44: sqlio -kR -s180 -fsequential -o8 -b1024 -LP -BN -Fparam.txt > RS-b1024-LP-BN-F(2-0x0-2048).log 45: ------------------------------------------ 46: 47: param.txt 48: ------------------------------------------ 49: T:\testfile.dat 2 0x0 2048 50: ------------------------------------------
Автор: Илгиз Мамышев