Управление памятью NIC и очереди RSS - PullRequest
4 голосов
/ 04 октября 2019

Я хочу понять, как NIC управляет памятью для кольцевых буферов.

Скажем, у меня Q очередей RSS размера N. Драйвер выделит в пространстве ядра Q кольцевых буферов пакетов размера N:

enter image description here

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

  1. Пакеты для очереди будут «съедать» всю память NIC, заставляя NIC отбрасывать пакеты для других очередей
  2. NIC прекращает прием пакетов дляочередь, когда он достигнет N пакетов, таким образом, остальные очереди останутся без изменений?

Спасибо

Ответы [ 2 ]

1 голос
/ 15 октября 2019

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

Как и в случае любого другого жесткого правила кодирования в оборудовании NIC, основным недостаткомRSS заключается в том, что ОС практически не влияет на распределение очередей для потоков.

Недостатки RSS можно преодолеть, используя более гибкие фильтры NIC или пытаясь разумно назначать очереди потокам с помощью программного обеспечения, запеченного в системном операторе.

На следующем рисунке ASCII-рисунка описано, как кольцо можетпозаботьтесь о том, чтобы аппаратные средства получили два пакета и доставили ОС прерывание:

    +--------------+ <----- OS Pointer
    | Descriptor 0 |
    +--------------+
    | Descriptor 1 |
    +--------------+ <----- Hardware Pointer
    | Descriptor 2 |
    +--------------+
    |     ...      |
    +--------------+
    | Descriptor n |
    +--------------+

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

    +--------------+
    | Descriptor 0 |
    +--------------+
    | Descriptor 1 |
    +--------------+ <----- Hardware Pointer, OS Pointer
    | Descriptor 2 |
    +--------------+
    |     ...      |
    +--------------+
    | Descriptor n |
    +--------------+

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

0 голосов
/ 13 октября 2019

не эксперт здесь, пользуясь возможностью немного узнать о том, как работают сетевые карты с более высокой производительностью. Этот вопрос, кажется, зависит от типа используемого сетевого адаптера и в меньшей степени от ядра (например, от того, как он настраивает оборудование). Документы Linux, которые я мог найти, казалось, ссылались на драйвер bnx2x, например, документы ядра , а также RHEL 6 документов . Тем не менее, я не мог найти много технических документов об этом NIC, и мне повезло больше с Intel, и я потратил некоторое время на просмотр документов X710

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...