Troubleshooting

Не загружаются драйверы (modprobe)

Симптомы:

  • При загрузке модуля:

    modprobe: FATAL: Module igb_uio not found in directory /lib/modules/4.9.0-6-amd64
    
  • При установке пакета:

    Module build for kernel 4.9.0-6-amd64 was skipped since the
    kernel headers for this kernel does not seem to be installed.
    

Необходимо установить пакет linux-headers-amd64 (Debian) и убедиться, что загружена версия ядра, соответствующая версии этого пакета, после чего выполнить:

dkms autoinstall

Не работает docker и docker-compose

По умолчанию эти команды работают только для пользователей группы docker и для root. Это стандартная мера безопасности Docker. Решение:

usermod -aG docker $USER
newgrp docker

Обработчик пакетов недоступен

Такое сообщение появляется в web-интерфейсе, если обработчик пакетов не запустился или остановился. Диагностика (из /srv/mitigator):

docker-compose logs data-plane

Ниже приводятся некоторые типовые проблемы и характерные сообщения.

EAL: Cannot get hugepage information

Сообщение:

EAL: No free hugepages reported in hugepages-2048kB
EAL: No free hugepages reported in hugepages-1048576kB
EAL: FATAL: Cannot get hugepage information.
EAL: Cannot get hugepage information.

Причина: не выделены или полностью заняты hugepages.

Проверить наличие свободных hugepages и убедиться, что значения HugePages_Total и Hugepagesize совпадают с настроенными, а HugePages_Free равно HugePages_Total (или отличается не более, чем на несколько страниц):

grep Huge /proc/meminfo

EAL: set_mempolicy failed: Invalid argument

Сообщение:

EAL: Trying to obtain current memory policy.
EAL: Setting policy MPOL_PREFERRED for socket 1
EAL: set_mempolicy failed: Invalid argument
EAL: alloc_seg(): allocation happened on wrong socket (wanted 1, got 0)
EAL: Ask a virtual area of 0x40000000 bytes
EAL: Virtual area found at 0x11c0000000 (size = 0x40000000)
EAL: attempted to allocate 1 segments, but only 0 were allocated

Причина: не выделены hugepages на всех используемых приложением NUMA-нодах на многопроцессорной платформе.

Проверить вывод команд (для платформы с двумя NUMA-нодами):

ls /sys/devices/system/node/node0
ls /sys/devices/system/node/node1

Вывод должен содержать каталоги hugepages и memory и не должен сильно различаться. Если таких каталогов нет — проверить машину на физическое наличие памяти на обоих CPU. Посмотреть информацию по памяти в BIOS, проверить настройки NUMA в BIOS, проверить настройки памяти и NUMA в OS.

no port found

Сообщение:

/data-plane/etc/data-plane.conf:0 no port found with name '04:00.0'

Нужно убедиться, что адрес устройства 04:00.0 соответствует действительности, и что устройство привязано к драйверу DPDK точно так же, как при подготовке системы.

Аварийное завершение

При просмотре логов docker-compose logs data-plane сообщение:

Segmentation fault (core dumped)

Для возобновления работы выполнить команду:

docker-compose up -d data-plane

Далее рекомендуется связаться с разработчиками с целью точной диагностики и исправления и направить им:

  1. Описание ситуации, в которой произошла проблема (действий с MITIGATOR, входящего трафика).

  2. Описание аппаратной конфигурации сервера:

    • модель CPU и сетевых карт;
    • размер памяти и конфигурация hugepages;
    • версия ядра Linux, используемые драйвера для сетевых карт и их версии.
  3. Файл /srv/mitigator/data-plane.conf.

  4. Файл сlick.stacktrace, который по умолчанию сохраняется в /var/lib/docker/volumes/mitigator_coredumps/_data/click.stacktrace.

  5. Core dump (слепок памяти процесса), который по умолчанию сохраняется в /var/lib/docker/volumes/mitigator_coredumps/_data/core. Его размер — гигабайты, но он обычно хорошо сжимается.

    В некоторых дистрибутивах (например, Ubuntu) файл core не появляется, потому что обработка сбоев настроена иначе. Проверить настройку можно так:

    cat /proc/sys/kernel/core_pattern
    

    По умолчанию в Linux значение core. Если оно другое:

    1. Запомнить исходное значение:

      cat /proc/sys/kernel/core_pattern > /tmp/old_core_pattern
      
    2. Заменить его на core:

      echo core | tee /proc/sys/kernel/core_pattern
      
    3. Воспроизвести проблему, получить файл core по указанному выше пути.

    4. Восстановить оригинальное значение:

      cat /tmp/old_core_pattern | tee /proc/sys/kernel/core_pattern