Трассировка в Linux

Как Bpftrace может помочь вам исправить любую ошибку в производстве

Когда в производственной среде возникает вредоносная ошибка, как лучше всего ее устранить, если вы проверили журналы в приложении, а также на уровне контейнера, но все еще не нашли никакой полезной информации? Возможно, вам удастся перезапустить сервер, но на самом деле существует другая альтернатива для поиска основной причины проблемы.

Bpf-trace - это язык трассировки высокого уровня для расширенного фильтра пакетов Berkeley (eBPF) Linux, доступного в последних ядрах Linux (4.x). Он использует LLVM в качестве бэкэнда для компиляции скриптов в байт-код BPF и использует BCC для взаимодействия с системой Linux BPF, а также существующие возможности трассировки Linux, динамическую трассировку ядра (kprobes), динамическую трассировку на уровне пользователя (uprobes), и точки трассировки. В Linux уже есть много инструментов для повышения производительности, но они часто основаны на счетчиках и имеют ограниченную видимость. Например, iostat или агент мониторинга могут сообщить вам среднюю задержку диска, но не распределение этой задержки. Распределения могут выявить несколько режимов или выбросов, каждый из которых может быть реальной причиной проблем с производительностью. Bpftrace подходит для такого рода анализа: разложения метрик на распределения или журналы событий и создания новых метрик для видимости слепых зон.

Терминология

Типы зондов

Знакомство с bpftrace

  • Проверить версию ядра Linux

Вот что сказано на официальной странице bpftrace по установке:

Рекомендуется использовать ядро ​​Linux 4.9 или выше. Некоторые инструменты могут работать на старых ядрах, но эти старые ядра больше не тестируются. Чтобы объяснить это требование, это версии ядра, в которые были добавлены основные функции:

4.1 - kprobes

4.3 - халаты

4.6 - встроенные функции stack traces, count и hist (используйте карты PERCPU для точности и эффективности)

4.7 - точки трассировки

4.9 - таймеры / профилирование

В более поздних версиях ядра были добавлены незначительные улучшения, поэтому предпочтительнее новее, чем 4.9.

Ваше ядро ​​также должно быть построено со следующими параметрами:

CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
CONFIG_FTRACE_SYSCALLS=y

Это можно проверить, запустив сценарий check_kernel_features из каталога scripts.

Если вы хотите проверить версию ядра Linux, например, в Ubuntu, запустите это.

uname -r
--> 5.3.0-62-generic
  • Установить bpftrace

Bpftrace недоступен для установки с помощью apt-get в версии Ubuntu 18.04, поэтому в этом случае вам придется установить с помощью оснастки.

sudo snap install --devmode bpftrace
sudo snap connect bpftrace:system-trace

  • Использование bpftrace

Проверяя, работает ли установка, мы будем проверять количество ошибок страниц по процессам с помощью однострочного скрипта.

# Count page faults by process
bpftrace -e 'software:faults:1 { @[comm] = count(); }'

Запуск приведенного выше сценария покажет это

Или мы можем создать новый файл bpftrace и выполнить в нем код.

Выполнение этого вернет следующее.

Заключение

Bpftrace - последний инструмент, который вы бы использовали, если ломаете голову над отладкой программного приложения. Однако в то же время это очень мощный инструмент. Спасибо, что прочитали мой пост, надеюсь, вы найдете его полезным.

использованная литература