Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
New API (также называемый NAPI) - это интерфейс для использования методов снижения прерываний для сетевых устройств в ядре Linux. Такой подход предназначен для уменьшения накладных расходов на прием пакетов. Идея состоит в том, чтобы отложить обработку входящих сообщений до тех пор, пока их не будет достаточно, чтобы их можно было обработать сразу.
New API (also referred to as NAPI) is an interface to use interrupt mitigation techniques for networking devices in the Linux kernel. Such an approach is intended to reduce the overhead of packet receiving. The idea is to defer incoming message handling until there is a sufficient amount of them so that it is worth handling them all at once.
Мотивация
Простой способ реализации сетевого драйвера - прерывать ядро, выпуская запрос на прерывание (IRQ) для каждого входящего пакета. Однако обслуживание IRQ является дорогостоящим с точки зрения ресурсов процессора и времени. Поэтому простая реализация может быть очень неэффективной в высокоскоростных сетях, постоянно прерывая ядро с тысячами пакетов в секунду. В результате может пострадать общая производительность системы, а также пропускная способность сети. Опрос - это альтернатива прерыванию обработки. Ядро может периодически проверять прибытие входящих сетевых пакетов без прерываний, что устраняет накладные расходы на обработку прерываний. Однако важно установить оптимальную частоту голосования. Слишком частое опрос тратит ресурсы процессора, многократно проверяя на наличие входящих пакетов, которые еще не прибыли. С другой стороны, опрос слишком редко вводит задержку, уменьшая реактивность системы к входящим пакетам, и это может привести к потере пакетов, если входящий буфер пакетов заполняется до обработки. В качестве компромисса, ядро Linux использует режим, управляемый прерыванием по умолчанию, и переключается на режим опроса только тогда, когда поток входящих пакетов превышает определенный порог, известный как "вес" сетевого интерфейса.
A straightforward method of implementing a network driver is to interrupt the kernel by issuing an interrupt request (IRQ) for each and every incoming packet. However, servicing IRQs is costly in terms of processor resources and time. Therefore, the straightforward implementation can be very inefficient in high speed networks, constantly interrupting the kernel with the thousands of packets per second. Overall performance of the system as well as network throughput can suffer as a result. Polling is an alternative to interrupt based processing. The kernel can periodically check for the arrival of incoming network packets without being interrupted, which eliminates the overhead of interrupt processing. Establishing an optimal polling frequency is important, however. Too frequent polling wastes CPU resources by repeatedly checking for incoming packets that have not yet arrived. On the other hand, polling too infrequently introduces latency by reducing system reactivity to incoming packets, and it may result in the loss of packets if the incoming packet buffer fills up before being processed. As a compromise, the Linux kernel uses the interrupt driven mode by default and only switches to polling mode when the flow of incoming packets exceeds a certain threshold, known as the "weight" of the network interface.
Преимущества
Нагрузка, вызванная прерываниями, уменьшается, даже если ядре приходится проводить опрос. Пакеты с меньшей вероятностью будут перезаказаны, в то время как обработка пакетов без заказа может быть узким местом в противном случае. В случае, если ядро не может обрабатывать все входящие пакеты, ядру не нужно выполнять никаких работ, чтобы их выбросить: они просто перезаписываются в входящем кольцевом буфере сетевой карты. Без NAPI ядро должно обрабатывать каждый входящий пакет независимо от того, есть ли время для обслуживания, что приводит к трещинам.
The load induced by interrupts is reduced even though the kernel has to poll. Packets are less likely to be re ordered, while out of order packet handling might be a bottleneck otherwise. In case the kernel is unable to handle all incoming packets, the kernel does not have to do any work in order to drop them: they are simply overwritten in the network card's incoming ring buffer. Without NAPI, the kernel has to handle every incoming packet regardless of whether there is time to service it, which leads to thrashing.
История
НАПИ - это более чем трехлетняя работа Алексея Кузнецова, Джамала Хади Салима и Роберта Олссона. Первоначальные усилия по включению NAPI встретили сопротивление со стороны некоторых членов сообщества, однако Дэвид Миллер упорно работал, чтобы обеспечить включение NAPI. Перед включением в сеть университета Уппсала было проведено много реальных испытаний. На самом деле, www. - Я не знаю. se была первой производственной ОС на базе NAPI и до сих пор используется на базе NAPI маршрутизаторами Bifrost/Linux. Генератор трафика pktgen также появился примерно в это время. Pktgen широко использовался для тестирования сценариев NAPI, не вызванных реальным мировым трафиком.
NAPI was an over three year effort by Alexey Kuznetsov, Jamal Hadi Salim and Robert Olsson. Initial effort to include NAPI was met with resistance by some members of the community, however David Miller worked hard to ensure NAPI's inclusion. A lot of real world testing was done in the Uppsala university network before inclusion. In fact, www. slu. se was the first production NAPI based OS and is still powered to this day by NAPI based Bifrost/Linux routers. The pktgen traffic generator was also born around this time. Pktgen was extensively used to test NAPI scenarios not induced by real world traffic.