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

Идея состоит в том, чтобы использовать 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()?


person Valmik Roy    schedule 24.12.2017    source источник
comment
Не могли бы вы попробовать с более простым инструментом? Например, funccount napi_poll. В моей системе napi_poll не работает, а net_rx_action работает. Вероятно, просто потому, что один встроен, а другой нет.   -  person pchaigno    schedule 24.12.2017
comment
Я думаю, что вы правы насчет встроенности функции, так как я пытался любым другим способом, и napi_poll никогда не работал.   -  person Valmik Roy    schedule 27.12.2017
comment
Я напишу полный ответ с предложениями, но, к сожалению, вы мало что можете сделать, если не можете перехватить функцию.   -  person pchaigno    schedule 27.12.2017


Ответы (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, также может работать, если она предоставляет достаточно информации и не встроена сама по себе.
person pchaigno    schedule 27.12.2017