Не удается присоединить eBPF `kretprobes` к`napi_poll()`с помощью инструментов bcc

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

Я использую следующую команду

argdist -H 'r:c:napi_poll():u64:$latency/$retval#avg time per packet (ns)' что в итоге дает мне ошибку Failed to attach BPF to kprobe и в dmesg я получаю сообщение, как Could not insert probe at napi_poll+0: -2

Я просто любопытно, почему я не могу прикрепить kretprobes в napi_poll() когда подобный трюк работает с net_rx_action()?

1 ответ

Решение

Большую часть времени Failed to attach BPF to kprobe ошибка вызвана встроенной функцией. Как объяснено в документации Kprobes (раздел Kprobes Features and Limitations), Kprobes не сможет подключиться, если целевая функция была встроена. поскольку napi_poll статичен, он мог быть встроен во время компиляции.

Вы можете проверить символы ядра, если napi_poll был встроен или нет:

$ cat /boot/System.map-`uname -r` | grep " napi_poll"
$
$ cat /boot/System.map-`uname -r` | grep " net_rx_action"
ffffffff817d8110 t net_rx_action

В моей системе napi_poll в то время как net_rx_action не является.


Есть несколько способов решения этой проблемы, в зависимости от вашей цели.

  1. Если вы не против перекомпилировать ядро, вы можете использовать Linux inline атрибут для обеспечения napi_poll не указывается
  2. Если вы не можете изменить ядро, обычный обходной путь - найти вызывающую функцию napi_poll это обеспечивает ту же информацию. Функция, вызываемая napi_poll может также работать, если он предоставляет достаточно информации и сам по себе не указан.
Другие вопросы по тегам