Настройка сетевой подсистемы с помощью netutils

    Настройка сетевой подсистемы с помощью netutils

    Установка

    apt install python-pip
    pip install netutils-linux
    

    network-top

    Image

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

    rss-ladder

    # rss-ladder eth1 0
    - distributing interrupts of eth1 (-TxRx) on socket 0:"
      - eth1: irq 67 eth1-TxRx-0 -> 0
      - eth1: irq 68 eth1-TxRx-1 -> 1
      - eth1: irq 69 eth1-TxRx-2 -> 2
      - eth1: irq 70 eth1-TxRx-3 -> 3
      - eth1: irq 71 eth1-TxRx-4 -> 8
      - eth1: irq 72 eth1-TxRx-5 -> 9
      - eth1: irq 73 eth1-TxRx-6 -> 10
      - eth1: irq 74 eth1-TxRx-7 -> 11
    

    Эта утилита распределяет прерывания сетевой карты на ядра выбранного физического процессора (по умолчанию на нулевой).

    server-info

    # server-info --rate
    cpu:
      BogoMIPS: 7
      CPU MHz: 7
      CPU(s): 1
      Core(s) per socket: 1
      L3 cache: 1
      Socket(s): 10
      Thread(s) per core: 10
      Vendor ID: 10
     disk:
       vda:
         size: 1
         type: 1
     memory:
       MemTotal: 1
       SwapTotal: 10
     net:
       eth1:
         buffers:
           cur: 5
           max: 10
         driver: 1
         queues: 1
     system:
       Hypervisor vendor: 1
       Virtualization type: 1
    

    Данная утилита позволяет сделать две вещи:

    server-info --show: посмотреть, что за оборудование установлено в сервере. В целом похоже на lshw, но с акцентом на интересующие нас параметры.

    server-info --rate: найти узкие места в аппаратном обеспечении сервера. В целом похоже на индекс производительности Windows, но с акцентом на интересующие нас параметры. Оценка производится по шкале от 1 до 10.

    Прочие утилиты

    rx-buffers-increase eth1 
    

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

    maximize-cpu-freq
    

    отключает плавающую частоту процессора.

    Примеры использования:

    Пример 1. Максимально простой.

    Дано:

    один процессор с 4 ядрами.
    одна 1 Гбит/сек сетевая карта (eth0) с 4 combined очередями
    входящий объём трафика 600 Мбит/сек, исходящего нет.
    все очереди висят на CPU0, суммарно на нём ?55000 прерываний и 350000 пакетов в секунду, из них около 200 пакетов/сек теряются сетевой картой. Остальные 3 ядра простаивают

    Решение:

    распределяем очереди между ядрами командой rss-ladder eth0
    увеличиваем ей буфер командой rx-buffers-increase eth0

    Пример 2. Чуть сложнее.

    Дано:

    два процессора с 8 ядрами
    две NUMA-ноды
    Две двухпортовые 10 Гбит/сек сетевые карты (eth0, eth1, eth2, eth3), у каждого порта 16 очередей, все привязаны к node0, входящий объём трафика: 3 Гбит/сек на каждую
    1 х 1 Гбит/сек сетевая карта, 4 очереди, привязана к node0, исходящий объём трафика: 100 Мбит/сек.

    Решение:

    1 Переткнуть одну из 10 Гбит/сек сетевых карт в другой PCI-слот, привязанный к NUMA node1.
    2 Уменьшить число combined очередей для 10гбитных портов до числа ядер одного физического процессора:

    for dev in eth0 eth1 eth2 eth3; do
      ethtool -L $dev combined 8
    done
    

    3 Распределить прерывания портов eth0, eth1 на ядра процессора, попадающие в NUMA node0, а портов eth2, eth3 на ядра процессора, попадающие в NUMA node1:

    rss-ladder eth0 0
    rss-ladder eth1 0
    rss-ladder eth2 1
    rss-ladder eth3 1
    

    4 Увеличить eth0, eth1, eth2, eth3 RX-буферы:

    for dev in eth0 eth1 eth2 eth3; do
      rx-buffers-increase $dev
    done
    

    Напоминание:

    В случае с сетевыми картами с одной очередью распределить нагрузку между ядрами можно с помощью RPS, но потери при копировании пакетов в память это не устранит.

    Распределение прерываний осуществляется на базе расчета хеш функции (остаток от деления) от совокупности таких данных: protocol, source and destination IP, and source and destination port. Технология называется: Receive-side scaling (RSS).