Как я могу увеличить глубину очереди ввода / вывода, чтобы максимизировать производительность - PullRequest
0 голосов
/ 30 октября 2010

Тесты дисков обычно имеют диаграмму, которая показывает увеличение пропускной способности ввода-вывода при увеличении глубины очереди. Я предполагаю, что на аппаратном уровне происходит то, что контроллер диска переупорядочивает запросы так, чтобы они совпадали с магнитной головкой. Но как я могу увеличить глубину очереди в своем приложении с интенсивным вводом-выводом? Я буду использовать C #, но не зависящие от языка ответы, вероятно, также будут полезны.

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

1 Ответ

1 голос
/ 30 октября 2010

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

К сожалению, C # имеет ограниченную (встроенную) поддержку портов завершения - однако есть некоторые библиотеки с открытым исходным кодом , которые пытаются преодолеть этот пробел.

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

...