Sunday, July 22, 2018

Oracle Async и Direct I/O.

На написание этой статьи меня сподвигла тема на одном из форумов Oracle, в который всплыли очередные мифы о возможностях direct и async, их скорости и возможной потери данных в БД.

На эту тему есть старенькая, но отличная статья (на английском): http://mgogala.byethost5.com/directio.pdf?i=2

Рассмотрим ее основные положения.

В обычном режиме Unix disk IO операции выглядят, так:




Т.е. когда используется обычный системный вызов на чтение, данные с диска не отправляются напрямую в user buffer, Unix «вставляет» свой buffer между user buffer и диском. Соответственно, Oracle БД, когда читает из файла, блок сначала помещается в буфер ОС. Это дает ОС возможность кэшировать и распределять общие данные между процессами. Буфер ОС не доступен напрямую из пользовательского кода – это внутренний системный инструмент. При том, вы наверняка знаете, он разделяется на область ядра (kernel space) и пользовательскую (user space). Как именно это разделение происходит зависит от конкретной реализации архитектуры ОС.