Почему нулевое копирование улучшает производительность Kafka?

Kafka

из операционной системы

Компьютерная система состоит из двух частей: «аппаратного обеспечения» и «программного обеспечения». Компьютерное оборудование включает в себя один или несколько процессоров (ЦП), память, клавиатуру, дисплей, диск, интерфейс ввода-вывода и другие периферийные устройства, такие как принтеры, графические Инструмент и так далее. Короче говоря, аппаратная часть компьютера представляет собой аппаратную систему, состоящую из различных электронных и механических устройств.

Для того чтобы людям было удобно и правильно пользоваться этими устройствами, необходимо написать несколько программ для управления этими устройствами, и именно эти программы составляют программный комплекс компьютера. Программное обеспечение также можно разделить на две категории: системное программное обеспечение и прикладное программное обеспечение. Люди сначала напрямую загружают слой программ на аппаратное обеспечение, используют его для управления всем аппаратным оборудованием компьютера и некоторыми программными информационными ресурсами, а также предоставляют пользователям среду для разработки прикладных программ, которая представляет собой программное обеспечение операционной системы и служебное программное обеспечение. Прикладное программное обеспечение представляет собой множество прикладных программ, скомпилированных для достижения требований пользователя при поддержке операционной системы.

Основное устройство, состоящее из ЦП, памяти и интерфейса ввода-вывода, обычно называется хостом, а хост без операционной системы называется «голым железом». Интерфейс между «голым железом» и программным обеспечением операционной системы состоит из системы инструкций ЦП и системной BIOS, предоставленной производителем.

Поскольку операционная система скрывает аппаратные устройства, используемые системой, от пользователя, операционная система должна предоставить набор команд или интерфейсов системных вызовов для прикладного системного программного обеспечения, которое может использовать пользовательская программа. Например, нам нужно использовать диск, что можно сделать косвенно с помощью системного именования или системных вызовов, без необходимости вручную писать драйвер дискового устройства. Поэтому для пользователя, когда компьютер загружает операционную систему, пользователь не имеет прямого отношения к компьютерному оборудованию, а использует компьютер, используя команды и функциональные области, предоставляемые операционной системой.

Поскольку операционная система занимает центральное место среди аппаратного и программного обеспечения, некоторые люди долгое время считали операционную систему ядром программного обеспечения компьютерной системы, сокращенноосновнойилиядро.

Режим ядра и пользовательский режим

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

Когда процессор работает в пользовательском режиме, могут выполняться только общие инструкции, а привилегированные инструкции не допускаются. Это защищает основной код от преднамеренных и непреднамеренных атак со стороны пользовательских программ. Очевидно, процессору необходимо переключаться между режимом ядра и режимом пользователя во время работы.

нулевая копия

Kafka использует технологию нулевого копирования (Zero-Copy) для обеспечения своей производительности.Так называемое нулевое копирование означает копирование данных непосредственно с диска на устройство сетевой карты, минуя руки приложения, что снижает сложность между режим ядра и пользовательский режим Переключение контекста между технологией нулевого копирования реализовано с помощью технологии прямого доступа к памяти.

Прямой доступ к памяти (DMA) Метод управления DMA ориентирован на память, устанавливает прямой путь между основной памятью и устройством ввода-вывода и осуществляет обмен данными между устройством и основной памятью под управлением контроллера DMA. Этот метод требует вмешательства ЦП только в начале и в конце передачи. Он идеально подходит для передачи больших объемов данных между высокоскоростными устройствами и основной памятью.

Давайте рассмотрим такой сценарий:

Когда клиент инициирует запрос в браузере на получение контента, что происходит, когда он видит определенный контент?

Во-первых, после того, как запрос проанализирован, он выполняется из пользовательского режима в основной режим через системный вызов.В основном режиме код протокола TCP/IP в операционной системе и драйвер сетевой карты управляют сетевой картой для отправки запрос в соответствующую сеть. Дождитесь ответа веб-сервера. Когда сервер возвращается, он принимается сетевой картой и передается клиентской программе через ядро.

На стороне сервера ядро ​​принимает веб-запросы из сети через сетевую карту и передает их веб-серверу через системные вызовы. Веб-сервер выполняет соответствующий сервисный процесс в соответствии с сервисным запросом, а ядро ​​отправляет результат в сеть пользователю.

Как видно из рисунка выше, если сервер прошел следующие 4 процесса от подготовки данных до отправки данных.

  1. При вызове read() скопируйте содержимое файла в буфер чтения в режиме ядра.
  2. ЦП управляет копированием данных режима ядра в пользовательский режим.
  3. При вызове send() содержимое в пользовательском режиме копируется в Socket Buffer в режиме ядра.
  4. Скопируйте данные Socket Buffer в режиме ядра на устройство сетевой карты для отправки.

Из приведенного выше процесса видно, что данные сначала копируются из режима ядра --> пользовательского режима --> режима ядра, что приводит к трате двух процессов копирования: первый раз - из режима ядра в пользовательский режим; второй раз - из режима ядра. пользовательский режим Затем скопируйте обратно в режим ядра, и в описанном выше процессе контекст переключается между режимом ядра и пользовательским режимом также 4 раза.

Если используется технология нулевого копирования, приложение может напрямую запросить у ядра передачу данных с диска в сокет.

Технология нулевого копирования копирует содержимое файла в буфер чтения в режиме ядра с помощью технологии прямого доступа к памяти. Однако никакие данные не копируются в буфер сокета, в буфер сокета добавляется только дескриптор файла, содержащий информацию о расположении и длине данных. Механизм прямого доступа к памяти передает данные непосредственно из режима ядра на устройство NIC. Тут переключение контекста стало 2 раза, а с диска перенеслось только через 2 процесса копирования.