Обычно при обращении к файлу JFS запрос на ввод-вывод передается в буфер приложения, затем - приложению VMM, а затем - JFS. Содержимое буфера может храниться в оперативной памяти за счет того, что VMM применяет часть физической памяти в качестве кэша буферов файлов. Если число попаданий в кэш файлов велико, то кэшированный ввод-вывод позволяет значительно повысить производительность ввода-вывода в JFS. Однако если число попаданий невелико, либо приложение выполняет большое число операций ввод-вывода, то применение кэша не ускоряет обработку запросов на ввод-вывод. В операционной системе версии 4.3 и выше в качестве альтернативного способа ввода-вывода при работе с файлами JFS может применяться прозрачный ввод-вывод.
Операции прозрачного ввода-вывода могут применяться только по отношению к рабочим сегментам памяти программы (локальным файлам, расположенным в постоянной памяти). Основным преимуществом прозрачного ввода-вывода является то, что на выполнение операций чтения и записи файлов затрачивается меньше процессорного времени. Это связано с тем, что данные не копируются из кэша файлов VMM в пользовательский буфер. Если число попаданий в кэш невелико, то при выполнении большинства запросов на чтение происходит обращение к диску. Операции записи, как правило, выполняются быстрее с применением кэша. Однако если при открытии файла была указана опция O_SYNC или O_DSYNC (см. Применение вызовов sync/fsync), то при выполнении операций записи в обычном режиме происходит обращение к диску. В этом случае рекомендуется применять прозрачный ввод-вывод, при котором не выполняется копирование данных.
Кроме того, применение прозрачного ввода-вывода позволяет повысить эффективность использования кэша для других файлов. При чтении данных из файла или записи данных в файл этот файл помещается в кэш. При этом из кэша могут быть удалены другие файлы. Если разработчик приложения точно знает, к каким файлам невыгодно обращаться через кэш, то только эти файлы могут открываться с опцией O_DIRECT.
Для того чтобы операции прозрачного ввода-вывода выполнялись быстро, запрос на ввод-вывод должен соответствовать типу применяемой файловой системы. Функции finfo() и ffinfo() позволяют узнать смещение указателя, размер и способ выравнивания адресов, применяемые в файловой системе с фиксированным размером блока, фрагментированных файловых системах и файловых системах для больших файлов (прозрачный ввод-вывод не поддерживается для файловых систем со сжатием данных). Эта информация содержится в структуре diocapbuf, описанной в файле /usr/include/sys/finfo.h.
Если поступило сразу несколько запросов на открытие файла, но не во всех из них была задана опция O_DIRECT, то во избежание конфликтов для файла устанавливается обычный режим кэшированного ввода-вывода. Аналогично, если файл размещен в памяти с помощью системного вызова shmat() или mmap(), то для него будет установлен режим кэшированного ввода-вывода. После того как файл будет закрыт последним приложением, открывшим файл в обычном режиме ввода-вывода, JFS установит для файла режим прозрачного ввода-вывода (с помощью функции close(), munmap() или shmdt()). На переключение из обычного режима в режим прозрачного ввода-вывода затрачивается много ресурсов системы, так как все измененные страницы файла, находящиеся в оперативной памяти, должны быть выгружены на диск.
Прозрачный ввод-вывод не увеличивает скорость выполнения операций прямого ввода-вывода. Такие операции выполняются немного быстрее, чем операции прозрачного ввода-вывода, однако если вы хотите повысить производительность работы с JFS, то рекомендуется все же установить режим прозрачного ввода-вывода.
Хотя применение прозрачного ввода-вывода позволяет снизить нагрузку на процессор, операции ввода-вывода в таком режиме обычно выполняются дольше, особенно если считываются и записываются небольшие объемы данных. Это связано с тем, что результаты выполнения запросов не заносятся в кэш.
В режиме прозрачного ввода-вывода данные считываются с диска в синхронном режиме, тогда как в случае кэшированного ввода-вывода необходимые данные могут быть найдены в кэше. Следовательно, режим прозрачного ввода-вывода неэффективно применять для чтения данных, которые в обычном режиме с большой вероятностью находились бы в кэше. Кроме того, в режиме прозрачного ввода-вывода не применяется алгоритм упреждающего чтения VMM, так как запросы на ввод-вывод не передаются VMM. Алгоритм упреждающего чтения позволяет значительно повысить эффективность работы с файлами в режиме последовательного доступа к данным, так как VMM заранее считывает необходимые страницы с диска и загружает их в оперативную память. Компенсировать отсутствие функции упреждающего чтения можно следующими способами:
В режиме прозрачного ввода-вывода запросы на запись не передаются VMM. Вместо этого сразу же происходит обращение к диску. Это приводит к значительному увеличению времени выполнения операций записи, так как в режиме кэшированного ввода-вывода данные вначале записываются в оперативную память, а позднее выгружаются на диск (отложенная запись). Поскольку данные, записываемые в режиме прозрачного ввода-вывода, не копируются в оперативную память, при выполнении синхронизации не нужно выгружать соответствующие страницы памяти на диск. За счет этого сокращается объем работы, выполняемый демоном syncd.
В приведенном ниже примере приведены результаты измерений показателей
производительности в системе RS/6000 E30, 233 Мгц, с операционной системой AIX
4.3.1 (производительность зависит от конфигурации
системы). Кб/с означает число килобайт в секунду, а %CPU - показатель
использования процессора в процентах.
Число дисков SSA емкостью 2.2 Гб
Число адаптеров SSA PCI | 1
1 | 2
1 | 4
1 | 6
1 | 8
1 |
Скорость последовательного чтения в обычном режиме ввода-вывода | |||||
Кб/с | 7108 | 14170 | 18725 | 18519 | 17892 |
%CPU | 23.9 | 56.1 | 92.1 | 97.0 | 98.3 |
Скорость последовательного чтения в режиме прозрачного ввода-вывода | |||||
Кб/с | 7098 | 14150 | 22035 | 27588 | 30062 |
%CPU | 4.4 | 9.1 | 22.0 | 39.2 | 54.4 |
Скорость последовательного чтения в режиме прямого ввода-вывода | |||||
Кб/с | 7258 | 14499 | 28504 | 30946 | 32165 |
%CPU | 1.6 | 3.2 | 10.0 | 20.9 | 24.5 |
Для выполнения операций в режиме прозрачного ввода-вывода требуется значительно меньше процессорного времени, чем для выполнения операций в обычном режиме. Режим прозрачного ввода-вывода позволяет повысить эффективность работы приложений, выполняющих большое число операций ввода-вывода с низким уровнем попаданий в кэш в режиме обычного ввода-вывода. Ценность прозрачного ввода-вывода будет расти вместе с увеличением разрыва между скоростями работы процессора и памяти.
В каких программах имеет смысл применять режим прозрачного ввода-вывода? Прежде всего это программы, выполняющие большое число операций дискового ввода-вывода, которые медленно выполняются из-за нехватки ресурсов процессов. Кроме того, это могут быть "вычислительные" программы, выполняющие большое число операций ввода-вывода с последовательным доступом к данным. Режим прозрачного ввода-вывода не рекомендуется применять для приложений, считывающих и записывающих небольшие объемы данных, так как в этом режиме не применяются алгоритмы упреждающего чтения и отложенной записи. Режим прозрачного ввода-вывода может применяться и в приложениях, работающих с логическими томами с чередованием данных.