Не удается присоединить 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
не является.
Есть несколько способов решения этой проблемы, в зависимости от вашей цели.
- Если вы не против перекомпилировать ядро, вы можете использовать Linux
inline
атрибут для обеспеченияnapi_poll
не указывается - Если вы не можете изменить ядро, обычный обходной путь - найти вызывающую функцию
napi_poll
это обеспечивает ту же информацию. Функция, вызываемаяnapi_poll
может также работать, если он предоставляет достаточно информации и сам по себе не указан.