BCC — инструменты трассировки для Linux IO, сетей и многого другого

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-страниц для инструментов, что делает его удобным и надежным.

Поделитесь с друзьями

Добавить комментарий

0 комментариев
Вбудовані Відгуки
Переглянути всі коментарі
0
Ми любимо ваші думки, будь ласка, прокоментуйте.x