Ответ 1
Короткий ответ: Скорее всего, реализация AIO "быстрее", поскольку она подает несколько IO параллельно, в то время как синхронная реализация имеет либо нулевой, либо один ввод-вывод в полете. Он не имеет ничего общего с записью в память или с пуском ввода-вывода ядра, имеющим дополнительные накладные расходы для синхронных операций ввода-вывода.
Вы можете проверить это с помощью iostat -x -d 1. Посмотрите на avgqu-sz (средний размер очереди = среднее число входов/выходов в полете) и% util (использование = процент времени, в течение которого устройство был выпущен хотя бы один ввод-вывод).
Длинный ответ:
-
Концепция "быстрее" сложна при разговоре об I/O. "Быстрее" означает более высокую пропускную способность? Или это более низкая латентность? Или пропускная способность при заданном размере запроса? Или латентность на заданной глубине очереди? Или сочетание латентности, пропускной способности, размера запроса, глубины очереди и многих других параметров или рабочей нагрузки? Я предполагаю, что вы используете пропускную способность/пропускную способность, однако хорошо помнить, что производительность устройства хранения данных не является одной метрикой измерения.
-
SSD - это высокопараллельные устройства. SSD состоит из множества флеш-чипов, причем каждый чип имеет кратные матрицы, которые могут считывать/записывать независимо. SSD используют это и выполняют много операций ввода-вывода параллельно, без заметного увеличения времени отклика. Таким образом, с точки зрения пропускной способности, важно много параллельных операций ввода-вывода, которые видит SSD.
-
Позволяет понять, что происходит, когда поток отправляет синхронный ввод-вывод: а) поток проводит некоторые циклы ЦП, готовящие запрос ввода-вывода (генерирует данные, вычисляет смещение, копирует данные в буфер и т.д.), b) выполняется системный вызов (например, pread()), выполнение переходит в пространство ядра и блоки потока, c) запрос ввода-вывода обрабатывается ядром и пересекает различные уровни ввода/вывода ядра, d) Запрос ввода-вывода отправляется на устройство и проходит через межсоединение (например, PCIe), e) запрос ввода-вывода обрабатывается прошивкой SSD, f) фактическая команда считывания отправляется на соответствующую микросхему флэш-памяти, g) SSD контроллер ожидает данных, h) контроллер SSD получает данные из микросхемы флэш-памяти и отправляет их через межсоединение. В этот момент данные покидают SSD, и этапы e-a) происходят в обратном порядке.
-
Как вы можете видеть, синхронный процесс ввода-вывода воспроизводит запрос ping-pong с SSD. На многих этапах, описанных выше, данные не считываются из флеш-чипов. Кроме того, хотя ваш SSD может обрабатывать от нескольких десятков до сотен запросов параллельно, он видит не более одного запроса в любой момент времени. Поэтому пропускная способность очень-очень низкая, потому что вы на самом деле не используете SSD.
-
Асинхронный ввод-вывод помогает двумя способами: а) он позволяет процессу параллельно передавать несколько запросов ввода-вывода (для SSD требуется достаточно усилий для работы), и b) он позволяет конвейерные входы/выходы через различные этапы обработки (следовательно, время задержки развязки от пропускной способности).
-
Причина, по которой вы видите, что асинхронный ввод-вывод выполняется быстрее, чем синхронный ввод-вывод, заключается в том, что вы сравниваете яблоки и апельсины. Синхронная пропускная способность при заданном размере запроса, низкой глубине очереди и без конвейерной обработки. Асинхронная пропускная способность отличается от другого размера запроса, более высокой глубины очереди и конвейерной обработки. Номера, которые вы видели, не сопоставимы.
-
Большинство приложений интенсивного ввода-вывода (например, большинство приложений, таких как базы данных, веб-серверы и т.д.) имеют множество потоков, которые выполняют синхронный ввод-вывод. Хотя каждый поток может подавать не более одного ввода-вывода в любой момент времени, ядро и устройство SSD видят множество запросов ввода-вывода, которые могут обслуживаться параллельно. Несколько запросов синхронизации ввода-вывода приводят к тем же преимуществам, что и несколько запросов асинхронного ввода-вывода.
Основные различия между асинхронным и синхронным вводом-выводом сводятся к тому, как планирование ввода-вывода и процессов и модель программирования. Как асинхронный, так и синхронный ввод-вывод могут сжать один и тот же IOPS/пропускную способность с устройства хранения, если все сделано правильно.