Производительность систем

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

Книга посвящена концепциям, стратегиям, инструментам и настройке операционных систем и приложений на примере систем на базе Linux. Понимание этих инструментов и методов критически важно при разработке современного ПО. Применение стратегий, изложенных в обновленном и переработанном издании, позволит перформанс-инженерам улучшить взаимодействие с конечными пользователями и снизить затраты, особенно для облачных сред. Брендан Грегг — эксперт в области производительности систем и автор нескольких бестселлеров лаконично, но емко излагает наиболее важные сведения о работе операционных систем, оборудования и приложений, которые позволят специалистам быстро добиться результатов, даже если раньше они никогда не занимались анализом производительности. Далее автор дает детальные объяснения по применению современных инструментов и методов, включая расширенный BPF, и показывает, как добиться максимальной эффективности ваших систем в облачных, веб- и крупных корпоративных средах.

Author(s): Брендан Грегг
Series: Для профессионалов
Edition: 2
Publisher: Питер
Year: 2023

Language: Russian
Pages: 992
City: СПб.

Краткое содержание
Оглавление
Предисловие
Об этом издании
Об этой книге
Рассматриваемые операционные системы
Другие материалы
О чем здесь не рассказывается
Структура
Применимость в будущем
Примеры трассировки
Для кого эта книга
Условные обозначения
Дополнительные источники, ссылки и библиография
Благодарности
Об авторе
От издательства
Глава 1. Введение
1.1. Производительность системы
1.2. Роли
1.3. Действия
1.4. Перспективы
1.5. Сложности оценки производительности
1.5.1. Субъективность
1.5.2. Сложность
1.5.3. Множественные причины
1.5.4. Множественные проблемы с производительностью
1.6. Задержка
1.7. Наблюдаемость
1.7.1. Счетчики, статистики и метрики
1.7.2. Профилирование
1.7.3. Трассировка
Точки статической инструментации
Динамическая инструментация
BPF
1.8. Эксперименты
1.9. Облачные вычисления
1.10. Методологии
1.10.1. Анализ производительности Linux за 60 секунд
1.11. Практические примеры
1.11.1. Медленные диски
1.11.2. Изменение в программном обеспечении
1.11.3. Дополнительное чтение
1.12. Ссылки
Глава 2. Методологии
2.1. Терминология
2.2. Модели
2.2.1. Тестируемая система
2.2.2. Система массового обслуживания
2.3. Основные понятия
2.3.1. Задержка
2.3.2. Шкалы времени
2.3.3. Компромиссы
2.3.4. Настройка производительности
2.3.5. Целесообразность
2.3.6. Когда лучше остановить анализ
2.3.7. Рекомендации действительны на данный момент времени
2.3.8. Нагрузка и архитектура
2.3.9. Масштабируемость
2.3.10. Метрики
Оверхед
Проблемы
2.3.11. Потребление
По времени
По мощности
2.3.12. Насыщенность
2.3.13. Профилирование
2.3.14. Кэширование
Алгоритмы
Горячие, холодные и теплые кэши
2.3.15. Известные неизвестные
2.4. Точки зрения
2.4.1. Анализ ресурсов
2.4.2. Анализ рабочей нагрузки
2.5. Методология
2.5.1. Антиметодология «уличный фонарь»
2.5.2. Антиметодология «случайное изменение»
2.5.3. Антиметодология «виноват кто-то другой»
2.5.4. Специальный чек-лист
2.5.5. Формулировка проблемы
2.5.6. Научный метод
Пример (наблюдение)
Пример (эксперимент)
Пример (эксперимент)
2.5.7. Цикл диагностики
2.5.8. Метод инструментов
2.5.9. Метод USE
Процедура
Выражение метрик
Список ресурсов
Функциональная блок-схема
Метрики
Программные ресурсы
Возможные интерпретации
Управление ресурсами
Микросервисы
2.5.10. Метод RED
2.5.11. Определение характеристик рабочей нагрузки
2.5.12. Анализ с увеличением детализации
Пять «почему»
2.5.13. Анализ задержек
2.5.14. Метод R
2.5.15. Трассировка событий
2.5.16. Базовые статистики
2.5.17. Статическая настройка производительности
2.5.18. Настройка кэширования
2.5.19. Микробенчмаркинг производительности
2.5.20. Мантры производительности
2.6. Моделирование
2.6.1. Корпоративные и облачные среды
2.6.2. Визуальная идентификация
2.6.3. Закон Амдала
2.6.4. Универсальный закон масштабируемости
2.6.5. Теория массового обслуживания
Нотация Кендалла
M/D/1 и 60 %-ное потребление
2.7. Планирование емкости
2.7.1. Пределы ресурсов
2.7.2. Факторный анализ
2.7.3. Решения масштабирования
2.8. Статистики
2.8.1. Количественная оценка прироста производительности
С помощью наблюдений
С помощью экспериментов
2.8.2. Усреднение
Среднее геометрическое
Среднее гармоническое
Усреднение по времени
Затухающее среднее
Ограничения
2.8.3. Стандартное отклонение, процентили, медиана
2.8.4. Коэффициент вариации
2.8.5. Мультимодальные распределения
2.8.6. Выбросы
2.9. Мониторинг
2.9.1. Временные закономерности
2.9.2. Инструменты мониторинга
2.9.3. Сводная статистика, накопленная с момента загрузки
2.10. Визуализация
2.10.1. Линейная диаграмма
2.10.2. Диаграммы рассеяния
2.10.3. Тепловые карты
2.10.4. Временная шкала
2.10.5. График поверхности
2.10.6. Инструменты визуализации
2.11. Упражнения
2.12. Ссылки
Глава 3. Операционные системы
3.1. Терминология
3.2. Основы
3.2.1. Ядро
Выполнение ядра
3.2.2. Ядро и пользовательские режимы
3.2.3. Системные вызовы
3.2.4. Прерывания
Асинхронные прерывания
Синхронные прерывания
Потоки выполнения для обработки прерываний
Маскировка прерываний
3.2.5. Часы и бездействие
Поток бездействия
3.2.6. Процессы
Создание процесса
Жизненный цикл процесса
Среда процесса
3.2.7. Стеки
Как читать стеки
Стеки в пространствах пользователя и ядра
3.2.8. Виртуальная память
Управление памятью
3.2.9. Планировщики
3.2.10. Файловая система
VFS
Стек ввода/вывода
3.2.11. Кэширование
3.2.12. Сеть
3.2.13. Драйверы устройств
3.2.14. Многопроцессорность
IPI
3.2.15. Вытеснение
3.2.16. Управление ресурсами
3.2.17. Наблюдаемость
3.3. Ядра
3.3.1. Unix
3.3.2. BSD
3.3.3. Solaris
3.4. Linux
3.4.1. Новые разработки в ядре Linux
3.4.2. systemd
3.4.3. KPTI (Meltdown)
3.4.4. Расширенный BPF
3.5. Другие темы
3.5.1. Ядра PGO
3.5.2. Одноцелевые ядра
3.5.3. Микроядра и гибридные ядра
3.5.4. Распределенные операционные системы
3.6. Сравнение ядер
3.7. Упражнения
3.8. Ссылки
3.8.1. Дополнительное чтение
Глава 4. Инструменты наблюдения
4.1. Покрытие инструментами
4.1.1. Инструменты статического анализа производительности
4.1.2. Инструменты анализа кризисных ситуаций
4.2. Типы инструментов
4.2.1. Фиксированные счетчики
Инструменты для анализа системы в целом
Инструменты для анализа отдельных процессов
4.2.2. Профилирование
Инструменты для анализа системы в целом
Инструменты для анализа отдельных процессов
4.2.3. Трассировка
Инструменты для анализа системы в целом
Инструменты для анализа отдельных процессов
4.2.4. Мониторинг
sar(1)
SNMP
Агенты
4.3. Источники информации
4.3.1. /proc
Статистики по процессам
Общесистемные статистики
Точность статистик процессора
Содержимое файла
4.3.2. /sys
4.3.3. Учет задержек
4.3.4. netlink
4.3.5. Точки трассировки
Пример использования точек трассировки
Аргументы и строка формата точки трассировки
Интерфейс точек трассировки
Оверхед точек трассировки
Документация с описанием точек трассировки
4.3.6. kprobes
Пример использования kprobes
Аргументы kprobes
kretprobes
Интерфейс и оверхед kprobes
Документация с описанием kprobes
4.3.7. uprobes
Пример использования uprobes
Аргументы uprobes
uretprobes
Интерфейс и оверхед uretprobes
Документация с описанием uprobe
4.3.8. USDT
Документация с описанием USDT
4.3.9. Аппаратные счетчики (PMC)
Примеры PMC
Интерфейс PMC
Проблемы PMC
Документация с описанием PMC
4.3.10. Другие источники информации для наблюдения
И другие…
Kstat в Solaris
4.4. sar
4.4.1. Область покрытия sar(1)
4.4.2. Мониторинг с sar(1)
Конфигурация (Ubuntu)
Получение отчетов
Форматы вывода
JSON (-j)
SVG (-g)
CSV (-d)
4.4.3. Вывод оперативной информации с помощью sar(1)
4.4.4. Документация с описанием sar(1)
4.5. Инструменты трассировки
4.6. Наблюдение за наблюдаемостью
4.7. Упражнения
4.8. Ссылки
Глава 5. Приложения
5.1. Основы приложений
5.1.1. Цель
Apdex
5.1.2. Оптимизация общего случая
5.1.3. Наблюдаемость
5.1.4. Нотация «О-большое»
5.2. Методы повышения производительности приложений
5.2.1. Выбор размеров блоков ввода/вывода
5.2.2. Кэширование
5.2.3. Буферизация
5.2.4. Опрос
Системный вызов poll()
5.2.5. Конкурентность и параллелизм
Примитивы синхронизации
Хеш-таблицы
5.2.6. Неблокирующий ввод/вывод
5.2.7. Привязка к процессору
5.2.8. Мантры производительности
5.3. Языки программирования
5.3.1. Компилируемые языки
Оптимизации компилятора
5.3.2. Интерпретируемые языки
5.3.3. Виртуальные машины
5.3.4. Сборка мусора
5.4. Методология
5.4.1. Профилирование процессора
Флейм-графики потребления процессора
Определение следов ожидания вне процессора
5.4.2. Анализ времени ожидания вне процессора
Флейм-графики времени вне процессора
Время простоя
5.4.3. Анализ системных вызовов
5.4.4. Метод USE
5.4.5. Анализ состояния потока
Девять состояний
Linux
Анализ косвенных признаков
Анализ времени вне процессора
Прямое измерение
5.4.6. Анализ блокировок
5.4.7. Настройка статической производительности
5.4.8. Распределенная трассировка
5.5. Инструменты наблюдения
5.5.1. perf
Профилирование процессора
Флейм-графики процессорного времени
Трассировка системных вызовов
Анализ времени выполнения в ядре
Профилирование ввода/вывода
5.5.2. profile
5.5.3. offcputime
Флейм-графики времени вне процессора
5.5.4. strace
Оверхед strace
5.5.5. execsnoop
5.5.6. syscount
5.5.7. bpftrace
Трассировка сигналов
Профилирование ввода/вывода
Трассировка блокировок
Внутренние особенности приложения
5.6. Проблемы
5.6.1. Отсутствие символов
Двоичные файлы ELF (C, C++, ...)
Среды выполнения с JIT-компиляцией (Java, Node.js, ...)
5.6.2. Отсутствие стеков
5.7. Упражнения
5.8. Ссылки
Глава 6. Процессоры
6.1. Терминология
6.2. Модели
6.2.1. Архитектура процессора
6.2.2. Кэш-память процессора
6.2.3. Очереди на выполнение
6.3. Понятия
6.3.1. Тактовая частота
6.3.2. Инструкции
6.3.3. Вычислительный конвейер
Предсказатель ветвлений
6.3.4. Ширина инструкций
6.3.5. Размеры инструкций
6.3.6. SMT
6.3.7. IPC, CPI
6.3.8. Потребление
6.3.9. Время в режиме пользователя/ядра
6.3.10. Насыщенность
6.3.11. Вытеснение
6.3.12. Инверсия приоритета
6.3.13. Несколько процессов, несколько потоков
6.3.14. Размер слова
6.3.15. Оптимизации компилятора
6.4. Архитектура
6.4.1. Аппаратное обеспечение
Микросхема процессора
P-состояния и C-состояния
Кэши процессора
Задержка
Ассоциативность
Строки кэша
Согласование кэшей
Блок управления памятью
Соединения между процессорами
Аппаратные счетчики производительности (PMC)
Графические процессоры
Другие ускорители
6.4.2. Программное обеспечение
Планировщик
Классы планирования
Поток бездействия
Группировка NUMA
Учет ресурсов процессоров
6.5. Методология
6.5.1. Метод инструментов
6.5.2. Метод USE
6.5.3. Определение характеристик рабочей нагрузки
Чек-лист для определения дополнительных характеристик рабочей нагрузки
6.5.4. Профилирование
Обработка трассировок
Интерпретация профиля
Дополнительная информация
6.5.5. Анализ тактов
6.5.6. Мониторинг производительности
6.5.7. Статическая настройка производительности
6.5.8. Настройка приоритетов
6.5.9. Управление ресурсами
6.5.10. Привязка к процессору
6.5.11. Микробенчмаркинг
6.6. Инструменты наблюдения
6.6.1. uptime
Средние значения нагрузки
Pressure Stall Information (PSI)
6.6.2. vmstat
6.6.3. mpstat
6.6.4. sar
6.6.5. ps
6.6.6. top
6.6.7. pidstat
6.6.8. time, ptime
6.6.9. turbostat
6.6.10. showboost
6.6.11. pmcarch
6.6.12. tlbstat
6.6.13. perf
Однострочные сценарии
Профилирование процессора в масштабе всей системы
Флейм-графики процессора
Параметры
Профилирование отдельных процессов
Задержка планировщика
Счетчики PMC (аппаратные события)
Выбор аппаратного события
Трассировка программного обеспечения
Аппаратная трассировка
Документация
6.6.14. profile
Создание флейм-графиков из результатов профилирования
6.6.15. cpudist
6.6.16. runqlat
6.6.17. runqlen
6.6.18. softirqs
6.6.19. hardirqs
6.6.20. bpftrace
Однострочные сценарии
Примеры
Внутренние особенности планирования
6.6.21. Другие инструменты
Графические процессоры
6.7. Методы визуализации
6.7.1. Тепловая карта потребления
6.7.2. Тепловая карта с субсекундным смещением
6.7.3. Флейм-графики
Характеристики
Цветовые палитры
Интерактивность
Интерпретация
6.7.4. FlameScope
6.8. Эксперименты
6.8.1. Ad hoc
6.8.2. SysBench
6.9. Настройка
6.9.1. Параметры компилятора
6.9.2. Приоритет и класс планирования
6.9.3. Параметры планировщика
6.9.4. Режимы масштабирования частоты
6.9.5. Состояния энергопотребления
6.9.6. Привязка к процессору
6.9.7. Исключительные процессорные наборы
6.9.8. Управление ресурсами
6.9.9. Параметры безопасной загрузки
6.9.10. Параметры процессора (настройка BIOS)
6.10. Упражнения
6.11. Ссылки
Глава 7. Память
7.1. Терминология
7.2. Основные понятия
7.2.1. Виртуальная память
7.2.2. Подкачка страниц
7.2.3. Подкачка страниц по требованию
7.2.4. Чрезмерное выделение памяти
7.2.5. Подкачка процессов
7.2.6. Использование кэша файловой системы
7.2.7. Потребление и насыщение
7.2.8. Распределители
7.2.9. Разделяемая память
7.2.10. Размер рабочего набора
7.2.11. Размер слова
7.3. Архитектура
7.3.1. Аппаратное обеспечение
Основная память
Задержка
Архитектура основной памяти
Шины
DDR SDRAM
Многоканальная память
Кэши процессоров
MMU
Поддержка нескольких размеров страниц
TLB
7.3.2. Программное обеспечение
Освобождение памяти
Списки свободных страниц
Уплотнение
Сканирование страниц
7.3.3. Адресное пространство процесса
Распределители
Slab
SLUB
glibc
TCMalloc
jemalloc
7.4. Методология
7.4.1. Метод инструментов
7.4.2. Метод USE
7.4.3. Определение характеристик потребления памяти
Расширенный анализ потребления/чек-лист
7.4.4. Анализ тактов
7.4.5. Мониторинг производительности
7.4.6. Выявление утечек
7.4.7. Статическая настройка производительности
7.4.8. Управление ресурсами
7.4.9. Микробенчмаркинг
7.4.10. Уменьшение потребления памяти
7.5. Инструменты наблюдения
7.5.1. vmstat
7.5.2. PSI
7.5.3. swapon
7.5.4. sar
7.5.5. slabtop
7.5.6. numastat
7.5.7. ps
7.5.8. top
7.5.9. pmap
7.5.10. perf
Однострочные сценарии
Выборка сбоев страниц
Флейм-графики сбоев страниц
7.5.11. drsnoop
7.5.12. wss
7.5.13. bpftrace
Однострочные сценарии
Трассировки стека в пространстве пользователя, ведущие к выделению памяти
Флейм-график размеров памяти, выделяемой обращением к malloc()
Флейм-графики сбоев страниц
Исследование внутренних особенностей управления памятью
7.5.14. Другие инструменты
7.6. Настройка
7.6.1. Настраиваемые параметры
7.6.2. Несколько размеров страниц
7.6.3. Распределители
7.6.4. Привязка NUMA
7.6.5. Управление ресурсами
7.7. Упражнения
7.8. Ссылки
Глава 8. Файловые системы
8.1. Терминология
8.2. Модели
8.2.1. Интерфейсы файловых систем
8.2.2. Кэш файловой системы
8.2.3. Кэш второго уровня
8.3. Основные понятия
8.3.1. Задержки в файловой системе
8.3.2. Кэширование
8.3.3. Произвольный и последовательный ввод/вывод
8.3.4. Предварительная выборка
8.3.5. Упреждающее чтение
8.3.6. Кэширование с отложенной записью
8.3.7. Синхронная запись
Индивидуальная синхронная запись
Синхронная фиксация предыдущих операций записи
8.3.8. Прямой и низкоуровневый ввод/вывод
8.3.9. Неблокирующий ввод/вывод
8.3.10. Файлы, отображаемые в память
8.3.11. Метаданные
Логические метаданные
Физические метаданные
8.3.12. Логический и физический ввод/вывод
Несвязанный ввод/вывод
Косвенный ввод/вывод
Неявный ввод/вывод
Уменьшенный (deflated) ввод/вывод
Увеличенный (inflated) ввод/вывод
Пример
8.3.13. Неравноценность операций
8.3.14. Специальные файловые системы
8.3.15. Доступ к отметкам времени
8.3.16. Емкость
8.4. Архитектура
8.4.1. Стек ввода-вывода файловой системы
8.4.2. VFS
8.4.3. Кэши файловой системы
Кэш буферов
Кэш страниц
Кэш каталогов
Кэш индексных узлов
8.4.4. Особенности файловых систем
Блоки и экстенты
Журналирование
Копирование при записи
Скраббинг
Другие особенности
8.4.5. Типы файловых систем
FFS
ext3
ext4
XFS
ZFS
btrfs
8.4.6. Тома и пулы
8.5. Методология
8.5.1. Анализ дисков
8.5.2. Анализ задержек
Стоимость транзакции
8.5.3. Определение характеристик рабочей нагрузки
Чек-лист для определения дополнительных характеристик рабочей нагрузки
Определение характеристик производительности
Трассировка событий
8.5.4. Мониторинг производительности
8.5.5. Статическая настройка производительности
8.5.6. Настройка кэша
8.5.7. Разделение рабочей нагрузки
8.5.8. Микробенчмаркинг
8.6. Инструменты наблюдения
8.6.1. mount
8.6.2. free
8.6.3. top
8.6.4. vmstat
8.6.5. sar
8.6.6. slabtop
8.6.7. strace
8.6.8. fatrace
8.6.9. LatencyTOP
8.6.10. opensnoop
8.6.11. filetop
8.6.12. cachestat
8.6.13. ext4dist (xfs, zfs, btrfs, nfs)
8.6.14. ext4slower (xfs, zfs, btrfs, nfs)
8.6.15. bpftrace
Однострочные сценарии
Трассировка системных вызовов
openat(2)
read(2)
Трассировка VFS
Количество вызовов VFS
Измерение задержек в VFS
Внутренние механизмы файловой системы
8.6.17. Другие инструменты
ZFS
8.6.18. Визуализация
8.7. Эксперименты
8.7.1. Ad hoc
8.7.2. Инструменты микробенчмаркинга
Bonnie, Bonnie++
FileBench
8.7.3. Очистка кэша
8.8. Настройка
8.8.1. Функции
posix_fadvise()
madvise()
8.8.2. ext4
Параметры монтирования и команда tune2fs
Файлы свойств /sys/fs
e2fsck
8.8.3. ZFS
8.9. Упражнения
8.10. Ссылки
Глава 9. Диски
9.1. Терминология
9.2. Модели
9.2.1. Простой диск
9.2.2. Кэширующие диски
9.2.3. Контроллер
9.3. Основные понятия
9.3.1. Измерение времени
9.3.2. Масштаб времени
9.3.3. Кэширование
9.3.4. Произвольный и последовательный ввод/вывод
9.3.5. Соотношение операций чтения и записи
9.3.6. Размер ввода/вывода
9.3.7. Несопоставимость количества операций в секунду
9.3.8. Дисковые команды, не связанные с передачей данных
9.3.9. Потребление
Потребление виртуального диска
9.3.10. Насыщенность
9.3.11. Ожидание ввода/вывода
9.3.12. Синхронный и асинхронный ввод/вывод
9.3.13. Дисковый ввод/вывод и ввод/вывод в приложении
9.4. Архитектура
9.4.1. Типы дисков
9.4.1.1. Магнитные вращающиеся диски
Позиционирование и вращение
Теоретическая максимальная пропускная способность
Короткий ход
Зонирование секторов
Размер сектора
Кэш внутри дискового устройства
Алгоритм лифта для позиционирования
Целостность данных
Вибрация
Ленивые диски
Черепичная магнитная запись
Дисковый контроллер данных
9.4.1.2. Твердотельные накопители
Флеш-память
Контроллер
Продолжительность жизни
Патологии
9.4.1.3. Энергонезависимая память
9.4.2. Интерфейсы
SCSI
SAS
SATA
FC
NVMe
9.4.3. Типы хранилищ
Дисковые устройства
RAID
Типы
Наблюдаемость
Чтение-изменение-запись
Кэши
Дополнительные возможности
Массивы хранения
Сетевые хранилища
9.4.4. Стек дискового ввода/вывода в операционной системе
Интерфейс блочного устройства
Linux
Слияние ввода/вывода
Планировщики ввода/вывода
9.5. Методология
9.5.1. Метод инструментов
9.5.2. Метод USE
Дисковые устройства
Контроллеры дисков
9.5.3. Мониторинг производительности
9.5.4. Определение характеристик рабочей нагрузки
Чек-лист для определения дополнительных характеристик рабочей нагрузки
Определение характеристик производительности
Трассировка событий
9.5.5. Анализ задержек
9.5.6. Статическая настройка производительности
9.5.7. Настройка кэширования
9.5.8. Управление ресурсами
9.5.9. Микробенчмаркинг
Диски
Контроллеры дисков
9.5.10. Масштабирование
9.6. Инструменты наблюдения
9.6.1. iostat
Вывод iostat по умолчанию
Параметры iostat
Режим расширенного узкого вывода iostat
Режим расширенного вывода iostat
9.6.2. sar
9.6.3. PSI
9.6.4. pidstat
9.6.5. perf
Однострочные сценарии
Задержка дискового ввода/вывода
9.6.6. biolatency
Флаги
9.6.7. biosnoop
Анализ выбросов
Время в очереди
9.6.8. iotop, biotop
iotop
biotop
9.6.9. biostacks
9.6.10. blktrace
Вывод по умолчанию
Идентификаторы действий
Описание RWBS
Фильтрация действий
Анализ
Визуализация
9.6.11. bpftrace
Однострочные сценарии
Объем дискового ввода/вывода
Задержка дискового ввода/вывода
Ошибки дискового ввода/вывода
9.6.12. MegaCli
9.6.13. smartctl
9.6.14. Журналирование SCSI
9.6.15. Другие инструменты
9.7. Визуализация
9.7.1. Линейные диаграммы
9.7.2. Диаграммы рассеяния задержек
9.7.3. Тепловые карты задержек
9.7.4. Тепловые карты смещений
9.7.5. Тепловые карты потребления
9.8. Эксперименты
9.8.1. Ad hoc
9.8.2. Пользовательские генераторы нагрузки
9.8.3. Инструменты микробенчмаркинга
9.8.4. Пример произвольного чтения
9.8.5. ioping
9.8.6. fio
9.8.7. blkreplay
9.9. Настройка
9.9.1. Параметры операционной системы
ionice
Управление ресурсами
Настраиваемые параметры
9.9.2. Настраиваемые параметры дисковых устройств
9.9.3. Настраиваемые параметры контроллера диска
9.10. Упражнения
9.11. Ссылки
Глава 10. Сеть
10.1. Терминология
10.2. Модели
10.2.1. Сетевой интерфейс
10.2.2. Контроллер
10.2.3. Стек протоколов
10.3. Основные понятия
10.3.1. Сети и маршрутизация
10.3.2. Протоколы
10.3.3. Инкапсуляция
10.3.4. Размер пакета
10.3.5. Задержка
Задержка разрешения имен
Задержка проверки связи
Задержка подключения
Задержка первого байта
Время приема-передачи
Продолжительность жизни соединения
10.3.6. Буферизация
10.3.7. Очередь запросов на подключение
10.3.8. Согласование интерфейса
10.3.9. Предотвращение перегрузки
10.3.10. Потребление
10.3.11. Локальные подключения
10.4. Архитектура
10.4.1. Протоколы
IP
TCP
Трехэтапное «рукопожатие»
Состояния и таймеры
Обнаружение повторного подтверждения
Повторная передача
Управление перегрузкой
Алгоритм Нейгла
Отложенные подтверждения
SACK, FACK и RACK
Начальное окно
UDP
QUIC и HTTP/3
10.4.2. Оборудование
Интерфейсы
Контроллеры
Коммутаторы и маршрутизаторы
Брандмауэры
Другое оборудование
10.4.3. Программное обеспечение
Сетевой стек
Linux
Очереди соединений TCP
Буферизация TCP
Уменьшение затрат на сегментацию: GSO и TSO
Дисциплины очередей
Драйверы сетевых устройств
Отправка и получение по сетевой карте
Масштабирование процессора
В обход ядра
Другие оптимизации
10.5. Методология
10.5.1. Метод инструментов
10.5.2. Метод USE
10.5.3. Определение характеристик рабочей нагрузки
Чек-лист для определения дополнительных характеристик рабочей нагрузки
10.5.4. Анализ задержек
10.5.5. Мониторинг производительности
10.5.6. Перехват пакетов
10.5.7. Анализ TCP
10.5.8. Статическая настройка производительности
10.5.9. Управление ресурсами
10.5.10. Микробенчмаркинг
10.6. Инструменты наблюдения
10.6.1. ss
netlink
10.6.2. ip
Таблица маршрутизации
Мониторинг
10.6.3. ifconfig
10.6.4. nstat
10.6.5 netstat
10.6.6. sar
10.6.7. nicstat
10.6.8. ethtool
10.6.9. tcplife
10.6.10. tcptop
10.6.11. tcpretrans
10.6.12. bpftrace
Однострочные сценарии
Трассировка сокетов
Точки трассировки sock
socketio.bt
Трассировка TCP
Точки трассировки TCP
tcpsynbl.bt
Источники событий
10.6.13. tcpdump
10.6.14. Wireshark
10.6.15. Другие инструменты
10.7. Эксперименты
10.7.1. ping
10.7.2. traceroute
10.7.3. pathchar
10.7.4. iperf
10.7.5. netperf
10.7.6. tc
10.7.7. Другие инструменты
10.8. Настройка
10.8.1. Общесистемные
Пример из промышленной среды
Буферы сокетов и TCP
Очередь входящих запросов на соединение TCP
Очередь устройства
Управление перегрузкой TCP
Параметры TCP
ECN
Byte Queue Limits
Управление ресурсами
Дисциплины очередей
Проект Tuned
10.8.2. Параметры сокетов
10.8.3. Конфигурация
10.9. Упражнения
10.10. Ссылки
Глава 11. Облачные вычисления
11.1. Основы
11.1.1. Типы экземпляров
11.1.2. Масштабируемая архитектура
11.1.3. Планирование мощности
Динамическое изменение размера (автомасштабирование)
11.1.4. Хранилище
11.1.5. Мультиарендность
11.1.6. Оркестровка (Kubernetes)
11.2. Виртуализация оборудования
11.2.1. Реализация
11.2.2. Оверхед
Процессор
Отображение памяти
Размер памяти
Ввод/вывод
Конкуренция между арендаторами
11.2.3. Управление ресурсами
Процессоры
Кэши процессоров
Объем памяти
Объем файловой системы
Дисковый ввод/вывод
11.2.4. Наблюдаемость
11.2.4.1. Привилегированный гость/хост
Xen
KVM
11.2.4.2. Гость
11.2.4.3. Стратегия
11.3. Виртуализация операционной системы
11.3.1. Реализация
Пространства имен
Контрольные группы
11.3.2. Оверхед
Процессор
Отображение памяти
Размер памяти
Ввод/вывод
Конкуренция между арендаторами
11.3.3. Управление ресурсами
Процессоры
cpuset
Доли и пропускная способность
Кэши процессоров
Объем памяти
Объем пространства в файле подкачки
Объем файловой системы
Кэш файловой системы
Дисковый ввод/вывод
Сетевой ввод/вывод
11.3.4. Наблюдаемость
11.3.4.1. Традиционные инструменты
11.3.4.2. Хост
Контейнерные инструменты
Статистики контрольных групп
Отображение пространства имен
Трассировка с помощью BPF
Управление ресурсами
11.3.4.3. Гость (контейнер)
Поддержка контейнеров
Инструменты трассировки
11.3.4.4. Стратегия
11.4. Легковесная виртуализация
11.4.1. Реализация
11.4.2. Оверхед
11.4.3. Управление ресурсами
11.4.4. Наблюдаемость
11.5. Другие типы виртуализации
11.6. Сравнение
11.7. Упражнения
11.8. Ссылки
Глава 12. Бенчмаркинг
12.1. Основы
12.1.1. Причины
12.1.2. Эффективный бенчмаркинг
Анализ бенчмаркинга
12.1.3. Проблемы бенчмаркинга
1. Случайное тестирование
2. Слепая вера
3. Числа без анализа
4. Сложные инструменты бенчмаркинга
5. Тестирование не того, что надо
6. Игнорирование особенностей среды
7. Игнорирование ошибок
8. Игнорирование изменчивости
9. Игнорирование возмущающих факторов
10. Изменение множества факторов
11. Парадокс бенчмарка
12. Бенчмаркинг конкурентов
13. Огонь по своим
14. Бенчмарки, вводящие в заблуждение
15. Специализация под бенчмарки
16. Мошенничество
12.2. Типы бенчмаркинга
12.2.1. Микробенчмаркинг
Пример дизайна бенчмарка
12.2.2. Моделирование
12.2.3. Воспроизведение
12.2.4. Отраслевые стандарты
SPEC
12.3. Методология
12.3.1 Пассивный бенчмаркинг
12.3.2. Активный бенчмаркинг
Пример анализа
12.3.3. Профилирование процессора
Пример
12.3.4. Метод USE
12.3.5. Определение характеристик рабочей нагрузки
12.3.6. Собственный бенчмаркинг
12.3.7. Пиковая нагрузка
12.3.8. Проверка правильности
12.3.9. Статистический анализ
12.3.10. Чек-лист бенчмаркинга
12.4. Вопросы о бенчмаркинге
12.5. Упражнения
12.6. Ссылки
Глава 13. perf
13.1. Обзор подкоманд
13.2. Однострочные сценарии
Список событий
Подсчет событий
Профилирование
Статическая трассировка
Динамическая трассировка
Отчеты
13.3. События perf
13.4. Аппаратные события
13.4.1. Дискретная выборка
13.5. Программные события
13.6. События точек трассировки
13.7. События зондов
13.7.1. kprobes
Аргументы зондов kprobe
13.7.2. uprobes
Аргументы зондов uprobe
13.7.3. USDT
13.8. perf stat
13.8.1. Параметры
13.8.2. Интервальные статистики
13.8.3. Баланс между процессорами
13.8.4. Фильтрация событий
13.8.5. Теневые статистики
13.9. perf record
13.9.1. Параметры
13.9.2. Профилирование процессора
13.9.3. Обход стека
13.10. perf report
13.10.1. TUI
13.10.2. STDIO
13.11. perf script
13.11.1. Флейм-графики
13.11.2. Сценарии обработки трассировок
13.12. perf trace
13.12.1. Версии ядра
13.13. Другие команды
13.14. Документация perf
13.15. Ссылки
Глава 14. Ftrace
14.1. Обзор возможностей
14.2. tracefs (/sys)
14.2.1. Содержимое tracefs
14.3. Профилировщик функций
14.4. Трассировщик function
14.4.1. Использование файла trace
14.4.2. Использование файла trace_pipe
14.4.3. Параметры
14.5. Точки трассировки
14.5.1. Фильтрация
14.5.2. Триггеры
14.6. Зонды kprobes
14.6.1. Трассировка событий
14.6.2. Аргументы
14.6.3. Возвращаемые значения
14.6.4. Фильтры и триггеры
14.6.5. Профилировщик kprobe
14.7. Зонды uprobes
14.7.1. Трассировка событий
14.7.2. Аргументы и возвращаемые значения
14.7.3. Фильтры и триггеры
14.7.4. Профилировщик uprobe
14.8. Трассировщик function_graph
14.8.1. Трассировка графа
14.8.2. Параметры
14.9. Трассировщик hwlat
14.10. Триггеры hist
14.10.1. Гистограмма с единственным ключом
14.10.2. Поля
14.10.3. Модификаторы
14.10.4. Фильтры PID
14.10.5. Гистограмма с несколькими ключами
14.10.6 Трассировки стека в роли ключей
14.10.7. Синтетические события
14.11. trace-cmd
14.11.1. Обзор подкоманд
14.11.2. Однострочные сценарии для trace-cmd
Список событий
Трассировка функций
Трассировка графа функций
Трассировка событий
Отчеты
Другие возможности
14.11.3. Сравнение trace-cmd и perf(1)
14.11.4. trace-cmd function_graph
14.11.5. KernelShark
14.11.6. Документация для trace-cmd
14.12. perf ftrace
14.13. perf-tools
14.13.1. Покрытие инструментами
14.13.2. Специализированные инструменты
14.13.3. Многоцелевые инструменты
14.13.4. Однострочные сценарии для perf-tools
Профилировщики Ftrace
Трассировщики Ftrace
Трассировка событий
Регистры процессора
14.13.5. Пример
14.13.6. Сравнение perf-tools и BCC/BPF
14.13.7. Документация
14.14. Документация для Ftrace
14.15. Ссылки
Глава 15. BPF
15.1. BCC
15.1.1. Установка
15.1.2. Покрытие инструментами
15.1.3. Специализированные инструменты
15.1.4. Многоцелевые инструменты
15.1.5. Однострочные сценарии
funccount(8)
stackcount(8)
trace(8)
argdist(8)
15.1.6. Пример многоцелевого инструмента
15.1.7. Сравнение BCC и bpftrace
15.1.8. Документация
15.2. bpftrace
15.2.1. Установка
15.2.2. Инструменты
15.2.3. Однострочные сценарии
Процессоры
Память
Файловые системы
Диск
Сеть
Приложения
Ядро
15.2.4. Программирование
1. Использование
2. Структура программы
3. Комментарии
4. Формат определения зондов
5. Подстановочные знаки в определениях зондов
6. Фильтры
7. Действия
8. Hello, World!
9. Функции
10. Переменные
11. Функции карт
12. Определение продолжительности выполнения vfs_read()
15.2.5. Справочник
1. Типы зондов
Аргументы зондов
2. Управление потоком выполнения
Фильтры
Тернарные операторы
Операторы if
Циклы
Операторы
3. Переменные
4. Функции
5. Функции карт
15.2.6. Документация
15.3. Ссылки
Глава 16. Пример из практики
16.1. Необъяснимый выигрыш
16.1.1. Постановка задачи
16.1.2. Стратегия анализа
16.1.3. Статистики
16.1.4. Конфигурация
16.1.5. Счетчики PMC
16.1.6. Программные события
16.1.7. Трассировка
16.1.8. Заключение
16.2. Дополнительная информация
16.3. Ссылки
Приложение A. Метод USE: Linux
A1. Физические ресурсы
A2. Программные ресурсы
A3. Ссылки
Приложение B. Краткий справочник по sar
Приложение C. Однострочные сценарии для bpftrace
Процессоры
Память
Файловые системы
Диски
Сети
Приложение D. Решения некоторых упражнений
Приложение E. Производительность систем, кто есть кто
E.1. Ссылки
Глоссарий