The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Для Linux представлена система динамической отладки BPFtrace (DTrace 2.0)

09.10.2018 14:02

Брендан Грег (Brendan Gregg), один из разработчиков DTrace, объявил об открытии доступа к репозиторию проекта BPFtrace, в рамках которого развивается высокоуровневый язык для написания скриптов динамической отладки и анализа производительности приложений и ядра, продолжающий развитие системы DTrace (позиционируется как DTrace 2.0). Наработки проекта распространяются под лицензией Apache 2.0.

BPFtrace реализован в виде фронтэнда, транслирующего отладочные сценарии в форму приложений eBPF, имеющих доступ к низкоуровневым примитивам ядра для анализа производительности. Для компиляции скриптов BPFtrace в байткод BPF применяется бэкенд на базе LLVM. Язык BPFtrace напоминает AWK и Си, и предоставляет возможности для упрощения трассировки, похожие на DTrace и SystemTap.

eBPF представляет собой встроенный в ядро Linux интерпретатор байткода, позволяющий создавать обработчики сетевых операций, отслеживать работу систем, перехватывать системные вызовы, контролировать доступ, обрабатывать события с сохранением хронометража (perf_event_open), подсчитывать частоту и время выполнения операций, выполнять трассировку с использованием kprobes/uprobes/tracepoints. Благодаря применению JIT-компиляции, байткод на лету транслируется в машинные инструкции и выполняется с производительностью нативного кода. BPFtrace пока ограничен поддержкой платформы Linux, но ведётся разработка реализации eBPF для FreeBSD, после завершения которой BPFtrace сможет быть портирован на FreeBSD.

BPFtrace позволяет отслеживать поведение системы и выполнять диагностику проблем в режиме реального времени, не влияя в процессе отладки на работу и производительность исследуемых приложений. В сценариях BPFtrace может учитываться разнообразная статистика о подсистемах ядра, процессах, системных вызовах, обрабатываемых файлах, блочном вводе/выводе, сетевой активности, состоянии кэшей, работе планировщика задач, утилизации CPU (например, можно определить какое ядро CPU в данным момент выполняет код) и многих других параметрах.

Возможна привязка скриптов-обработчиков к функциям ядра (kprobe:vfs_read), функциям в пространстве пользователя (uprobe:/bin/bash:readline), точкам трассировки в ядре (tracepoint:sched:sched_switch), программным и аппаратным событиям (software:faults: и hardware:cache-references:). Возможен периодический запуск скриптов для сбора статистики (profile:ms: и interval:ms:). Поддерживается привязка скрипта сразу к нескольким событиям, привязка по маске (kprobe:vfs_*) и определение условий для вызова (kprobe:sys_open / uid == 0 /). Для использования в скриптах предлагается типовой набор функций и библиотека готовых обработчиков на основе BCC (BPF Compiler Collection).

Из возможностей, которые имеются в DTrace и пока отсутствуют в BPFtrace упоминаются средства агрегирования вывода, обработка аргументов для shell, поддержка трансляторов, sizeof() и спекулятивный режим трассировки. Среди функциональности, которая есть в BPFtrace, но недоступна в DTrace отмечается поддержка сохранения и извлечения трассировок стека с использованием переменных, а также возможность привлечения инструментария bcc для создания сложных сценариев и обработки аргументов.

Эквивалентные вызовы в DTrace и BPFtrace:

ТипDTracebpftrace
function@ = quantize(value)@ = hist(value)
function@ = lquantize(value, min, max, step)@ = lhist(value, min, max, step)
variablethis->name$name
variableself->name@name[tid]
variablename[key]@name[key]
variableglobal_name@global_name
variableself->name = 0delete(@name[tid])
variablecurthreadcurtask
variableprobeprov probemod probenamename
providerfbt::func:entrykprobe:func
providerfbt::func:returnkretprobe:func
providerpid$target::func:entryuprobe:func
providerpid$target::func:returnuretprobe:func
providerprofile:::99profile:hz:99
providerprofile:::tick-1secinterval:s:1

Примеры однострочников:


# Отслеживание задержек при чтении данных процессом с PID 181:

bpftrace -e 'kprobe:vfs_read /pid == 30153/ { @start[tid] = nsecs; }
kretprobe:vfs_read /@start[tid]/ { @ns = hist(nsecs - @start[tid]); delete(@start[tid]); }'


# Отображение новых процессов с аргументами их вызова
bpftrace -e 'tracepoint:syscalls:sys_enter_execve { join(args->argv); }'

# Отслеживание файлов, открытых процессами
bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)); }'

# Подсчёт системных вызовов с группировкой по приложениям
bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'

#  Подсчёт системных вызовов с группировкой по системным вызовам
bpftrace -e 'tracepoint:syscalls:sys_enter_* { @[name] = count(); }'

# Подсчёт системных вызовов с группировкой по процессам
bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[pid, comm] = count(); }'

# Размер данных в байтах, прочитанных процессом
bpftrace -e 'tracepoint:syscalls:sys_exit_read /args->ret/ { @[comm] = sum(args->ret); }'

# Активность обращения процессов к диску;
bpftrace -e 'tracepoint:block:block_rq_issue { printf("%d %s %d\n", pid, comm, args->bytes); }'

# Сведения об обращениях к не выделенным страницам памяти (page fault) с сортировкой по числу обращений; 
bpftrace -e 'software:major-faults:1 { @[comm] = count(); }'

# Сведения об обращениях к не выделенным страницам памяти (page fault) с сортировкой по процессам;
bpftrace -e 'software:faults:1 { @[comm] = count(); }'

# Профилирование стека процесса с PID 189 с частотой 99 Гц.

bpftrace -e 'profile:hz:99 /pid == 189/ { @[ustack] = count(); }'



  1. Главная ссылка к новости (http://www.brendangregg.com/bl...)
  2. OpenNews: В состав ядра 4.18 одобрено включение нового пакетного фильтра bpfilter
  3. OpenNews: Средства трассировки в ядре Linux достигли уровня DTrace
  4. OpenNews: perf-tools - новый набор утилит для анализа производительности в Linux
  5. OpenNews: Oracle перелицензировал код DTrace под GPLv2
  6. OpenNews: Выпуск Cilium 1.0, сетевой системы для Linux-контейнеров, основанной на BPF
Лицензия: CC-BY
Тип: Интересно / Программы
Ключевые слова: trace, dtrace, bpf, bpftrace
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (20) Ajax | 1 уровень | Линейный | Раскрыть всё | RSS
  • 1.1, КО (?), 15:43, 09/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    А еще eBPF, говорят, делает ненужными патчи от Meltdown. :)
     
     
  • 2.2, Аноним (2), 15:57, 09/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Ну была мысль у разработчиков ядра в переписке: при загрузке кода искать паттерны при которых программа лезет в чужую память. Получается этакий антивирус от аппаратных взломщиков. И я что-то сомневаюсь, что это будет скоро в ядре, наверняка там все не просто с реализацией.
     
     
  • 3.3, Cradle (?), 16:39, 09/10/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    что-то сдается мне что если эта штука со своим jit окажется в продакшен ядре, meltdown и иже с ними покажутся детсадовскими дразнилками. А так, на этапе отладки вещь очень полезная, интересно как она с mips и arm дружить будет.
     
     
  • 4.24, irinat (ok), 23:53, 20/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Что значит «если»? eBPF уже достаточно давно в ядре. Кажется, с 4.1. А в 4.7 из eBPF стало можно цепляться к tracepoints. Два года уже прошло.
     

  • 1.4, Аноним (4), 16:44, 09/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    > PID 181:
    > /pid == 30153/

    Это какая система счисления в какую конвертируется? Ну восьмеричная в правах файла ещё ладно, но это уже перебор.

     
  • 1.6, ПТЧК (?), 17:38, 09/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Парни там Dtrace портировали на винду!!!
     
     
  • 2.7, ПТЧК (?), 17:39, 09/10/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    https://youtu.be/tG8R5SQGPck?t=625
     

  • 1.9, Аноним (9), 07:31, 10/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    А всего то прошло 14 лет с того момента как это уже было реализовано в солярисе. Линукс очень инновационная и принципиально новая система (с)!
     
     
  • 2.10, Аноним (10), 09:23, 10/10/2018 [^] [^^] [^^^] [ответить]  
  • –1 +/
    А чего же это Брендан Грег вдруг решил DTrace 2.0 в первую очередь пилить для неинновационного Линукса? Как там Соплярис поживает (инновационно развивается)?
     
     
  • 3.12, Аноним (12), 12:57, 10/10/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > А чего же это Брендан Грег вдруг решил DTrace 2.0 в первую
    > очередь пилить для неинновационного Линукса? Как там Соплярис поживает (инновационно развивается)?

    Что, вантузянтику (ведь большая часть прикладного десктопного ПО пишется для винды, значит она по этой же логике намного более инновацонна и все такое) за запускаемого в WSL пингвина обидно стало?

     
     
  • 4.18, вантузятникбольшойлюбительприкладногоПО (?), 11:26, 12/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    конечно обидно, у нас-то только просто-DTrace, без цифирок!

    http://www.opennet.ru/openforum/vsluhforumID3/115534.html#6

     
  • 3.13, Ващенаглухо (ok), 13:03, 10/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Развивается, все в порядке не волнуйтесь.
     

  • 1.11, evkogan (?), 10:03, 10/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А зачем это, если SystemTap уже давно есть?
     
     
  • 2.15, Аноним (15), 09:31, 11/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    SystemTap не шибко удобен если ты до этого работал с dtrace
     
     
  • 3.17, Аноним (-), 09:58, 12/10/2018 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Бедные солярадмины, и тут их хроническая необучаемость вылезает.
     
     
  • 4.21, Аноним (21), 11:29, 12/10/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    берем - аккуратно патчим шаблончики из которых systemTap собирает свой модуль - и опа.. человечек сам грузит в ядро троянчик. Профит!
     
  • 2.20, Аноним (21), 11:28, 12/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    если для простейшей проверки необходимо поставить комплятор и собрать модуль местами очень кривой - это вроде как недостаток, а не достоинство.
     
     
  • 3.23, taptaptap (?), 11:52, 12/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    это достоинство - тебя никогда не уволят! ;-)

    P.S. но bpftrace, по-моему, часть этого достоинства унаследует

     
  • 2.22, taptaptap (?), 11:30, 12/10/2018 [^] [^^] [^^^] [ответить]  
  • +/
    он для другого - если ты не отлаживать собираешься, а кое-что подменить на ходу в чужом бинарнике, например.

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

    короче, если ты разработчик - тебе к dtrace, а если пришел что потырить ценное из чужой системы, то для тебя sytemtap.

     

  • 1.19, Аноним (21), 11:27, 12/10/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >Для компиляции скриптов BPFtrace в байткод BPF применяется бэкенд на базе LLVM.

    Вот же.. нет что бы gcc использовать.

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Слёрм
    Inferno Solutions
    Hosting by Ihor
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2019 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру