page_pool: recycling buffer failed — Ошибка буферов Page Pool сетевых карт
Архитектура ошибки и симптомы сбоя
Сообщение «page_pool: recycling buffer failed: queue ring empty» генерируется подсистемой ядра Page Pool API (net/core/page_pool.c). Подсистема page_pool отвечает за сверхбыстрое повторное использование физических страниц памяти (Zero-Allocation Page Recycling) сетевыми драйверами (mlx5, i40e, ice, igc, virtio_net) при работе с высокими нагрузками и XDP (eXpress Data Path). Ошибка означает, что возврат страницы в кольцевой пул переработки не удался, кольцо пусто, и драйвер вынужден сбрасывать пакеты или совершать медленные аллокации из основного менеджера памяти.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| Page Pool | Driver Fast Buffer Cache | Быстрый локальный кэш физических страниц для сетевых RX-дескрипторов. |
| Recycling Failure | Ring Descriptors Starvation | Страницы удерживаются приложением или XDP-сокетом дольше положенного времени. |
| Impact | Packet Drops / SoftIRQ CPU Spikes | Рост счетчиков потерь кадров RX и деградация пропускной способности сети. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Проверка счетчиков Page Pool и сброшенных пакетов
# Просмотр статистики сетевой карты по page_pool (утилита ethtool / devlink):
ethtool -S eth0 | grep -E "(page_pool|rx_dropped|rx_missed|rx_alloc_failed)"
# Проверка статистики page_pool через интерфейс ethtool (Linux 5.19+):
sudo ethtool --json -S eth0 | grep -A 5 "page_pool"Сценарий 2: Увеличение аппаратных кольцевых буферов RX сетевого адаптера
# Просмотр максимального поддерживаемого размера буфера:
sudo ethtool -g eth0
# Установка кольцевых буферов в максимальный размер (например, 4096):
sudo ethtool -G eth0 rx 4096 tx 4096Сценарий 3: Тюнинг параметров NAPI и бюджета сетевой обработки
Увеличьте вес обработки очередей пакетов NAPI в /etc/sysctl.d/99-network-pool.conf:
cat <<EOF | sudo tee /etc/sysctl.d/99-network-pool.conf
net.core.netdev_budget = 600
net.core.netdev_budget_usecs = 4000
net.core.netdev_max_backlog = 10000
EOF
sudo sysctl -p /etc/sysctl.d/99-network-pool.confСценарий 4: Оптимизация времени удержания страниц в XDP AF_XDP (UMEM)
Если вы используете XDP сокеты (AF_XDP), увеличьте размер очередей UMEM Fill Ring и Completion Ring в конфигурации вашего сетевого сервиса (например, FD.io VPP, Suricata, Open vSwitch).
ITSTM настроит оптимальный лэйаут памяти Page Pool, тюнинг UMEM очередей AF_XDP и привязку очередей сетевых карт по NUMA узлам.
Частые вопросы (FAQ)
Зачем был создан механизм Page Pool в ядре Linux?
Традиционное выделение страниц памяти на каждый входящий пакет через alloc_pages() создает огромную нагрузку на аллокатор страниц Buddy. Page Pool позволяет сетевой карте мгновенно переиспользовать уже очищенную память без блокировок и вызовов mm ядра.
Почему возникает ошибка queue ring empty?
Она возникает, когда сетевой стек или пользовательское приложение удерживают сетевые пакеты (skb/xdp_buff) в сокетах дольше, чем сетевой контроллер успевает заполнять кольцо приема RX, что приводит к исчерпанию пула готовых страниц.
Влияет ли включение Gro / Lro на работу Page Pool?
Да. Механизм Generic Receive Offload (GRO) объединяет множество мелких страниц в один агрегированный пакет skb, задерживая их возврат в Page Pool до завершения обработки пакета ядром.
Как проверить количество очередей RSS сетевого адаптера?
Выполните команду: sudo ethtool -l eth0. Количество очередей Combined должно соответствовать числу физических ядер процессора.