введение
Стандартный интерфейс ввода-вывода традиционной операционной системы Linux основан на операциях копирования данных, то есть операции ввода-вывода вызывают передачу данных между буфером в адресном пространстве ядра операционной системы и буфером, определенным в адресном пространстве приложения. . Самым большим преимуществом этого является сокращение операций ввода-вывода с диском, потому что, если запрошенные данные уже находятся в кэше операционной системы, то фактические операции ввода-вывода на физическом диске не требуются. Однако операция копирования данных в процессе передачи данных приводит к огромным накладным расходам ЦП, что ограничивает способность операционной системы эффективно выполнять операции передачи данных.
Нулевое копирование (zero-copy)Эта технология позволяет эффективно повысить производительность передачи данных.Когда драйвер ядра (например, сетевой стек или драйвер дискового хранилища) обрабатывает данные ввода-вывода, технология нулевого копирования может использоваться для Сократите или даже полностью избегайте ненужных операций копирования данных ЦП. Современные архитектуры процессоров и систем хранения предоставляют множество функций для эффективной реализации технологии нулевого копирования, но поскольку архитектура хранения очень сложна, а стек сетевых протоколов иногда должен выполнять необходимую обработку данных, технология нулевого копирования может иметь много негативных последствий. Воздействие технологии нулевого копирования приведет даже к полной утрате преимуществ самой технологии нулевого копирования.
Зачем нужна технология нулевого копирования
Сегодня многие веб-серверы основаны на модели клиент-сервер. В этой модели клиент запрашивает данные или услуги с сервера, сервер должен ответить на запрос клиента и предоставить клиенту необходимые ему данные. С ростом популярности сетевых сервисов быстро росли такие приложения, как видео. Современные компьютерные системы имеют достаточную мощность, чтобы справляться с большой нагрузкой, вызванной такими приложениями, как видео, на стороне клиента, но на стороне сервера она слишком растянута, чтобы справляться с сетевым трафиком, вызванным такими приложениями, как видео. Более того, количество клиентов быстро растет, поэтому серверная часть, скорее всего, станет узким местом в производительности. Для сильно загруженных серверов операционная система часто является узким местом в производительности. Например, когда выдается системный вызов для операции «записи» данных или операции «отправки» данных, операционная система обычно копирует данные из буфера адресного пространства приложения в буфер ядра операционной системы. Преимущество операционной системы в том, что интерфейс прост, но сильно теряет производительность системы, потому что эта операция копирования данных не только должна занимать квант времени процессора, но и должна занимать дополнительную пропускную способность памяти.
Вообще говоря, клиент отправляет запросы на сервер через сетевую карту, операционная система передает эти клиентские запросы серверному приложению, а серверное приложение обрабатывает эти запросы.После завершения обработки запроса операционной системе также необходимо обработать Полученный результат передается обратно через сетевой адаптер.
В следующем разделе читателю будет кратко представлено, как традиционный сервер выполняет передачу данных, и какие проблемы существуют при обработке этой передачи данных, которые могут привести к снижению производительности сервера.
Процесс передачи данных на традиционных серверах в Linux
Традиционной операцией ввода-вывода в Linux является буферизованный ввод-вывод, а передача данных, генерируемая в процессе ввода-вывода, обычно требует нескольких операций копирования в буфер. Вообще говоря, при передаче данных пользовательское приложение должно выделить буфер подходящего размера для хранения передаваемых данных. Приложение считывает часть данных из файла и отправляет часть данных по сети получателю. Пользовательскому приложению достаточно вызвать два системных вызова read() и write() для завершения операции передачи данных.Прикладная программа не знает операцию копирования данных, выполняемую операционной системой во время передачи данных. Для операционной системы Linux, в зависимости от различных факторов, таких как сортировка или проверка данных, ядро операционной системы будет выполнять несколько операций копирования во время передачи данных. В некоторых случаях эти операции копирования данных могут значительно снизить производительность передачи данных.
Когда приложению требуется доступ к определенному фрагменту данных, ядро операционной системы сначала проверяет, был ли этот фрагмент данных сохранен в буфере адресного пространства ядра операционной системы из-за предыдущего доступа к тому же файлу. данных не может быть найдено в операционной системе Linux, ядро операционной системы Linux сначала прочитает этот фрагмент данных с диска и поместит его в буфер ядра операционной системы. Если эта операция чтения данных завершается DMA, то в процессе чтения данных DMA ЦП нужно только управлять буфером, а также создавать и обрабатывать DMA.Кроме того, ЦП больше не нужно делать. После того, как DMA закончит чтение данных, он уведомит операционную систему о дальнейшей обработке. Операционная система Linux сохранит эту часть данных в адресном пространстве приложения, запрашивающего эту часть данных, в соответствии с адресом адресного пространства приложения, указанным системным вызовом read().И снова данные копируются из буфера в адресное пространство пользовательского приложения в буфер ядра, связанный с сетевым стеком, который также интенсивно использует ЦП. После завершения операции копирования данные будут упакованы и отправлены на сетевую карту. В процессе передачи данных приложение может вернуться для выполнения других операций. После этого, когда вызывается системный вызов write(), содержимое данных в буфере пользовательского приложения может быть безопасно удалено или изменено, поскольку операционная система сохранила копию данных в буфере ядра, когда данные будут успешно переданы. Оказавшись на оборудовании, эта копия данных может быть удалена.
Как видно из приведенного выше описания, в этом традиционном процессе передачи данных данные копируются не менее четырех раз.Даже если для связи с оборудованием используется DMA, ЦП все равно должен получить доступ к данным дважды. В процессе чтения данных функцией read() данные не поступают напрямую с жесткого диска, а должны сначала пройти через уровень файловой системы операционной системы. В процессе записи данных с помощью write(), чтобы соответствовать размеру передаваемого пакета данных, данные должны быть предварительно разделены на блоки, заголовок пакета должен быть просчитан заранее, а операция контрольной суммы данных должна быть выполнено.
Рис. 1. Традиционная передача данных с использованием системных вызовов чтения и записи
Обзор технологии нулевого копирования
Что такое нулевая копия?
Проще говоря, нулевое копирование — это метод, который не позволяет ЦП копировать данные из одной части хранилища в другую. Различные технологии нулевого копирования для драйверов устройств, файловых систем и стеков сетевых протоколов в операционных системах значительно повысили производительность некоторых приложений и позволили этим приложениям более эффективно использовать системные ресурсы. Это улучшение производительности достигается за счет того, что ЦП позволяет выполнять другие задачи во время копирования данных. Технология нулевого копирования может уменьшить количество копий данных и операций с общей шиной, а также устранить ненужное количество промежуточных копий передаваемых данных между памятью, тем самым эффективно повышая эффективность передачи данных. Кроме того, технология нулевого копирования снижает нагрузку, вызванную переключением контекста между адресным пространством пользовательского приложения и адресным пространством ядра операционной системы. Выполнение большого количества операций копирования данных на самом деле является простой задачей.С точки зрения операционной системы, если ЦП всегда занят для выполнения этой простой задачи, это будет пустой тратой ресурсов; если есть другие сравнения Простые системные компоненты может сделать это за вас, освобождая ЦП для других задач, и использование системных ресурсов будет более эффективным. Таким образом, цели технологии нулевого копирования можно резюмировать следующим образом:
Избегайте копирования данных
- Избегайте операций копирования данных между буферами ядра операционной системы.
- Избегайте операций копирования данных между ядром операционной системы и адресным пространством пользовательского приложения.
- Пользовательские приложения могут обращаться к аппаратному хранилищу напрямую, минуя операционную систему.
- Передача данных должна осуществляться по DMA, насколько это возможно.
Объединение нескольких операций вместе
- Избегайте ненужных системных вызовов и переключений контекста.
- Данные, которые необходимо скопировать, можно предварительно кэшировать.
- Пусть аппаратное обеспечение выполняет обработку данных в максимально возможной степени.
Как упоминалось ранее, технология нулевого копирования очень важна для высокоскоростных сетей. Это связано с тем, что пропускная способность сетевого канала высокоскоростной сети близка к вычислительной мощности ЦП или даже превышает вычислительную мощность ЦП. Если это так, то ЦП может тратить почти все свое время на копирование данных для передачи и не иметь возможности делать что-либо еще, что создает узкое место в производительности, ограничивает скорость связи и, таким образом, снижает способность сетевого соединения. . Как правило, за один такт ЦП можно обработать один бит данных. Например, процессор с частотой 1 ГГц может выполнять традиционные операции копирования данных в сетевом канале со скоростью 1 Гбит/с, но если это сеть со скоростью 10 Гбит/с, то для того же процессора становится очень важной технология нулевого копирования. Для сетевых соединений со скоростью более 1 Гбит/с технология нулевого копирования используется в кластерах суперкомпьютеров, а также в крупных коммерческих центрах обработки данных. Однако с развитием информационных технологий сети 1 Гбит/с, 10 Гбит/с и 100 Гбит/с будут становиться все более и более популярными, поэтому технология нулевого копирования также будет становиться все более и более популярной, поскольку сетевые соединения Обработка мощность растет намного быстрее, чем вычислительная мощность процессора. Традиционное копирование данных ограничено традиционными операционными системами или коммуникационными протоколами, которые ограничивают скорость передачи данных. Технология нулевого копирования может эффективно уменьшить задержку связи и повысить пропускную способность сети за счет уменьшения количества копий данных, упрощения уровня обработки протоколов и предоставления более быстрых методов передачи данных между приложениями и сетью. Технология Zero-copy — одна из основных технологий реализации высокоскоростных сетевых интерфейсов таких устройств, как хосты или маршрутизаторы.
Современные архитектуры ЦП и СХД предоставляют множество связанных функций, позволяющих уменьшить или избежать ненужных операций копирования данных ЦП во время операций ввода-вывода, но это преимущество архитектур ЦП и СХД часто переоценивается. Сложность архитектуры хранения и необходимая передача данных в сетевых протоколах могут создавать проблемы, иногда приводящие к полной потере преимуществ технологии нулевого копирования. В следующей главе мы представим несколько технологий нулевого копирования, появившихся в операционной системе Linux, кратко опишем методы их реализации и проанализируем их слабые места.
Классификация технологий нулевого копирования
Развитие технологии нулевого копирования очень разнообразно, и существует много типов существующих технологий нулевого копирования, но в настоящее время не существует технологии нулевого копирования, подходящей для всех сценариев. Для Linux существует множество технологий с нулевым копированием.Большинство из этих технологий с нулевым копированием существуют в разных версиях ядра Linux.Некоторые старые технологии были значительно усовершенствованы между разными версиями ядра Linux или были постепенно заменены новыми технологиями. В этой статье эти технологии нулевого копирования разделены на разные сценарии, для которых они применимы. Подводя итог, можно сказать, что технологии нулевого копирования в Linux в основном включают следующее:
- Прямой ввод-вывод: для этого метода передачи данных прикладная программа может напрямую обращаться к аппаратному хранилищу, а ядро операционной системы только помогает в передаче данных: этот тип технологии нулевого копирования нацелен на ядро операционной системы, которому не требуется для непосредственной обработки данных.В этом случае данные могут передаваться напрямую между буфером в адресном пространстве приложения и диском, без поддержки кэша страниц, предоставляемого ядром операционной системы Linux.
- В процессе передачи данных следует избегать копирования данных между буфером в адресном пространстве ядра операционной системы и буфером в адресном пространстве пользовательского приложения. Иногда приложению не требуется доступ к данным в процессе передачи данных, тогда можно полностью избежать копирования данных из кеша страниц Linux в буфер пользовательского процесса.Переданные данные сохраняются в кеше страниц. обработанный. В некоторых особых случаях эта технология нулевого копирования может обеспечить более высокую производительность. Аналогичные системные вызовы в Linux в основном включают mmap(), sendfile() и splice().
- Оптимизируйте передачу данных между кэшем страниц Linux и буферами пользовательских процессов. Эта технология нулевого копирования ориентирована на гибкую обработку операций копирования данных между буфером пользовательского процесса и кэшем страниц операционной системы. Этот метод продолжает традиционный способ общения, но является более гибким. В Linux этот метод в основном использует метод копирования при записи.
Цель первых двух типов методов в основном состоит в том, чтобы избежать операций буферного копирования между адресным пространством приложения и адресным пространством ядра операционной системы. Эти два типа технологий нулевого копирования обычно применимы в некоторых особых случаях, например, передаваемые данные не нуждаются в обработке ядром операционной системы или прикладной программой. Третий тип метода наследует традиционную концепцию передачи данных между адресным пространством приложения и адресным пространством ядра операционной системы, а затем оптимизирует саму передачу данных. Мы знаем, что передача данных между аппаратным и программным обеспечением может осуществляться с использованием DMA, а DMA вряд ли требует участия ЦП в процессе передачи данных, так что ЦП может быть освобожден для выполнения большего количества других дел, но когда данные При передаче между буфером пользовательского адресного пространства и кэшем страниц ядра операционной системы Linux нет такого инструмента, как DMA , который можно было бы использовать, и ЦП должен участвовать в этой операции копирования данных на всем протяжении, поэтому этот третий тип метода Цель состоит в том, чтобы эффективно повысить эффективность передачи данных между пользовательским адресным пространством и адресным пространством ядра операционной системы.