The OpenNET Project / Index page

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

Средства трассировки в ядре Linux достигли уровня DTrace

29.10.2016 08:50

Брендан Грег (Brendan Gregg), один из разработчиков DTrace, считает, что с добавлением в ядро Linux 4.9 хронометрированных выборок (timed sampling), средства для анализа производительности на базе BPF достигли уровня функциональности DTrace. По мнению Брендана Грега, это очень важное достижение и в Linux теперь доступны полноценные средства для анализа производительности приложения и ядра с использованием готовой для промышленного применения системы, создающей минимальную фоновую нагрузку и позволяющей использовать такие расширенные возможности как гистограммы задержек и счётчики частоты.

Отмечается, что несмотря на то, что BPF не предоставляет высокоуровневый язык как в DTrace, доступные фронтэнды сглаживают эту особенность и достаточны для создания различных инструментов, некоторые из которых построены по мотивам старого DTraceToolkit. Для конечного пользователя трассировка с использованием инструментов на базе BPF и написание однострочных сценариев окажется не сложнее DTrace. Но для разработки новых инструментов на базе BPF пока требуется заметно больше усилий - предоставляемый в DTrace язык D, похожий на AWK, значительно проще для написания сценариев трассировки, чем предлагаемые для BPF средства написания обработчиков на языках C, Python и Lua с внешними библиотеками.

Основные возможности системы трассировки ядра Linux (по состоянию на 4.9rc1):

  • Динамическая трассировка на уровне ядра (BPF для kprobes);
  • Динамическая трассировка пространства пользователя (BPF для uprobes);
  • Статическая трассировка на уровне ядра (BPF для tracepoints);
  • Обработка событий с сохранением хронометража (BPF с perf_event_open);
  • События PMC (BPF с perf_event_open);
  • Фильтрация (через программы BPF);
  • Отладочный вывод (bpf_trace_printk());
  • Вывод в привязке к отдельным событиям (bpf_perf_event_output());
  • Использование переменных (глобальные и привязанные к потокам переменные, реализуемые через BPF maps);
  • Ассоциативные массивы (через BPF maps);
  • Подсчёт частоты выполнения операций (через BPF maps);
  • Гистограммы (квадратичные, линейные и произвольные через BPF maps)
  • Учёт времени выполнения операций и разницы во времени (через bpf_ktime_get_ns() и программы BPF);
  • Трассировка стека ядра (BPF stackmap);
  • Трассировка стека пользовательских процессов (BPF stackmap);
  • Переопределение кольцевых буферов (perf_event_attr.write_backward).

Примеры использования некоторых утилит из набора bcc для решения задач трассировки:

  • Отслеживание новых процессов:
    # execsnoop
    PCOMM            PID    RET ARGS
    bash             15887    0 /usr/bin/man ls
    preconv          15894    0 /usr/bin/preconv -e UTF-8
    man              15896    0 /usr/bin/tbl
    man              15897    0 /usr/bin/nroff -mandoc -rLL=169n -rLT=169n -Tutf8
    man              15898    0 /usr/bin/pager -s
    nroff            15900    0 /usr/bin/locale charmap
    nroff            15901    0 /usr/bin/groff -mtty-char -Tutf8 -mandoc -rLL=169n -rLT=169n
    groff            15902    0 /usr/bin/troff -mtty-char -mandoc -rLL=169n -rLT=169n -Tutf8
    groff            15903    0 /usr/bin/grotty
    
  • Гистограмма задержек ввода/вывода:
    # biolatency -m
    Tracing block device I/O... Hit Ctrl-C to end.
    ^C
         msecs           : count     distribution
           0 -> 1        : 96       |************************************  |
           2 -> 3        : 25       |*********                             |
           4 -> 7        : 29       |***********                           |
           8 -> 15       : 62       |***********************               |
          16 -> 31       : 100      |**************************************|
          32 -> 63       : 62       |***********************               |
          64 -> 127      : 18       |******                                |
    
  • Отслеживание типовых операций в ФС ext4, выполняемых дольше 5 мс:
    # ext4slower 5
    Tracing ext4 operations slower than 5 ms
    TIME     COMM           PID    T BYTES   OFF_KB   LAT(ms) FILENAME
    21:49:45 supervise      3570   W 18      0           5.48 status.new
    21:49:48 supervise      12770  R 128     0           7.55 run
    21:49:48 run            12770  R 497     0          16.46 nsswitch.conf
    21:49:48 run            12770  R 1680    0          17.42 netflix_environment.sh
    21:49:48 run            12770  R 1079    0           9.53 service_functions.sh
    21:49:48 run            12772  R 128     0          17.74 svstat
    21:49:48 svstat         12772  R 18      0           8.67 status
    21:49:48 run            12774  R 128     0          15.76 stat
    21:49:48 run            12777  R 128     0           7.89 grep
    21:49:48 run            12776  R 128     0           8.25 ps
    21:49:48 run            12780  R 128     0          11.07 xargs
    21:49:48 ps             12776  R 832     0          12.02 libprocps.so.4.0.0
    21:49:48 run            12779  R 128     0          13.21 cut
    [...]
    
  • Отслеживание новых активных соединений по TCP (connect()):

    # tcpconnect
    PID    COMM         IP SADDR            DADDR            DPORT
    1479   telnet       4  127.0.0.1        127.0.0.1        23
    1469   curl         4  10.201.219.236   54.245.105.25    80
    1469   curl         4  10.201.219.236   54.67.101.145    80
    1991   telnet       6  ::1              ::1              23
    2015   ssh          6  fe80::2000:bff:fe82:3ac fe80::2000:bff:fe82:3ac 22
    
  • Отслеживание отзывчивости DNS при обработке библиотечных вызовов getaddrinfo()/gethostbyname():

    # gethostlatency
    TIME      PID    COMM          LATms HOST
    06:10:24  28011  wget          90.00 www.iovisor.org
    06:10:28  28127  wget           0.00 www.iovisor.org
    06:10:41  28404  wget           9.00 www.netflix.com
    06:10:48  28544  curl          35.00 www.netflix.com.au
    06:11:10  29054  curl          31.00 www.plumgrid.com
    06:11:16  29195  curl           3.00 www.facebook.com
    06:11:25  29404  curl          72.00 foo
    06:11:28  29475  curl           1.00 foo
    
  • Суммарные данные о типах операций VFS, обновляемые ежесекундно:

    # vfsstat
    TIME         READ/s  WRITE/s CREATE/s   OPEN/s  FSYNC/s
    18:35:32:       231       12        4       98        0
    18:35:33:       274       13        4      106        0
    18:35:34:       586       86        4      251        0
    18:35:35:       241       15        4       99        0
    
  • Определение вызовов, ожидающих выполнения (off-CPU) в ядре и пространстве пользователя для заданного PID:
    # offcputime -d -p 24347
    Tracing off-CPU time (us) of PID 24347 by user + kernel stack... Hit Ctrl-C to end.
    ^C
    [...]
        ffffffff810a9581 finish_task_switch
        ffffffff8185d385 schedule
        ffffffff81085672 do_wait
        ffffffff8108687b sys_wait4
        ffffffff81861bf6 entry_SYSCALL_64_fastpath
        --
        00007f6733a6b64a waitpid
        -                bash (24347)
            4952
    
        ffffffff810a9581 finish_task_switch
        ffffffff8185d385 schedule
        ffffffff81860c48 schedule_timeout
        ffffffff810c5672 wait_woken
        ffffffff8150715a n_tty_read
        ffffffff815010f2 tty_read
        ffffffff8122cd67 __vfs_read
        ffffffff8122df65 vfs_read
        ffffffff8122f465 sys_read
        ffffffff81861bf6 entry_SYSCALL_64_fastpath
        --
        00007f6733a969b0 read
        -                bash (24347)
            1450908
    
  • Отслеживание задержек при выполнении запросов MySQL:
    # mysqld_qslower `pgrep -n mysqld`
    Tracing MySQL server queries for PID 14371 slower than 1 ms...
    TIME(s)        PID          MS QUERY
    0.000000       18608   130.751 SELECT * FROM words WHERE word REGEXP '^bre.*n$'
    2.921535       18608   130.590 SELECT * FROM words WHERE word REGEXP '^alex.*$'
    4.603549       18608    24.164 SELECT COUNT(*) FROM words
    9.733847       18608   130.936 SELECT count(*) AS count FROM words WHERE word REGEXP '^bre.*n$'
    17.864776      18608   130.298 SELECT * FROM words WHERE word REGEXP '^bre.*n$' ORDER BY word
    
  • Использование утилиты multi-tool для слежения за запросами входа в систему, обрабатываемыми через PAM:

    # trace 'pam:pam_start "%s: %s", arg1, arg2'
    TIME     PID    COMM         FUNC             -
    17:49:45 5558   sshd         pam_start        sshd: root
    17:49:47 5662   sudo         pam_start        sudo: root
    17:49:49 5727   login        pam_start        login: bgregg
    


  1. Главная ссылка к новости (http://www.brendangregg.com/bl...)
  2. OpenNews: Компания Oracle представила первый стабильный релиз DTrace для Linux
  3. OpenNews: Выход ktap 0.2, системы динамической трассировки для ядра Linux
  4. OpenNews: Google готовит к открытию систему трассировки XRay
  5. OpenNews: Выпуск платформы динамической трассировки приложений Frida
  6. OpenNews: Выпуск системы динамической отладки SystemTap 3.0
Лицензия: CC-BY
Тип: Обобщение
Ключевые слова: dtrace, bpf, trace, debug
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (18) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (-), 11:03, 29/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    А чем их SystemTap не устроил, что начали прикручивать BPF? Там и синтаксис достаточно близок к DTrace.
     
     
  • 2.4, Ван хуй (?), 11:32, 29/10/2016 [^] [^^] [^^^] [ответить]  
  • +6 +/
    Тем что системтап - это загрузка кода в ядро от балды
     
     
  • 3.19, Аноним (-), 19:27, 30/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Тем что системтап - это загрузка кода в ядро от балды

    А тут вгрузка кода BPF VM от балды, что не сильно лучше.

     
  • 2.5, Меломан1 (?), 11:36, 29/10/2016 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Red Hat не дает им испоганить SystemTap. Вот и стали изобретать велосипед.
     

  • 1.2, Аноним (-), 11:04, 29/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Это очень хорошая новость!
     
  • 1.3, freehck (ok), 11:30, 29/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +7 +/
    > # gethostlatency
    > TIME      PID    COMM          LATms HOST
    > 06:10:24  28011  wget          90.00 www.iovisor.org

    Вот оно, время суток, когда разрабатывается СПО.

     
     
  • 2.6, Анином (?), 11:53, 29/10/2016 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Да неее. Просто локаль не не могут настроить никак.
     

  • 1.11, exSun (?), 22:54, 29/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Слишком рано выпустили. Без удобного фронтенда никто этим толком пользоваться не станет. DTrace на солярисе взлетел, во многом, только потому, что писать кастомные скрипты было действительно просто. Но саму идею горячо поддерживаю.
     
     
  • 2.13, Фкук (?), 23:26, 29/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Без удобного фронтенда никто этим толком пользоваться не станет...

    Станет.

     
     
  • 3.15, exSun (?), 23:30, 29/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Станет.

    Ну не знаю... Разве что найдётся тот, кто это будет люто неистово продвигать. Тот же Брендан DTrace форсил мощно (но ему много кто помогал), может, и выйдет у него что-то.


     
     
  • 4.24, Аноним (-), 20:08, 30/10/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Ну не знаю... Разве что найдётся тот, кто это будет люто неистово продвигать.

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

    > Тот же Брендан DTrace форсил мощно (но ему много кто
    > помогал), может, и выйдет у него что-то.

    Мы любим пингвин не за меркетинговый булшит от слащавых корпораций и каких-то брэнданов, что-то там форсящих. А за то как все это работает и какие возможности дает. Это самый лучший пиар который операционка может продемонстрирвать.

     
     
  • 5.26, SnoWLight (?), 12:45, 01/11/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Солярис годится для всего. Выпрямите руки и юзайте SmartOS https://www.joyent.com/smartos
     
     
  • 6.27, Аноним (-), 14:59, 01/11/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Солярис годится для всего.

    Это очень громкое заявление. А покажете на этом карманный роутер, на MIPS, с 8 мегами флеша и 32 мегами оперативки? А как насчет запилить на этом умный телевизор? Или там планшет какой? Ну если уж для всего - у меня богатая фантазия.

    > Выпрямите руки и юзайте SmartOS https://www.joyent.com/smartos

    Опять нечто от единственной компании, так что фирмочка будет давиться жабой и все загнется вместе с фирмочкой?

     
  • 2.23, Аноним (-), 19:43, 30/10/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Слишком рано выпустили. Без удобного фронтенда никто этим толком пользоваться не станет.

    Во первых, у нас принято release early, release often.
    Во вторых, отучаемся говорить за всех.

    > DTrace на солярисе взлетел, во многом, только потому, что писать кастомные
    > скрипты было действительно просто. Но саму идею горячо поддерживаю.

    И где все эти летуны вместе со своим солярисом, позвольте поинтересоваться?

     

  • 1.14, Аноним (-), 23:30, 29/10/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    то что было в python 100 лет теперь есть в Си и в ядре
     
     
  • 2.16, exSun (?), 23:32, 29/10/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > то что было в python 100 лет теперь есть в Си и
    > в ядре

    Пистонность нынешней имплементации, конечно, печалит.

     
  • 2.20, Аноним (-), 19:37, 30/10/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > то что было в python 100 лет теперь есть в Си и в ядре

    А теперь попробуй на питоне написать кернел операционки. Желательно со скоростью похожей на сишный код. Хотя-бы не профилированный. А так радости с хороших инструментов? Ну ок, обнаружил ты что в твоем питоне тормозит абсолютно все. Дальше что?

     
  • 2.25, Мяут (ok), 12:21, 31/10/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Написать трассировщик не проблема, ptrace и основанный на нем ltrace (ну или truss) не вчера придумали. Написать трассировщик, который дает просадку в производительности не более чем в единицы -- вот задача (и даже для Питона она актуальна).

    По сабжу, без нормального скриптового языка пока смотрится подозрительно. Ну и 4.9 ой как не везде. Поэтому придется дальше SystemTap'ом пользоваться, а там глядишь к RH7 и на BPF его перетянут :)

     

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



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

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