Коллекция компиляторов BPF (BCC)
BCC — это набор инструментов для создания эффективных программ трассировки и манипулирования ядром, включающий несколько полезных инструментов и примеров. Он использует расширенный BPF (фильтры пакетов Беркли), официально известный как eBPF, новую функцию, впервые добавленную в Linux 3.15. Большая часть того, что использует BCC, требует Linux 4.1 и выше.
Инго Молнар описал eBPF как:
Одной из наиболее интересных особенностей этого цикла является возможность прикреплять к kprobes программы eBPF (определяемые пользователем изолированные байт-коды, исполняемые ядром). Это позволяет использовать пользовательские инструменты для живого образа ядра, которые никогда не могут привести к сбою, зависанию или негативному взаимодействию с ядром.
BCC упрощает написание программ BPF благодаря инструментарию ядра на C (и включает оболочку C вокруг LLVM), а также интерфейсам на Python и Lua. Он подходит для многих задач, включая анализ производительности и контроль сетевого трафика.
Скриншот
В этом примере отслеживается функция дискового ввода-вывода ядра и заполняется внутриядерная гистограмма степени 2 размера ввода-вывода. Для повышения эффективности на уровень пользователя возвращается только сводка гистограммы.
# ./bitehist.py
Tracing... Hit Ctrl-C to end.
^C
kbytes : count distribution
0 - > 1 : 3 | |
2 - > 3 : 0 | |
4 - > 7 : 211 | ********** |
8 - > 15 : 0 | |
16 - > 31 : 0 | |
32 - > 63 : 0 | |
64 - > 127 : 1 | |
128 - > 255 : 800 | ************************************** |
Приведенный выше вывод показывает бимодальное распределение, где размер самого большого режима с 800 вводами-выводами составлял от 128 до 255 Кбайт.
См. источник: bitehist.py. Что это отслеживает, что сохраняет и как представляются данные, можно полностью настроить. Это показывает лишь некоторые из многих возможных возможностей.
Установка
См. INSTALL.md для получения инструкций по установке на вашу платформу.
Часто задаваемые вопросы
См. FAQ.txt для получения наиболее распространенных вопросов по устранению неполадок.
Справочное руководство
См. docs/reference_guide.md для получения справочного руководства по API bcc и bcc/BPF.
Содержание
Некоторые из них представляют собой отдельные файлы, содержащие как C, так и Python, другие содержат пару файлов .c и .py, а некоторые представляют собой каталоги файлов.
Отслеживание
Примеры
- example/tracing/bitehist.py: гистограмма размера блока ввода-вывода. Примеры.
- example/tracing/disksnoop.py: Отслеживает задержку ввода-вывода блочного устройства. Примеры.
- example/hello_world.py: печатает «Hello, World!» для новых процессов.
- example/tracing/mysqld_query.py: Отслеживание запросов сервера MySQL с помощью зондов USDT. Примеры.
- example/tracing/nodejs_http_server.py: отслеживание запросов HTTP-сервера Node.js с использованием зондов USDT. Примеры.
- example/tracing/stacksnoop: трассировка функции ядра и вывод всех трассировок стека ядра. Примеры.
- инструменты/statsnoop: Трассировка системных вызовов stat(). Примеры.
- example/tracing/task_switch.py: Подсчет переключений задач с использованием PID и обратно.
- example/tracing/tcpv4connect.py: Отслеживание активных соединений TCP IPv4. Примеры.
- example/tracing/trace_fields.py: Простой пример печати полей из отслеживаемых событий.
- example/tracing/undump.py: Дамп пакетов сокетов UNIX. Примеры
- example/tracing/urandomread.py: пример точки трассировки ядра, которая отслеживает случайное:urandom_read. Примеры.
- example/tracing/vfsreadlat.py example/tracing/vfsreadlat.c: Распределение задержки чтения VFS. Примеры.
- example/tracing/kvm_hypercall.py: Условные статические точки трассировки ядра для входа, выхода и гипервызова KVM. Примеры.
Инструменты
- инструменты/argdist: отображать значения параметров функции в виде гистограммы или частоты. Примеры.
- инструменты/bashreadline: печатать введенные команды bash для всей системы. Примеры.
- инструменты/bpflist: отображение процессов с активными программами и картами BPF. Примеры.
- инструменты/возможности: отслеживание проверок возможностей безопасности. Примеры.
- Tools/compactsnoop: отслеживание событий компактной зоны с помощью PID и задержки. Примеры.
- Tools/criticalstat: отслеживает длинные атомарные критические секции ядра и сообщает о них. Примеры
- инструменты/взаимная блокировка: обнаружение потенциальных взаимоблокировок в запущенном процессе. Примеры.
- инструменты/drsnoop: отслеживание событий прямого восстановления с помощью PID и задержки. Примеры.
- Tools/funccount: Подсчет вызовов функций ядра. Примеры.
- инструменты/инъекция: целенаправленное внедрение ошибок с помощью цепочки вызовов и предикатов. Примеры.
- Tools/klockstat: отслеживает события блокировки мьютекса ядра и отображает статистику блокировок. Примеры.
- инструменты/opensnoop: Трассировка системных вызовов open(). Примеры.
- инструменты/readahead: примеры производительности кэша с упреждающим чтением.
- инструменты/reset-trace: Сброс состояния трассировки. Только инструмент для обслуживания. Примеры.
- инструменты/stackcount: Подсчет вызовов функций ядра и их трассировок стека. Примеры.
- инструменты/syncsnoop: Трассировка системного вызова sync(). Примеры.
- инструменты/threadsnoop: список создания новых потоков. Примеры.
- Tools/tplist: отображает точки трассировки ядра или зонды USDT и их форматы. Примеры.
- инструменты/трассировка: трассировка произвольных функций с фильтрами. Примеры.
- инструменты/ttysnoop: просмотр живого вывода с устройства tty или pts. Примеры.
- инструменты/ucalls: суммируйте вызовы методов или системные вызовы Linux на языках высокого уровня. Примеры.
- инструменты/uflow: Распечатайте блок-схему метода на языках высокого уровня. Примеры.
- инструменты/ugc: отслеживание событий сборки мусора на языках высокого уровня. Примеры.
- Tools/uobjnew: суммирует события выделения объектов по типу объекта и количеству выделенных байтов. Примеры.
- инструменты/устат: собирайте такие события, как сборщики мусора, создание потоков, выделение объектов, исключения и многое другое на языках высокого уровня. Примеры.
- инструменты/потреды: отслеживание событий создания потоков в Java и необработанных потоках. Примеры.
Инструменты памяти и обработки
- инструменты/execsnoop: отслеживание новых процессов с помощью системных вызовов exec(). Примеры.
- инструменты/exitsnoop: трассировка завершения процесса (сигналы выхода и фатальные сигналы). Примеры.
- инструменты/killsnoop: отслеживание сигналов, выдаваемых системным вызовом kill(). Примеры.
- инструменты/kvmexit: отображает причину выхода и ее статистику для каждого выхода из виртуальной машины. Примеры.
- инструменты/memleak: отображение невыполненных выделений памяти для поиска утечек памяти. Примеры.
- инструменты/oomkill: выследите убийцу нехватки памяти (OOM). Примеры.
- инструменты/pidpersec: подсчет новых процессов (через форк). Примеры.
- инструменты/rdmaucma: отслеживание событий доступа к диспетчеру подключений к пользовательскому пространству RDMA. Примеры.
- инструменты/shmsnoop: отслеживание системных вызовов общей памяти System V. Примеры.
- инструменты/slabratetop: максимальная скорость выделения кэша памяти SLAB/SLUB ядра. Примеры.
Инструменты производительности и времени
- инструменты/dbslower: отслеживание запросов MySQL/PostgreSQL медленнее порогового значения. Примеры.
- инструменты/dbstat: суммируйте задержку запросов MySQL/PostgreSQL в виде гистограммы. Примеры.
- инструменты/функинтервал: интервал времени между той же функцией, что и гистограмма. Примеры.
- инструменты/функлатность: функции времени и отображение распределения их задержки. Примеры.
- Tools/funcslower: отслеживание медленных вызовов ядра или пользовательских функций. Примеры.
- инструменты/hardirqs: измерение времени события жесткого IRQ (жесткого прерывания). Примеры.
- инструменты/mysqld_qslower: отслеживание запросов сервера MySQL медленнее порогового значения. Примеры.
- инструменты/ppchcalls: суммируйте количество вызовов ppc и задержки. Примеры.
- инструменты/softirqs: измерение времени события мягкого IRQ (мягкого прерывания). Примеры.
- инструменты/syscount: суммируйте количество системных вызовов и задержки. Примеры.
Инструменты ЦП и планировщика
- инструменты/cpudist: суммируйте время включения и выключения процессора для каждой задачи в виде гистограммы. Примеры
- инструменты/cpuunclaimed: выборка очередей выполнения ЦП и расчет невостребованных простаивающих ЦП. Примеры
- Tools/llcstat: суммирует ссылки и промахи в кэше ЦП по процессам. Примеры.
- Tools/offcputime: суммирует время отключения процессора по трассировке стека ядра. Примеры.
- Tools/offwaketime: суммирует время блокировки по стеку вне ЦП ядра и стеку пробуждения. Примеры.
- инструменты/профиль: профилируйте использование ЦП путем выборки трассировок стека через определенный интервал времени. Примеры.
- инструменты/runqlat: задержка очереди (планировщика) запуска в виде гистограммы. Примеры.
- инструменты/runqlen: длина очереди запускается в виде гистограммы. Примеры.
- инструменты/runqslower: отслеживание длительных задержек в планировании процессов. Примеры.
- инструменты/время пробуждения: суммирование времени сна и пробуждения по стеку ядра пробуждающего устройства. Примеры.
- инструменты/wqlat: суммируйте задержку ожидания работы в рабочей очереди. Примеры.
Инструменты для сетей и сокетов
- Tools/gethostlatency: показывает задержку для вызовов getaddrinfo/gethostbyname[2]. Примеры.
- инструменты/bindsnoop: отслеживание системных вызовов IPv4 и IPv6bind() (bind()). Примеры.
- инструменты/netqtop инструменты/netqtop.c: отслеживание и отображение распределения пакетов в очередях сетевых карт. Примеры.
- инструменты/sofdsnoop: трассировка FD, проходящих через сокеты unix. Примеры.
- инструменты/солистен: трассировка прослушивания TCP-сокета. Примеры.
- инструменты/sslsniff: анализ записанных и прочитанных данных OpenSSL. Примеры.
- инструменты/tcpaccept: отслеживание пассивных соединений TCP (accept()). Примеры.
- инструменты/tcpconnect: отслеживание активных TCP-соединений (connect()). Примеры.
- инструменты/tcpconnlat: отслеживание задержки активного соединения TCP (connect()). Примеры.
- Tools/tcpdrop: отслеживает отбрасывание TCP-пакетов на основе ядра с подробной информацией. Примеры.
- Tools/tcplife: отслеживает TCP-сессии и подводит итоги продолжительности жизни. Примеры.
- инструменты/tcpretrans: отслеживание повторных передач TCP и TLP. Примеры.
- инструменты/tcprtt: отслеживание времени прохождения TCP туда и обратно. Примеры.
- инструменты/tcpstate: отслеживание изменений состояния TCP-сессии в зависимости от продолжительности. Примеры.
- инструменты/tcpsubnet: суммировать и агрегировать TCP-отправку по подсети. Примеры.
- инструменты/tcpsynbl: Показать невыполненную работу TCP SYN. Примеры.
- Tools/tcptop: суммирует пропускную способность отправки/получения TCP по хостам. Топ для TCP. Примеры.
- инструменты/tcptracer: отслеживание установленных TCP-соединений (connect(), Accept(), close()). Примеры.
- Tools/tcpcong: отслеживать продолжительность состояния контроля перегрузки TCP-сокетов. Примеры.
Инструменты хранения и файловых систем
- инструменты/bitesize: отображение гистограммы размера ввода-вывода для каждого процесса. Примеры.
- инструменты/cachestat: соотношение попаданий/промахов кэша страниц трассировки. Примеры.
- инструменты/cachetop: Отслеживание соотношения попаданий/промахов кэша страниц по процессам. Примеры.
- инструменты/dcsnoop: Трассировка поиска в кэше записей каталога (dcache). Примеры.
- инструменты/dcstat: статистика кэша записей каталога (dcache). Примеры.
- инструменты/биолатентность: суммируйте задержку ввода-вывода блочного устройства в виде гистограммы. Примеры.
- инструменты/биотоп: Верх для дисков: суммировать ввод-вывод блочных устройств по процессам. Примеры.
- инструменты/биопаттерн: определите шаблоны случайного/последовательного доступа к диску. Примеры.
- инструменты/biosnoop: отслеживание ввода-вывода блочного устройства с помощью PID и задержки. Примеры.
- инструменты/dirtop: чтение и запись файлов осуществляется по каталогу. Топ для каталогов. Примеры.
- инструменты/filelife: отслеживание продолжительности жизни недолговечных файлов. Примеры.
- инструменты/filegone: проследить, почему файл пропал (удален или переименован). Примеры.
- инструменты/fileslower: отслеживание медленных синхронных операций чтения и записи файлов. Примеры.
- инструменты/filetop: Файл читает и записывает по имени файла и процессу. Топ для файлов. Примеры.
- инструменты/mdflush: отслеживание событий md-flush. Примеры.
- инструменты/mountsnoop: отслеживание системных вызовов монтирования и размонтирования по всей системе. Примеры.
- инструменты/виртиостат: показать статистику ввода-вывода устройства VIRTIO. Примеры.
Инструменты файловых систем
- инструменты/btrfsdist: суммируйте распределение задержки операций btrfs в виде гистограммы. Примеры.
- инструменты/btrfsslower: отслеживание медленных операций btrfs. Примеры.
- инструменты/ext4dist: суммируйте распределение задержки операций ext4 в виде гистограммы. Примеры.
- инструменты/ext4slower: отслеживание медленных операций ext4. Примеры.
- инструменты/nfsslower: отслеживание медленных операций NFS. Примеры.
- инструменты/nfsdist: суммируйте распределение задержек операций NFS в виде гистограммы. Примеры.
- инструменты/vfscount: подсчет вызовов VFS. Примеры.
- инструменты/vfsstat: подсчитайте несколько вызовов VFS с выводом столбцов. Примеры.
- инструменты/xfsdist: суммируйте распределение задержки операций XFS в виде гистограммы. Примеры.
- инструменты/xfsslower: отслеживание медленных операций XFS. Примеры.
- инструменты/zfsdist: суммируйте распределение задержки операций ZFS в виде гистограммы. Примеры.
- инструменты/zfsslower: отслеживание медленных операций ZFS. Примеры.
сеть
Примеры:
- example/networking/distributed_bridge/: Пример распределенного моста.
- example/networking/http_filter/: пример простого HTTP-фильтра.
- example/networking/simple_tc.py: Простой пример управления трафиком.
- example/networking/simulation.py: Помощник по моделированию.
- example/networking/neighbor_sharing/tc_neighbor_sharing.py example/networking/neighbor_sharing/tc_neighbor_sharing.c: классификация по IP и ограничение скорости.
- example/networking/tunnel_monitor/: эффективно отслеживайте потоки трафика.
- example/networking/vlan_learning/vlan_learning.py example/vlan_learning.c: демультиплексирование Ethernet-трафика в рабочие пространства veth+namespaces.
Интроспекция БПФ
Инструменты, которые помогают проанализировать программы BPF.
- introspection/bps.c: список всех программ BPF, загруженных в ядро. «ps» для программ BPF. Примеры.
Мотивация
BPF гарантирует, что программы, загруженные в ядро, не могут завершиться сбоем и не могут работать вечно, но, тем не менее, BPF достаточно универсален для выполнения многих произвольных типов вычислений. В настоящее время можно написать программу на C, которая будет компилироваться в действительную программу BPF, но гораздо проще написать программу на C, которая будет компилироваться в недействительный BPF (C именно так). Пользователь не узнает, пока не попытается запустить программу, действительна она или нет.
Используя интерфейс, специфичный для BPF, можно писать на языке и получать обратную связь от компилятора о достоверности применительно к серверной части BPF. Этот набор инструментов призван предоставить интерфейс, который может создавать только действительные программы BPF, сохраняя при этом полную гибкость.
Более того, текущие интеграции с BPF имеют неуклюжий рабочий процесс, иногда включающий компиляцию непосредственно в дерево исходного кода ядра Linux. Целью этой цепочки инструментов является минимизация времени, которое разработчик тратит на компиляцию BPF, и вместо этого сосредоточиться на приложениях, которые можно написать, и проблемах, которые можно решить с помощью BPF.
К особенностям этого набора инструментов относятся:
- Комплексный рабочий процесс BPF в общей библиотеке
- Модифицированный язык C для серверной части BPF.
- Интеграция с бэкэндом llvm-bpf для JIT
- Динамическая (не)загрузка JIT-программ.
- Поддержка перехватчиков ядра BPF: фильтры сокетов, классификаторы tc, действия tc и kprobes.
- Привязки для Python
- Примеры фильтров сокетов, классификаторов tc и kprobes
- Автономные инструменты для отслеживания работающей системы
В будущем, вероятно, будут поддерживаться и другие привязки, помимо Python. Не стесняйтесь добавлять поддержку выбранного вами языка и отправлять запрос на включение!
Учебники
- docs/tutorial.md: Использование инструментов bcc для решения проблем производительности, устранения неполадок и сетевых проблем.
- docs/tutorial_bcc_python_developer.md: Разработка новых программ bcc с использованием интерфейса Python.
сеть
На Red Hat Summit 2015 BCC был представлен в рамках сессии, посвященной BPF. Моделируется среда vxlan с несколькими хостами и используется программа BPF для мониторинга одного из физических интерфейсов. Программа BPF хранит статистику по внутренним и внешним IP-адресам, проходящим через интерфейс, а компонент пользовательского пространства превращает эту статистику в график, показывающий распределение трафика с различной степенью детализации. Смотрите код здесь.
Содействие
Уже готовы закоммитить какой-нибудь код? Вот несколько ресурсов, где можно присоединиться к обсуждениям в сообществе IOVisor и посмотреть, над чем вы хотите работать.
- Список рассылки: https://lists.iovisor.org/mailman/listinfo/iovisor-dev.
- IRC: #iovisor на irc.oftc.net.
- Отслеживание проблем BCC: проблемы с Github
- Руководство по написанию скриптов: CONTRIBUTING-SCRIPTS.md
Внешние ссылки
Ищете дополнительную информацию о BCC и о том, как он используется? Вы можете найти ссылки на другой контент BCC в Интернете на сайте LINKS.md.