BCC (BPF Compiler Collection) — это мощный набор соответствующих инструментов и файлов примеров для создания ресурсоемких программ трассировки и манипулирования ядром.
Он использует расширенный BPF (Berkeley Packet Filters), первоначально известный как eBPF, который был одной из новых функций в Linux 3.15.
Практически, большинство компонентов, используемых в BCC, требуют Linux 4.1 или выше, и среди их особенностей стоит отметить следующие:
- Не требует сторонних модулей ядра, поскольку все инструменты работают на основе BPF, встроенного в ядро, а BCC использует функции, добавленные в Linux серии 4.x.
- Позволяет наблюдать за выполнением программ.
- Состоит из нескольких инструментов анализа производительности с файлами примеров и man-страницами.
BCC подходит для опытных пользователей Linux и позволяет легко писать BPF-программы, используя инструментарий ядра на C, а также внешние интерфейсы на Python и lua.
Кроме того, он поддерживает множество задач, таких как анализ производительности, мониторинг, управление сетевым трафиком и многое другое.
Как установить BCC в Linux-системах
Помните, что BCC использует функции, добавленные в ядро Linux версии 4.1 или выше, и, как требование, ядро должно быть скомпилировано с установленными ниже флагами:
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
# [optional, for tc filters]
CONFIG_NET_CLS_BPF=m
# [optional, for tc actions]
CONFIG_NET_ACT_BPF=m
CONFIG_BPF_JIT=y
# [for Linux kernel versions 4.1 through 4.6]
CONFIG_HAVE_BPF_JIT=y
# [for Linux kernel versions 4.7 and later]
CONFIG_HAVE_EBPF_JIT=y
# [optional, for kprobes]
CONFIG_BPF_EVENTS=y
# Need kernel headers through /sys/kernel/kheaders.tar.xz
CONFIG_IKHEADERS=y
Вы можете проверить все указанные флаги конфигурации ядра с помощью одной команды grep, указав все имена флагов в качестве шаблонов.
grep -E 'CONFIG_BPF=y|CONFIG_BPF_SYSCALL=y|CONFIG_NET_CLS_BPF=m|CONFIG_NET_ACT_BPF=m|CONFIG_BPF_JIT=y|CONFIG_HAVE_BPF_JIT=y|CONFIG_HAVE_EBPF_JIT=y|CONFIG_BPF_EVENTS=y|CONFIG_IKHEADERS=y' /boot/config-$(uname -r)
После проверки флагов ядра пришло время установить инструменты BCC в Linux-системы.
Установка инструментов BCC в Debian
Вы можете найти bcc и его инструменты в обычном основном репозитории Debian. Они происходят из исходного пакета bpfcc и имеют названия bpfcc-tools, python3-bpfcc, libbpfcc и libbpfcc-dev.
echo deb http://cloudfront.debian.net/debian sid main >> /etc/apt/sources.list
sudo apt-get install -y bpfcc-tools libbpfcc libbpfcc-dev linux-headers-$(uname -r)
Установка инструментов BCC на Ubuntu
Вы можете найти различные версии bcc в обычном репозитории Ubuntu Universe.
sudo apt-get install bpfcc-tools linux-headers-$(uname -r)
Установка инструментов BCC на Fedora
Начиная с Fedora 40, двоичные файлы bcc доступны в стандартном репозитории.
sudo dnf install bcc
Установка инструментов BCC на RHEL
Инструмент bcc уже включен в официальный репозиторий yum под названием bcc-tools.
sudo yum install bcc-tools
Установка инструментов BCC в Arch Linux
bcc доступен в стандартном репозитории Arch и может быть установлен с помощью команды pacman.
pacman -S bcc bcc-tools python-bcc
Установка инструментов BCC на openSUSE
Для openSUSE Leap 42.2 (и более поздних версий) и Tumbleweed, bcc уже включен в официальное репо.
sudo zypper ref
sudo zypper in bcc-tools bcc-examples
Как использовать инструменты BCC в системах Linux
Все инструменты BCC устанавливаются в каталог /usr/share/bcc/tools. Однако вы можете запустить их из репозитория BCC на Github в каталоге /tools, где они заканчиваются расширением .py.
ls /usr/share/bcc/tools
Мы рассмотрим несколько примеров — мониторинг общей производительности системы Linux и работы в сети.
Трассировка системных вызовов open() в Linux
Давайте начнем с отслеживания всех вызовов open() с помощью инструмента opensnoop. Это позволит нам узнать, как работают различные приложения, определив их файлы данных, конфигурационные файлы и многое другое:
cd /usr/share/bcc/tools
sudo ./opensnoop
Анализ задержки дискового ввода-вывода в Linux
В этом примере показано обобщенное распределение задержек дискового ввода-вывода с помощью инструмента biolatency. После выполнения команды подождите несколько минут и нажмите Ctrl-C, чтобы завершить ее и просмотреть результаты.
sudo ./biolatency
Отслеживание новых процессов в Linux
В этом разделе мы перейдем к отслеживанию новых процессов в процессе выполнения с помощью инструмента execsnoop. Каждый раз, когда процесс форкируется системными вызовами fork() и exec(), он отображается в выводе. Однако не все процессы удается отследить.
sudo ./execsnoop
Отслеживание медленных операций файловой системы Ext4
С помощью ext4slower можно отследить общие операции файловой системы ext4, которые выполняются медленнее 10 мс, чтобы помочь нам выявить независимые медленные операции ввода-вывода с диска через файловую систему.
Он выводит только те операции, которые превышают пороговое значение:
sudo ./ext4slower
Исследование активности дискового ввода-вывода с помощью biosnoop
Далее давайте с помощью инструмента biosnoop распечатаем строку ежесекундных дисковых операций ввода-вывода с такими подробностями, как идентификатор процесса, сектор, байт, задержка и т. д:
sudo ./biosnoop
Анализ производительности системного кэша
Далее мы используем инструмент cachestat для отображения одной строки сводной статистики системного кэша каждую секунду. Это позволяет выполнять операции по настройке системы, отмечая низкий коэффициент попадания в кэш и высокий процент промахов:
sudo ./cachestat
Мониторинг TCP-соединений в Linux
Ежесекундный мониторинг TCP-соединений с помощью инструмента tcpconnect. Его вывод включает в себя адрес источника и назначения, а также номер порта. Этот инструмент полезен для отслеживания неожиданных TCP-соединений, помогая тем самым выявить неэффективность конфигурации приложения или злоумышленника.
sudo ./tcpconnect
Все вышеперечисленные инструменты можно использовать с различными опциями, например, чтобы включить страницу справки для данного инструмента, используйте опцию -h:
sudo ./tcpconnect -h
Отслеживание неудачных системных вызовов exec()s
Чтобы отследить неудачные системные вызовы exec()s, используйте опцию -x в opensnoop, как показано ниже:
sudo ./opensnoop -x
Трассировка особых функций процесса
Последний пример ниже демонстрирует, как выполнить пользовательскую операцию трассировки. Мы отслеживаем конкретный процесс, используя его PID.
Сначала определите идентификатор процесса:
pidof firefox
Позже запустите пользовательскую команду трассировки. Приведенная ниже команда -p указывает идентификатор процесса, do_sys_open() — это функция ядра, которая отслеживается динамически, включая второй аргумент в виде строки.
sudo ./trace -p 4095 'do_sys_open "%s", arg2'
Аннотация
BCC — это мощный и простой в использовании набор инструментов для решения различных задач системного администрирования, таких как отслеживание производительности системы, отслеживание ввода-вывода блочных устройств, функций TCP, операций с файловой системой, системных вызовов, проб Node.js и многих других. Важно отметить, что в комплект поставки входит несколько файлов примеров и man-страниц для инструментов, что делает его удобным и надежным.