Intel Optane: разрушая стереотипы

19 Апр 2017

Intel Optane: разрушая стереотипы

Во времена господства электромеханических устройств хранения дан­ных, влиянием вычислительной платформы на про­из­во­ди­тель­ность ди­сковых операций зачастую пренебрегали, поскольку глав­ные потери вре­ме­ни были обусловлены позиционированием маг­нит­ных головок и ожи­да­нием по­яв­ле­ния требуемого сектора. Стре­ми­тельная эволюция твер­до­тельных уст­ройств и появление, в част­но­сти, Intel Optane сделало дан­ный стереотип без­надежно ус­та­рев­шим.

 

Базовые теоретические сведения

Напомним, выполнение операции чтения или записи информации mass storage устройством состоит из сле­ду­ю­щих фаз:

  1. Передача команды от CPU к накопителю. Центральный процессор подготавливает в оперативной памяти командную информацию и данные, необходимые для выполнения команды устройством. После этого CPU запускает накопитель, циклом записи в его командный регистр.
  2. Выполнение команды. Данные передаются между накопителем и оперативной памятью в режиме bus master без участия центрального процессора.
  3. Передача статуса от устройства к CPU. После завершения выполнения команды, необходимо сообщить о ее результатах программному обеспечению, управляющему обменом информацией (драйверу). Как правило, для этого используется механизм аппаратных прерываний, подразумевающий асинхронный запуск процессором процедуры обработки события.

Пример упрощен и не учитывает формирование очередей из нескольких запросов.

IRQ vs MSI

Задолго до появления SSD, со времен перехода на стандарт Serial ATA и контроллер AHCI (Advanced Host Cont­rol­ler Interface), использование выделенных сигнальных линий (IRQ) для передачи запросов на прерывание перешло в статус антикварного решения. В современных системах применяются прерывания, передаваемые сообщениями или Message Signaled Interrupts (MSI). При этом устройство, инициирующее запрос, выполняет цикл записи в спе­ци­аль­ную область памяти, адресованный контроллеру Advanced Programmable Interrupt Controller (APIC).

Interrupts vs Polling

Сигнализация об асинхронных событиях (в нашем примере завершении выполнения дисковой операции) по­сред­ством запроса на прерывание является эффективным инструментом параллельного асинхронного выполнения ввода-вывода, поскольку центральный процессор избавлен от необходимости выполнять Polling, а именно пе­ри­о­ди­че­ски опрашивать устройство на предмет определения его готовности.

Недостатком является увеличение латентности (времени реакции на событие), поскольку обработка пре­ры­ва­ния является сравнительно долгой операцией. Ситуация усугубляется тем, что как правило, процедуры обработки прерываний выполняются кодом ядра ОС, а фоновая или прерываемая задача является пользовательским при­ло­же­ни­ем, поэтому переключение требует основательной перезагрузки контекста CPU.

Interrupts vs Polling в контексте Intel Optane

Сравним тайминги выполнения операции NVMe-накопителем для асинхронного режима с использованием пре­ры­ва­ний (interrupts) и синхронного режима, основанного на ожидании с циклическим опросом состояния (polling).


Рис.1. Диаграммы последовательностей событий при выполнения команд NVMe-уст­рой­ством, для асинхронного (interrupt, верхняя диаграмма) и синхронного (polling, нижняя диаграмма) режимов выполнения

Примечание: Значения оценочные для типовой современной платформы, пример взят из документа Рика Коул­сона (Rick Coulson) 3D XPoint Technology Drives System Architecture.

Для обеих диаграмм, пунктирная горизонтальная линия означает выполнение программы в режиме пользователя (Ring 3), сплошная линия означает выполнение в привилегированном режиме (Ring 0), второй вариант ис­поль­зу­ет­ся для процедуры обработки прерывания и низкоуровневых подпрограмм драйвера.

1) Верхняя диаграмма, асинхронный вариант с прерываниями.

Интервал Ta' отсчитывается от входа в подпрограмму драйвера до передачи команды NVMe-устройству. Спустя интервал Tb, процессор освобождается для выполнения фоновых задач и управление возвращается в про­стран­ство пользователя, свободного времени на это в данном примере около 2.7 микросекунды. Затем, NVMe-уст­рой­ство, завершив выполнение операции, генерирует запрос на прерывание, обработка которого выполняется в ин­тер­ва­ле Ta''. После этого, управление снова возвращается в пространство пользователя, операция завершена.

2) Нижняя диаграмма, синхронный вариант с циклическим опросом готовности. В этом случае операция выполняется быстрее, но без возможности параллельной обработки фоновой задачи.

Этот вариант предельно прост, здесь отсутствует асинхронный запуск процедур а количество переключений меж­ду пространствами пользователя и ядра минимально (только при входе и выходе из подпрограммы драйвера, точ­ки System call, Return to user). Запустив операцию на устройстве, драйвер начинает циклический опрос (ин­тер­вал Polling), через 2.9 микросекунд бит готовности устанавливается, процессор выходит из цикла ожидания, про­це­ду­ра завершается.

Резюме

Согласно документу, синхронный режим выполнения команды накопителем с программным циклом ожидания готовности устройства, в данном примере обеспечил меньшую латентность (4.4 микросекунды против 9.0). Кроме того, преимущество параллелизма, присущее асинхронному выполнению, уменьшается пропорционально снижению латентности устройства, поскольку в случае быстрого ответа накопителя, уменьшается количество ра­бо­ты, которую можно выполнить за время ожидания запроса на прерывание.

На основании сказанного, разработчикам драйверов можно порекомендовать проанализировать возможность использования синхронного режима для обработки одиночных запросов к NVMe-устройству при выполнении операций с не­большими блоками типовым размером 4 килобайта, особенно в случаях, когда минимизация времени об­ра­бот­ки заданного запроса важнее, чем возможность параллельного выполнения других задач в ожидании его ре­зуль­та­та.

Теги: