Инструменты оценки производительности на основе BPF дают беспрецедентную возможность анализа систем и приложений. Вы сможете улучшить производительность, устранить проблемы в коде, повысить безопасность и сократить расходы. Книга «BPF: профессиональная оценка производительности» — ваш незаменимый гайд по применению этих инструментов.
Брендан Грегг — эксперт и пионер проекта BPF — представляет более 150 готовых инструментов анализа и отладки, рекомендации по их применению, а также пошаговые инструкции по разработке ваших собственных инструментов. Вы узнаете, как анализировать процессоры, память, дисковый ввод/ вывод, файловую систему, сети, языки программирования, приложения, контейнеры, гипервизоры, безопасность и ядро. Вы сможете выработать глубокое понимание того, как улучшить буквально любую Linux-систему или приложение.
Author(s): Брендан Грегг
Series: Для профессионалов
Edition: 1
Publisher: Питер
Year: 2024
Language: Russian
Commentary: Publisher's PDF
Pages: 880
City: СПб.
Tags: Linux; Linux Kernel; Profiling Networking; Tracing; Performance Analysis; Observability; Containers; eBPF
Предисловие
Вступление
Где могут пригодиться инструменты оценки производительности BPF?
Об этой книге
Новые инструменты
О графическом пользовательском интерфейсе
О версиях Linux
О чем здесь не рассказывается
Структура
Для кого эта книга
Авторские права на исходный код
Дополнительные материалы и ссылки
Условные обозначения
Благодарности
Об авторе
От издательства
Глава 1. Введение
1.1. Что такое BPF и eBPF?
1.2. Что такое трассировка, прослушивание, выборка, профилирование и наблюдаемость?
1.3. Что такое BCC, bpftrace и IO Visor?
1.4. Первый взгляд на BCC: быстрый анализ
1.5. Область видимости механизма трассировки BPF
1.6. Динамическая инструментация: kprobes и uprobes
1.7. Статическая инструментация: точки трассировки и USDT
1.8. Первый взгляд на bpftrace: трассировка open()
1.9. Назад к BCC: трассировка open()
1.10. Итоги
Глава 2. Основы технологии
2.1. BPF в иллюстрациях
2.2. BPF
2.3. Расширенный BPF (eBPF)
2.3.1. Зачем инструментам оценки производительности нужен BPF
2.3.2. BPF и модули ядра
2.3.3. Разработка программ для BPF
2.3.4. Обзор инструкций BPF: bpftool
2.3.5. Обзор инструкций BPF: bpftrace
2.3.6. BPF API
2.3.7. Управление конкурентностью в BPF
2.3.8. Интерфейс sysfs для BPF
2.3.9. BPF Type Format (BTF)
2.3.10. BPF CO-RE
2.3.11. Ограничения BPF
2.3.12. Дополнительные источники о BPF
2.4. Обход трассировки стека
2.4.1. Стеки на основе указателя на список фреймов
2.4.2. Использование отладочной информации
2.4.3. Last Branch Record (LBR)
2.4.4. ORC
2.4.5. Символы
2.4.6. Для дополнительного чтения
2.5. Флейм-графики
2.5.1. Трассировка стека
2.5.2. Профилирование трассировки стека
2.5.3. Флейм-график
2.5.4. Особенности флейм-графика
2.5.5. Разновидности
2.6. Источники событий
2.7. kprobes
2.7.1. Как работает kprobes
2.7.2. Интерфейсы kprobes
2.7.3. BPF и kprobes
2.7.4. Дополнительные источники информации о kprobes
2.8. uprobes
2.8.1. Как работает uprobes
2.8.2. Интерфейсы uprobes
2.8.3. BPF и uprobes
2.8.4. Оверхед uprobes и будущие улучшения
2.8.5. Дополнительные источники информации о uprobes
2.9. Точки трассировки
2.9.1. Инструментация точек трассировки
2.9.2. Как работают точки трассировки
2.9.3. Интерфейсы точек трассировки
2.9.4. BPF и точки трассировки
2.9.5. Неструктурированные точки трассировки в BPF
2.9.6. Дополнительные источники информации
2.10. USDT
2.10.1. Добавление поддержки USDT
2.10.2. Как работает USDT
2.10.3. BPF и USDT
2.10.4. Дополнительные источники информации о USDT
2.11. Динамический USDT
2.12. PMC
2.12.1. Режимы PMC
2.12.2. PEBS
2.12.3. Облачные вычисления
2.13. perf_events
2.14. Итоги
Глава 3. Анализ производительности
3.1. Обзор
3.1.1. Цели
3.1.2. Действия
3.1.3. Многочисленные проблемы производительности
3.2. Методологии оценки производительности
3.2.1. Определение характера рабочей нагрузки
3.2.2. Анализ с последовательным увеличением детализации
3.2.3. Метод USE
3.2.4. Чек-листы
3.3. Чек-лист инструментов Linux для анализа за 60 секунд
3.3.1. uptime
3.3.2. dmesg | tail
3.3.3. vmstat 1
3.3.4. mpstat -P ALL 1
3.3.5. pidstat 1
3.3.6. iostat -xz 1
3.3.7. free -m
3.3.8. sar -n DEV 1
3.3.9. sar -n TCP,ETCP 1
3.3.10. top
3.4. Чек-лист инструментов BCC
3.4.1. execsnoop
3.4.2. opensnoop
3.4.3 ext4slower
3.4.4. biolatency
3.4.5. biosnoop
3.4.6. cachestat
3.4.7. tcpconnect
3.4.8. tcpaccept
3.4.9. tcpretrans
3.4.10. runqlat
3.4.11. profile
3.5. Итоги
Глава 4. BCC
4.1. Компоненты BCC
4.2. Возможности BCC
4.2.1. Возможности в пространстве ядра
4.2.2. Возможности в пространстве пользователя
4.3. Установка BCC
4.3.1. Требования к конфигурации ядра
4.3.2. Ubuntu
4.3.3. RHEL
4.3.4. Другие дистрибутивы
4.4. Инструменты BCC
4.4.1. Инструменты, рассматриваемые в книге
4.4.2. Характеристики инструментов
4.4.3. Специализированные инструменты
4.4.4. Многоцелевые инструменты
4.5. funccount
4.5.1. Примеры funccount
4.5.2. Синтаксис funccount
4.5.3. Однострочные сценарии funccount
4.5.4. Порядок использования funccount
4.6. stackcount
4.6.1. Пример stackcount
4.6.2. Создание флейм-графиков с помощью stackcount
4.6.3. Искаженные трассировки
4.6.4. Синтаксис stackcount
4.6.5. Однострочные сценарии stackcount
4.6.6. Порядок использования stackcount
4.7. trace
4.7.1. Пример trace
4.7.2. Синтаксис trace
4.7.3. Однострочные сценарии trace
4.7.4. trace и структуры
4.7.5. Использование trace для отладки утечек дескрипторов файлов
4.7.6. Порядок использования trace
4.8. argdist
4.8.1. Синтаксис argdist
4.8.2. Однострочные сценарии argdist
4.8.3. Порядок использования argdist
4.9. Документация инструментов
4.9.1. Страница справочного руководства: opensnoop
4.9.2. Файл с примерами: opensnoop
4.10. Разработка инструментов BCC
4.11. Внутреннее устройство BCC
4.12. Отладка BCC
4.12.1. Отладка с помощью printf()
4.12.2. Отладочный вывод BCC
4.12.3. Флаги отладки BCC
4.12.4. bpflist
4.12.5. bpftool
4.12.6. dmesg
4.12.7. Сброс событий
4.13. Итоги
Глава 5. bpftrace
5.1. Компоненты bftrace
5.2. Возможности bpftrace
5.2.1. Источники событий bpftrace
5.2.2. Действия bpftrace
5.2.3. Общие возможности bpftrace
5.2.4. Сравнение bpftrace с другими инструментами мониторинга
5.3. Установка bpftrace
5.3.1. Требования к конфигурации ядра
5.3.2. Ubuntu
5.3.3. Fedora
5.3.4. Действия после сборки
5.3.5. Другие дистрибутивы
5.4. Инструменты bpftrace
5.4.1. Инструменты, рассматриваемые в книге
5.4.2. Характеристики инструментов
5.4.3. Использование инструментов
5.5. Однострочные сценарии bpftrace
5.6. Документация bpftrace
5.7. Программирование на bpftrace
5.7.1. Порядок использования
5.7.2. Структура программы
5.7.3. Комментарии
5.7.4. Формат определения зондов
5.7.5. Подстановочные символы в определениях зондов
5.7.6. Фильтры
5.7.7. Действия
5.7.8. Hello, World!
5.7.9. Функции
5.7.10. Переменные
5.7.11. Функции карт
5.7.12. Определение продолжительности выполнения vfs_read()
5.8. Порядок использования bpftrace
5.9. Типы зондов в bpftrace
5.9.1. tracepoint
5.9.2. usdt
5.9.3. kprobe и kretprobe
5.9.4. uprobe и uretprobe
5.9.5. software и hardware
5.9.6. profile и interval
5.10. Управление потоком выполнения в bpftrace
5.10.1. Фильтры
5.10.2. Тернарные операторы
5.10.3. Инструкция if
5.10.4. Развернутые циклы
5.11. Операторы bpftrace
5.12. Переменные bpftrace
5.12.1. Встроенные переменные
5.12.2. Встроенные переменные pid, comm и uid
5.12.3. Встроенные переменные kstack и ustack
5.12.4. Встроенные переменные: позиционные параметры
5.12.5. Временные переменные
5.12.6. Карты
5.13. Функции bpftrace
5.13.1. printf()
5.13.2. join()
5.13.3. str()
5.13.4. kstack() и ustack()
5.13.5. ksym() и usym()
5.13.6. kaddr() и uaddr()
5.13.7. system()
5.13.8. exit()
5.14. Функции-карты в bpftrace
5.14.1. count()
5.14.2. sum(), avg(), min() и max()
5.14.3. hist()
5.14.4. lhist()
5.14.5. delete()
5.14.6. clear() и zero()
5.14.7. print()
5.15. Направления развития bpftrace в будущем
5.15.1. Режимы явной адресации
5.15.2. Другие расширения
5.15.3. ply
5.16. Внутреннее устройство bpftrace
5.17. Отладка bpftrace
5.17.1. Отладка с помощью printf()
5.17.2. Режим отладки
5.17.3. Режим подробного вывода
5.18. Итоги
Глава 6. Процессоры
6.1. Основы
6.1.1. Основы работы процессоров
6.1.2. Возможности BPF
6.1.3. Стратегия
6.2. Традиционные инструменты
6.2.1. Статистика ядра
6.2.2. Статистика оборудования
6.2.3. Выборка характеристик работы оборудования
6.2.4. Выборка по времени
6.2.5. Получение статистик и трассировка событий
6.3. Инструменты BPF
6.3.1. execsnoop
6.3.2. exitsnoop
6.3.3. runqlat
6.3.4. runqlen
6.3.5. runqslower
6.3.6. cpudist
6.3.7. cpufreq
6.3.8. profile
6.3.9. offcputime
6.3.10. syscount
6.3.11. argdist и trace
6.3.12. funccount
6.3.13. softirqs
6.3.14. hardirqs
6.3.15. smpcalls
6.3.16. llcstat
6.3.17. Другие инструменты
6.4. Однострочные сценарии для BPF
6.4.1. BCC
6.4.2. bpftrace
6.5. Дополнительные упражнения
6.6. Итоги
Глава 7. Память
7.1. Основы
7.1.1. Основы управления памятью
7.1.2. Возможности BPF
7.1.3. Стратегия
7.2. Традиционные инструменты
7.2.1. Журнал ядра
7.2.2. Статистики ядра
7.2.3. Аппаратные статистики и выборки
7.3. Инструменты BPF
7.3.1. oomkill
7.3.2. memleak
7.3.3. mmapsnoop
7.3.4. brkstack
7.3.5. shmsnoop
7.3.6. faults
7.3.7. ffaults
7.3.8. vmscan
7.3.9. drsnoop
7.3.10. swapin
7.3.11. hfaults
7.3.12. Другие инструменты
7.4. Однострочные сценарии для BPF
7.4.1. BCC
7.4.2. bpftrace
7.5. Дополнительные упражнения
7.6. Итоги
Глава 8. Файловые системы
8.1. Основы
8.1.1. Основы файловых систем
8.1.2. Возможности BPF
8.1.3. Стратегия
8.2. Традиционные инструменты
8.2.1. df
8.2.2. mount
8.2.3. strace
8.2.4. perf
8.2.5. fatrace
8.3. Инструменты BPF
8.3.1. opensnoop
8.3.2. statsnoop
8.3.3. syncsnoop
8.3.4. mmapfiles
8.3.5. scread
8.3.6. fmapfault
8.3.7. filelife
8.3.8. vfsstat
8.3.9. vfscount
8.3.10. vfssize
8.3.11. fsrwstat
8.3.12. fileslower
8.3.13. filetop
8.3.14. writesync
8.3.15. filetype
8.3.16. cachestat
8.3.17. writeback
8.3.18. dcstat
8.3.19. dcsnoop
8.3.20. mountsnoop
8.3.21. xfsslower
8.3.22. xfsdist
8.3.23. ext4dist
8.3.24. icstat
8.3.25. bufgrow
8.3.26. readahead
8.3.27. Другие инструменты
8.4. Однострочные сценарии для BPF
8.4.1. BCC
8.4.2. bpftrace
8.4.3. Примеры использования однострочных сценариев BPF
8.5. Дополнительные упражнения
8.6. Итоги
Глава 9. Дисковый ввод/вывод
9.1. Основы
9.1.1. Основы дисков
9.1.2. Возможности BPF
9.1.3. Стратегия
9.2. Традиционные инструменты
9.2.1. iostat
9.2.2. perf
9.2.3. blktrace
9.2.4. Логирование SCSI
9.3. Инструменты BPF
9.3.1. biolatency
9.3.2. biosnoop
9.3.3. biotop
9.3.4. bitesize
9.3.5. seeksize
9.3.6. biopattern
9.3.7. biostacks
9.3.8. bioerr
9.3.9. mdflush
9.3.10. iosched
9.3.11. scsilatency
9.3.12. scsiresult
9.3.13. nvmelatency
9.4. Однострочные сценарии для BPF
9.4.1. BCC
9.4.2. bpftrace
9.4.3. Примеры использования однострочных сценариев BPF
9.5. Дополнительные упражнения
9.6. Итоги
Глава 10. Сети
10.1. Основы
10.1.1. Основы организации сетей
10.1.2. Возможности BPF
10.1.3. Стратегия
10.1.4. Типичные ошибки трассировки
10.2. Традиционные инструменты
10.2.1. ss
10.2.2. ip
10.2.3. nstat
10.2.4. netstat
10.2.5. sar
10.2.6. nicstat
10.2.7. ethtool
10.2.8. tcpdump
10.2.9. /proc
10.3. Инструменты BPF
10.3.1. sockstat
10.3.2. sofamily
10.3.3. soprotocol
10.3.4. soconnect
10.3.5. soaccept
10.3.6. socketio
10.3.7. socksize
10.3.8. sormem
10.3.9. soconnlat
10.3.10. so1stbyte
10.3.11. tcpconnect
10.3.12. tcpaccept
10.3.13. tcplife
10.3.14. tcptop
10.3.15. tcpsnoop
10.3.16. tcpretrans
10.3.17. tcpsynbl
10.3.18. tcpwin
10.3.19. tcpnagle
10.3.20. udpconnect
10.3.21. gethostlatency
10.3.22. ipecn
10.3.23. superping
10.3.24. qdisc-fq
10.3.25. qdisc-cbq, qdisc-cbs, qdisc-codel, qdisc-fq_codel, qdisc-red и qdisc-tbf
10.3.26. netsize
10.3.27. nettxlat
10.3.28. skbdrop
10.3.29. skblife
10.3.30. ieee80211scan
10.3.31. Другие инструменты
10.4. Однострочные сценарии для BPF
10.4.1. BCC
10.4.2. bpftrace
10.4.3. Примеры использования однострочных сценариев BPF
10.5. Дополнительные упражнения
10.6. Итоги
Глава 11. Безопасность
11.1. Основы
11.1.1. Возможности BPF
11.1.2. Непривилегированные пользователи BPF
11.1.3. Настройка безопасности BPF
11.1.4. Стратегия
11.2. Инструменты BPF
11.2.1. execsnoop
11.2.2. elfsnoop
11.2.3. modsnoop
11.2.4. bashreadline
11.2.5. shellsnoop
11.2.6. ttysnoop
11.2.7. opensnoop
11.2.8. eperm
11.2.9. tcpconnect и tcpaccept
11.2.10. tcpreset
11.2.11. capable
11.2.12. setuids
11.3. Однострочные сценарии для BPF
11.3.1. BCC
11.3.2. bpftrace
11.3.3. Примеры использования однострочных сценариев BPF
11.4. Итоги
Глава 12. Языки
12.1. Основы
12.1.1. Компилируемые языки
12.1.2. Языки с динамической компиляцией
12.1.3. Интерпретируемые языки
12.1.4. Возможности BPF
12.1.5. Стратегия
12.1.6. Инструменты BPF
12.2. C
12.2.1. Символы функций на C
12.2.2. Трассировка стека программного кода на C
12.2.3. Трассировка функций на C
12.2.4. Трассировка смещений в функциях на C
12.2.5. Трассировка программного кода на C с помощью зондов USDT
12.2.6. Трассировка программного кода на C с помощью однострочных сценариев
12.3. Java
12.3.1. Трассировка libjvm
12.3.2. jnistacks
12.3.3. Имена потоков выполнения в Java
12.3.4. Символы методов Java
12.3.5. Приемы трассировки стека Java
12.3.6. Зонды USDT в Java
12.3.7. profile
12.3.8. offcputime
12.3.9. stackcount
12.3.10. javastat
12.3.11. javathreads
12.3.12. javacalls
12.3.13. javaflow
12.3.14. javagc
12.3.15. javaobjnew
12.3.16. Однострочные сценарии для трассировки кода на Java
12.4. Командная оболочка bash
12.4.1. Подсчет вызовов функций
12.4.2. Трассировка аргументов функции (bashfunc.bt)
12.4.3. Задержки в функциях (bashfunclat.bt)
12.4.4. /bin/bash
12.4.5. Зонды USDT в /bin/bash
12.4.6. Однострочные сценарии для трассировки bash
12.5. Другие языки
12.5.1. JavaScript (Node.js)
12.5.2. C++
12.5.3. Golang
12.6. Итоги
Глава 13. Приложения
13.1. Основы
13.1.1. Основы приложений
13.1.2. Пример приложения: сервер MySQL
13.1.3. Возможности BPF
13.1.4. Стратегия
13.2. Инструменты BPF
13.2.1. execsnoop
13.2.2. threadsnoop
13.2.3. profile
13.2.4. threaded
13.2.5. offcputime
13.2.6. offcpuhist
13.2.7. syscount
13.2.8. ioprofile
13.2.9. Указатели фреймов в libc
13.2.10. mysqld_qslower
13.2.11. mysqld_clat
13.2.12. signals
13.2.13. killsnoop
13.2.14. pmlock и pmheld
13.2.15. naptime
13.2.16. Другие инструменты
13.3. Однострочные сценарии для BPF
13.3.1. BCC
13.3.2. bpftrace
13.4. Примеры использования однострочных сценариев BPF
13.4.1. Подсчет количества вызовов в секунду функций из библиотеки libpthread для доступа к условным переменным
13.5. Итоги
Глава 14. Ядро
14.1. Основы
14.1.1. Основы ядра
14.1.2. Возможности BPF
14.2. Стратегия
14.3. Традиционные инструменты
14.3.1. Ftrace
14.3.2. perf sched
14.3.3. slabtop
14.3.4. Другие инструменты
14.4. Инструменты BPF
14.4.1. loads
14.4.2. offcputime
14.4.3. wakeuptime
14.4.4. offwaketime
14.4.5. mlock и mheld
14.4.6. Спин-блокировки
14.4.7. kmem
14.4.8. kpages
14.4.9. memleak
14.4.10. slabratetop
14.4.11. numamove
14.4.12. workq
14.4.13. Тасклеты
14.4.14. Другие инструменты
14.5. Однострочные сценарии для BPF
14.5.1. BCC
14.5.2. bpftrace
14.6. Примеры использования однострочных сценариев BPF
14.6.1. Подсчет обращений к системным вызовам по именам функций системных вызовов
14.6.2. Подсчет запусков hrtimer функциями ядра
14.7. Сложности
14.8. Итоги
Глава 15. Контейнеры
15.1. Основы
15.1.1. Возможности BPF
15.1.2. Сложности
15.1.3. Стратегия
15.2. Традиционные инструменты
15.2.1. Анализ на уровне хоста
15.2.2. Анализ на уровне контейнера
15.2.3. systemd-cgtop
15.2.4. kubectl top
15.2.5. docker stats
15.2.6. /sys/fs/cgroups
15.2.7. perf
15.3. Инструменты BPF
15.3.1. runqlat
15.3.2. pidnss
15.3.3. blkthrot
15.3.4. overlayfs
15.4. Однострочные сценарии для BPF
15.5. Дополнительные упражнения
15.6. Итоги
Глава 16. Гипервизоры
16.1. Основы
16.1.1. Возможности BPF
16.1.2. Возможные стратегии
16.2. Традиционные инструменты
16.3. Инструменты BPF для анализа на уровне гостевой ОС
16.3.1. Гипервызовы Xen
16.3.2. xenhyper
16.3.3. Обратные вызовы Xen
16.3.4. cpustolen
16.3.5. Трассировка выходов в HVM
16.4. Инструменты BPF анализа на уровне хоста
16.4.1. kvmexits
16.4.2. Возможные направления развития в будущем
16.5. Итоги
Глава 17. Другие инструменты BPF для анализа производительности
17.1. Vector и Performance Co-Pilot (PCP)
17.1.1. Визуализация
17.1.2. Визуализация: тепловые карты
17.1.3. Визуализация: табличное представление данных
17.1.4. Метрики BCC
17.1.5. Внутреннее устройство
17.1.6. Установка PCP и Vector
17.1.7. Подключение и просмотр данных
17.1.8. Настройка BCC PMDA
17.1.9. Возможные направления развития в будущем
17.1.10. Для дополнительного чтения
17.2. Grafana и Performance Co-Pilot (PCP)
17.2.1. Установка и настройка
17.2.2. Подключение и просмотр данных
17.2.3. Возможные направления развития в будущем
17.2.4 Для дополнительного чтения
17.3. Экспортер Cloudflare eBPF Prometheus (с Grafana)
17.3.1. Сборка и запуск экспортера ebpf
17.3.2. Настройка Prometheus для мониторинга экземпляра ebpf_exporter
17.3.3. Создание запроса в Grafana
17.3.4. Для дополнительного чтения
17.4. kubectl-trace
17.4.1. Трассировка узлов
17.4.2. Трассировка подов и контейнеров
17.4.3. Для дополнительного чтения
17.5. Другие инструменты
17.6. Итоги
Глава 18. Советы, рекомендации и типичные проблемы
18.1. Типичная частота событий и оверхед
18.1.1. Частота
18.1.2. Выполняемые действия
18.1.3. Проверяй себя
18.2. Выборка с частотой 49 или 99 Гц
18.3. Желтые свиньи и серые крысы
18.4. Пишите целевое ПО
18.5. Изучайте системные вызовы
18.6. Не усложняйте
18.7. Отсутствие событий
18.8. Отсутствие трассировок стека
18.8.1. Как исправить проблему отсутствия трассировок стека
18.9. Отсутствие символов (имен функций) в выводе
18.9.1. Как исправить проблему отсутствия символов: среда выполнения с JIT (Java, Node.js, ...)
18.9.2. Как исправить проблему отсутствия символов: двоичные файлы ELF (C, C++, ...)
18.10. Отсутствие функций в трассировке
18.11. Циклы обратной связи
18.12. Сброс событий
Приложение A. Однострочные сценарии для bpftrace
Приложение B. Шпаргалка по bpftrace
Приложение C. Разработка инструментов BCC
Ресурсы
Пять советов
Примеры инструментов
Инструмент 1: hello_world.py
Инструмент 2: sleepsnoop.py
Инструмент 3: bitehist.py
Инструмент 4: biolatency
Дополнительная информация
Приложение D. C BPF
Почему на C?
Пять советов
Программы на C
ВНИМАНИЕ: изменения в API
Компиляция
Инструмент 1: Hello, World!
Инструмент 2: bigreads
Инструмент 3: bitehist
perf C
Инструмент 1: bigreads
Дополнительная информация
Приложение E. Инструкции BPF
Вспомогательные макросы
Инструкции
Кодирование
Ссылки
Глоссарий
Библиография