Оценка требований к IO для пакетного использования

11

У нас есть приложение, которое периодически запрашивает базу данных SQL в течение дня. Есть периоды нулевой или только легкой активности, чередующиеся с индивидуальными запросами относительно больших объемов данных. Когда поступают эти запросы, основная цель состоит в быстрой доставке данных, а вторая задача - сделать это экономически эффективным. Из-за характера приложения весьма маловероятно, что данные / индексы будут кэшироваться в ОЗУ из предыдущего запроса (разные пользователи работают с разными частями данных).

Для системы, которая использует относительно устойчиво, я слышал эмпирическое правило, чтобы наблюдать за длиной очереди диска и сохранять это число относительно небольшим. Это в частности будет работать в AWS, где я видел практическое правило, что длина очереди диска 1 на 100 IOPS является разумной.

Как я могу оценить требования к IO для такой системы? Является ли длина очереди диска надежным показателем при работе с отдельными пакетными запросами? Есть ли другие метрики, которые я должен рассмотреть?

Эрик Дж.
источник
Происходят ли какие-либо записи, или это тяжело для чтения?
Джек говорит, попробуйте topanswers.xyz
@JackDouglas: это 98% читает. Есть струйка писем.
Эрик Дж.
1
Следующий вопрос: являются ли чтения разбросанными или ваши "индивидуальные запросы относительно больших объемов данных" могут выполнять последовательный ввод-вывод?
Джек говорит, попробуйте topanswers.xyz
@JackDouglas: наибольшее число чтений происходит через индексированное представление, так что предложение WHERE соответствует индексу, но возвращает больше данных, чем просто то, что находится в индексе. Я не уверен, что это означает для степени последовательного ввода-вывода. Поскольку базовой подсистемой ввода-вывода является AWS EBS, я не уверен, как это влияет на физический доступ.
Эрик Дж.
Базовая подсистема ввода-вывода будет влиять на согласованность производительности , но будет заботиться о распределенном и последовательном доступе аналогично локальному хранилищу. Эти большие чтения, сколько отдельных блоков они обычно бьют? Сканирование индекса само по себе будет последовательным, но доступ к таблице не будет, если я правильно вас понял.
Джек говорит, попробуйте topanswers.xyz

Ответы:

10

Основной показатель, который я всегда рассматривал для ввода-вывода в SQL Server, - это не количество операций ввода-вывода в секунду или длина очереди диска, а пропускная способность диска (с / чтений и с / записей). В целом, базы данных не о том, сколько операций вы можете выбросить на диск, а о том, как быстро эти операции завершаются. Общее эмпирическое правило - использовать менее 20 мс / операция (хотя чем ниже, тем лучше). Более подробно можно найти в этой статье .

Длина очереди диска является фиктивной статистикой и больше не актуальна. Проблема в том, что это значение измеряет очередь для одного диска, но теперь, когда мы живем в эпоху RAID, SAN и других распределенных хранилищ, нет способа правильно перевести это значение в значащее число. Отличной отправной точкой для определения показателей производительности является этот плакат от Quest / Dell, в котором вы найдете множество материалов и объяснений, почему они важны или нет. Вам не нужно использовать их все, но они являются началом.

Чтобы протестировать свой ввод-вывод, вы должны понимать свою рабочую нагрузку на пике. Сколько транзакций и сколько кешируется? Если вы не знаете и не измерили их, судить очень сложно. Вы можете создавать рабочие нагрузки и использовать такие инструменты, как SQLIO, для тестирования своего хранилища, но для построения правильного теста вам потребуются шаблоны рабочей нагрузки.

Наконец, примечание по AWS: насколько мне известно, Amazon не гарантирует производительность ввода-вывода в AWS. В первую очередь это связано с тем, что хранилище является крупным общим ресурсом, и невозможно измерить шаблоны вас и ваших соседей в определенной области хранилища (см. Проблему Noisy Neighbor ).

Я рекомендую выделить как можно больше памяти. SQL Server будет выталкивать из памяти только то, что находится под давлением и в буферном пуле (на основе LRU-K). Таким образом, если ваш буферный пул может хранить большую часть базы данных в памяти, вы можете уменьшить некоторую пиковую производительность. Кроме того, рассмотрите тактику, которая может сохранять объекты кэша «теплыми». Наконец, следите за SQL 2014 и новой функцией Hekaton .

Майк Фал
источник
«SQL Server будет выталкивать из памяти только то, что находится под давлением» или на контрольной точке ?
Джек говорит, попробуйте topanswers.xyz
5
Checkpoint не удаляет объекты из буфера, а записывает грязные страницы на диск для восстановления. Он по-прежнему будет поддерживать объекты в пуле буферов.
Майк Фал,
Спасибо за подробный ответ. В AWS теперь имеется расширенная функция, называемая Provisioned IOPS, которая гарантирует, что приобретенное количество операций ввода-вывода в секунду может выполняться в 99,9% случаев. Я думаю, что операция ввода-вывода определяется как чтение или запись блока данных 16 КБ.
Эрик Дж.
@MikeFal: Есть ли у вас какие-либо мысли о методологии тестирования специально для этого шаблона? Просто запустите один запрос и посмотрите счетчики? Выполнить несколько (обычно периодических) запросов один за другим, наблюдая за счетчиками?
Эрик Дж.
Да, я знаком с PIOPS. Как я заявляю, я не хочу знать, сколько операций можно выполнить, я хочу знать, насколько они быстры. И это не то, что может быть гарантировано AWS, даже на PIOP.
Майк Фал