Едно от най-често срещаните затруднения в производителността, които виждам като консултант, е неадекватната производителност на подсистемата за съхранение. Има редица причини за лошото представяне на съхранение, но измерването му и разбирането на това какво трябва да се измерва и наблюдава винаги е полезно упражнение.
Всъщност има три основни показатели, които са най-важни, когато става въпрос за измерване на производителността на I/O подсистемата:
Закъснение
Първият показател е латентността, което е просто времето, необходимо за завършване на I/O. Това често се нарича време за реакция или време за обслужване. Измерването започва, когато операционната система изпрати заявка до устройството (или дисковия контролер) и завършва, когато устройството завърши обработката на заявката. Четенията са завършени, когато операционната система получи данните, докато записите са завършени, когато устройството информира операционната система, че е получило данните.
При записвания данните може да са все още в DRAM кеш на устройството или дисковия контролер, в зависимост от вашата политика за кеширане и хардуер. Кеширането с обратно записване е много по-бързо от кеширането чрез запис, но изисква резервно копие на батерията за дисковия контролер. За използване на SQL Server искате да сте сигурни, че използвате кеширане с обратно записване, а не чрез кеширане на запис, ако изобщо е възможно. Също така искате да се уверите, че вашият хардуерен дисков кеш е действително активиран, тъй като някои инструменти за управление на дискове на доставчик го деактивират по подразбиране.
Входно/изходни операции в секунда (IOPS)
Вторият показател е входно/изходни операции в секунда (IOPS). Този показател е пряко свързан с латентността. Например, постоянна латентност от 1 ms означава, че устройството може да обработи 1000 IOs в секунда с дълбочина на опашката 1. Тъй като към опашката се добавят повече IO, латентността ще се увеличи. Едно от основните предимства на флаш паметта е, че може да чете/записва на множество NAND канали паралелно, заедно с факта, че няма електромеханични движещи се части, които да забавят достъпа до диска. IOPS всъщност е равен на дълбочината на опашката, разделена на латентността, а IOPS сам по себе си не отчита размера на трансфера за прехвърляне на отделен диск. Можете да превеждате IOPS в MB/sec и MB/sec в латентност, стига да знаете дълбочината на опашката и размера на трансфера.
Последователна пропускателна способност
Последователната пропускателна способност е скоростта, с която можете да прехвърляте данни, обикновено измерена в мегабайти в секунда (MB/sec) или гигабайти в секунда (GB/sec). Вашият последователен показател за пропускателна способност в MB/sec е равен на IOPS, умножен на размера на трансфера. Например, 556 MB/sec се равняват на 135 759 IOPS по 4096 байта за прехвърляне, докато 135 759 IOPS по размер на прехвърляне от 8192 байта ще бъдат 1112 MB/sec последователна пропускателна способност. Въпреки ежедневната си важност за SQL Server, последователната дискова пропускателна способност често се променя в корпоративното хранилище, както от доставчиците на хранилища, така и от администраторите на хранилища. Също така всъщност е доста често срещано явление да виждате действителните магнитни дискове в кутия с директно прикачено съхранение (DAS) или устройство в мрежа за съхранение (SAN) да са толкова заети, че не могат да осигурят пълната си номинална последователна пропускателна способност.
Последователната пропускателна способност е от решаващо значение за много често срещани сървърни дейности на базата данни, включително пълно архивиране и възстановяване на база данни, създаване и възстановяване на индекси и последователни сканирания от тип хранилище за данни (когато вашите данни не се вписват в буферния пул на SQL Server). Една цел за производителност, за която обичам да стрелям при нови компилации на сървър на база данни, е да имам поне 1 GB/sec последователна пропускателна способност за всяка отделна буква на устройството или точка на монтиране. Притежаването на това ниво на производителност (или по-добро) прави живота ви много по-лесен като професионалист по база данни. Това прави толкова много от общите ви задачи по база данни много по-бързи, а също така ви дава свободата да правите по-честа настройка на индекса, когато можете да създадете индекс на голяма таблица за секунди или минути вместо часове.
Показатели за работното натоварване за вход/изход на SQL сървър
Когато става въпрос за SQL Server и I/O производителност, има редица неща, които трябва да измервате и наблюдавате във времето. Трябва да знаете съотношението четене спрямо запис за вашето работно натоварване за всички ваши файлове с потребителска база данни и за tempdb. Съотношенията ще бъдат различни за различните типове файлове на SQL Server и работни натоварвания. Можете да използвате моите DMV Diagnostic Queries, за да определите това, и можете също да използвате изгледа на Disk Activity View в SQL Sentry Performance Advisor, за да получите лесно по-пълна представа за вашата дискова активност, от цялостна картина на високо ниво, чак надолу към отделни файлове:
Съветник за производителност на SQL Sentry:Дискова активност
Трябва също да измервате типичните I/O скорости за IOPS и последователната пропускателна способност. В монитора на производителността на Windows (PerfMon), четене/сек и запис/сек показват IOPS, докато байтовете за четене на диска/сек и записването на диска представляват последователна пропускателна способност. Трябва да използвате PerfMon за измерване на средна дискова секунда/четене и средна дискова секунда/запис, която е латентност за четене и запис на ниво диск. И накрая, можете да използвате моите DMV Diagnostic Queries, за да измерите средната латентност за четене и запис на ниво файл за всички ваши файлове с потребителска база данни, както и за tempdb.
Методи за измерване на I/O производителността
Можете да използвате секцията Disk в Windows Resource Monitor, за да получите бърз преглед в реално време на някои ключови показатели на диска за всичките ви файлове на база данни на SQL Server. Отивайки по-дълбоко, можете да използвате PerfMon за измерване и наблюдение на критичните броячи на производителност, които споменах по-рано. Преди да влезете в производството с нов сървър на база данни, трябва да направите някои тестове за сравнителен тест на диска, за да определите каква производителност може действително да осигури вашата I/O подсистема. Това всъщност не е толкова трудно или отнема много време (ако използвате правилните инструменти), но често се забравя, когато бъде осигурен и тестван нов сървър на база данни.
Първият бенчмарк на диска, който винаги трябва да изпълнявате, е CrystalDiskMark 4.0, който наскоро беше пренаписан, за да използва сравнително новата програма за сравнително тестване на дискове Microsoft DiskSpd. Потребителският интерфейс на CDM 4.0 ви позволява да избирате по-широк набор от размери на тестови файлове и също така ви позволява да избирате дълбочината на опашката и броя на нишките за тестовите стартирания. Това ви позволява да получите по-подобно на сървъра I/O работно натоварване и също така ви позволява по-правилно да стресирате по-новите NVMe флаш устройства за съхранение, които могат да се справят с дълбочини на опашката над 32.
CrystalDiskMark 4.03 Резултати с QD =32 и нишки =1
Фигура 2:CrystalDiskMark 4.03 Резултати с QD =32 и нишки =4
За разлика от предишните версии на CDM, двата най-подходящи реда за използване на SQL Server са в средата на дисплея на резултатите. Те са 4K произволно четене и запис с голяма дълбочина на опашката (32 по подразбиране) и последователното четене и запис. След като направите някои сравнителни тестове за съхранение с CrystalDiskMark 4.0, трябва да направите някои по-изчерпателни тестове с Microsoft DiskSpd. В една бъдеща статия ще разгледам как да използвам DiskSpd за по-пълно тестване за SQL Server.