The OpenNET Project / Index page

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

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

Брендан Грег (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 обязательно
Обсуждение Ajax/Линейный | Раскрыть все сообщения | 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 дружить будет.
     
  • 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 [ответить] [показать ветку] [···]    [к модератору]  
  • +1 +/
    А всего то прошло 14 лет с того момента как это уже было реализовано в солярисе. Линукс очень инновационная и принципиально новая система (с)!
     
     
  • 2.10, Аноним (10), 09:23, 10/10/2018 [^] [ответить]    [к модератору]  
  • +/
    А чего же это Брендан Грег вдруг решил DTrace 2.0 в первую очередь пилить для неинновационного Линукса? Как там Соплярис поживает (инновационно развивается)?
     
     
  • 3.12, Аноним (12), 12:57, 10/10/2018 [^] [ответить]     [к модератору]  
  • +1 +/
    Что, вантузянтику ведь большая часть прикладного десктопного ПО пишется для вин... весь текст скрыт [показать]
     
     
  • 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 [^] [ответить]    [к модератору]  
  • –1 +/
    Бедные солярадмины, и тут их хроническая необучаемость вылезает.
     
     
  • 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:
    Заголовок:
    Текст:


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