nft_pipapo_avx2_scratch_index отображается на всех моих записях перформанса
Я исследую проблему с производительностью на моем компьютере с Ubuntu 22.04.2 LTS. Я предпринимаю следующие шаги:
sudo perf record -g -F max -s --call-graph dwarf -e cycles -e sched:sched_switch --switch-events --sample-cpu
Затем откройте запись с помощьюsudo hotspot
:
Я понимаю, что, возможно, это не очень точное измерение, поскольку за 2 секунды было собрано всего 719 образцов. Однако...
График показывает, что процессор провел довольно много времени в процессе №0, который, как я предполагаю, является ядром.
Глядя на вид сверху вниз в HotSpot, мы видим, что этоnft_pipapo_avx2_scratch_index
появляется практически везде.
Читая о том, что это за штука, кажется, что она является частью проекта netfilter nf_tables:
/* PIPAPO: PIle PAcket POlicies: set for arbitrary concatenations of ranges
Определено здесь: https://elixir.bootlin.com/linux/latest/source/net/netfilter/nft_set_pipapo_avx2.c#L75 .
Похоже, это модуль ядра, отвечающий за фильтрацию IP-пакетов и работу брандмауэра.
Это не кажется таким уж плохим, но когда я запускаю свой собственный высокопроизводительный пакет программного обеспечения (та же команда, но добавляю в конце свой двоичный файл), я получаю это в последней версии HotSpot:
Теперь HotSpot утверждает, что 30% «циклов» соответствуют этой загадочной функции. Весь синий цвет на временной шкале предполагает, что эта функция действительно вмешивается во все мои потоки.
Теперь, как предполагается, это происходит в двоичном файле под названием . Самое смешное: я записал это после того, как занес в черный список модули ядра.nf_tables
,x_tables
иip_tables
. Я подтвердил это после перезагрузки, что при запросе таких модулей ядра не было.lsmod
.
Это становится еще сложнее, когда я пытаюсь открыть ту же запись перформанса вperf-report
. Я никогда не увижу этого. Это заставляет меня поверить, что мне действительно не хватает некоторых флагов, чтобы я мог также показать их. К этому моменту я установил образ ядра Linux с символами отладки и указалperf
для этого используя-k
, но это не имеет значения. В любом случае: как HotSpot сможет показать их, даже не имея этих символов отладки ядра?
На данный момент у меня есть две гипотезы:
- Гипотеза 1)
perf report
не показывает эти образцы, поскольку фильтрует их на основе профилированного мной двоичного файла. - Гипотеза 2) Это ошибка визуализации в том, как HotSpot приписывает циклы/время записанным образцам.
1 ответ
Я дошёл до того, что не могу воспроизвести эту проблему. Поведение изменилось после установки образа ядра с символами отладки, я думаю, следуя этому руководству:https://wiki.ubuntu.com/DebuggingProgramCrash#Non-built-in_debug_symbol_packages_.28.2A-dbgsym.29
После этого я установил символы отладки ядра Linux:
sudo apt-get update
sudo apt-get install linux-image-$(uname -r)-dbgsym
Теперь HotSpot все еще показывал странноеnft_pipapo_avx2_scratch_index
. Однако после перезаписи сperf
(та же команда, что и исходный вопрос), и повторное открытие записи в HotSpot действительно сработало. Сейчас я вижу то, что ожидаю увидеть. И целая куча странных, не связанных друг с другом DSO (динамических общих объектов, таких какnf_tables
,iwlwifi.ko
,mac80211.ko
) больше не появляются:
Итак, теперь я предполагаю, что это ошибка в HotSpot или производительность не обеспечивает должным образом связь черезperf.data
файл, что на самом деле происходит. Я понятия не имею, почему мне пришлось перезаписывать после установки символов отладки.