Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Продакшен-профилирование
production

Продакшен-профилирование

Безопасное профилирование под нагрузкой, sampling rate, минимизация оверхеда

Продакшен-профилирование

Профилирование в продакшене — это баланс между получением данных и минимизацией влияния на пользователей.

Профилирование в продакшене отличается от разработки:

  • Нельзя останавливать сервис
  • Нельзя замедлять ответы пользователям
  • Нельзя перезапускать процессы
  • Нужно работать под реальной нагрузкой

py-spy создан для таких сценариев.

#Почему py-spy безопасен для продакшена

  1. Non-blocking: Не останавливает процесс, только читает память
  2. Низкий оверхед: <5% при стандартных настройках
  3. Без модификаций: Не требует изменения кода или перезапуска
  4. Работает с любыми Python: 2.7, 3.x, PyPy (частично)

#Базовые принципы

#1. Минимизируйте частоту семплирования

По умолчанию py-spy делает 100 снимков в секунду. Для продакшена снизьте до 10-20.

# Продакшен-профилирование py-spy record -o profile.svg --rate 20 --pid 12345

Компромисс:

  • 100 снимков/с → точнее, но больше оверхед
  • 10 снимков/с → меньше оверхед, но можно пропустить короткие функции

Рекомендация: Начните с 20, увеличьте если нужно больше деталей.

#2. Ограничьте длительность

Не профилируйте часами. 30-60 секунд достаточно для выявления узких мест.

# 60 секунд профилирования py-spy record -o profile.svg --duration 60 --pid 12345

#3. Профилируйте репрезентативную нагрузку

Лучшее время для профилирования:

  • ✅ Пиковая нагрузка (видно реальные узкие места)
  • ✅ Типичные запросы (не edge cases)

Избегайте:

  • ❌ Ночью/выходные (нагрузка не репрезентативна)
  • ❌ После деплоя (кэши холодные, данные не типичны)

#4. Используйте --children с осторожностью

Флаг --children профилирует все дочерние процессы. Это добавляет оверхед.

# Только главный процесс (меньше оверхед) py-spy record -o profile.svg --pid 12345 # Все процессы (больше оверхед, но полная картина) py-spy record -o profile.svg --children --pid 12345

Рекомендация: Для микросервисов с 1-2 процессами используйте --children. Для 10+ процессов — выбирайте ключевые.

#5. Избегайте --native в продакшене

--native увеличивает оверхед с ~5% до ~10%. Используйте только если нужно профилировать C-код.

# Без нативного стека (безопаснее) py-spy record -o profile.svg --pid 12345 # С нативным стеком (только если нужно) py-spy record -o profile.svg --native --pid 12345

#Сценарии продакшен-профилирования

#Сценарий 1: Медленный API

Проблема: API отвечает 2с вместо 200мс.

Действия:

# 1. Найдите PID сервиса ps aux | grep my_api # 2. Запрофилируйте 60 секунд под нагрузкой py-spy record -o api_slow.svg --rate 20 --duration 60 --pid 12345 # 3. Сделайте запрос в другом терминале curl https://api.example.com/slow-endpoint # 4. Проанализируйте SVG

Что искать:

  • Функции с широкими полосами на flame graph
  • Блокирующие вызовы (сеть, БД, диск)
  • N+1 запросы к БД

#Сценарий 2: Высокое CPU

Проблема: Сервис потребляет 100% CPU.

Действия:

# 1. Интерактивный мониторинг py-spy top --rate 20 --pid 12345 # 2. Найдите функции с высоким %Self # 3. Для детального анализа запишите 30 секунд py-spy record -o cpu_high.svg --rate 20 --duration 30 --pid 12345

Что искать:

  • Бесконечные циклы
  • Тяжёлые вычисления (можно кэшировать?)
  • Сериализация/десериализация

#Сценарий 3: Периодические лаги

Проблема: Сервис иногда тормозит на 1-2 секунды.

Действия:

# 1. Запустите длительный мониторинг с низким rate py-spy record -o lag_profile.svg --rate 10 --duration 300 --pid 12345 # 2. В момент лага сделайте dump py-spy dump --pid 12345 > lag_dump.txt

Анализ:

  • Сравните профиль во время лага и в норме
  • Ищите блокировки (Lock.acquire, queue.get)
  • Проверьте сборщик мусора (GC паузы)

#Сценарий 4: Gunicorn/UWSGI воркеры

Проблема: Некоторые воркеры медленные.

Действия:

# 1. Найдите PID медленного воркера ps aux | grep gunicorn # 2. Профилируйте конкретный воркер py-spy record -o worker_slow.svg --rate 20 --pid <PID> # 3. Или все воркеры py-spy record -o all_workers.svg --rate 20 --children --pid <MASTER_PID>

#Интеграция с мониторингом

#Автоматическое профилирование при высоком CPU

Скрипт для автоматического профилирования:

#!/bin/bash # auto_profile.sh PID=$1 THRESHOLD=80 # CPU порог в % while true; do CPU=$(ps -p $PID -o %cpu=) if (( $(echo "$CPU > $THRESHOLD" | bc -l) )); then echo "CPU high: ${CPU}%. Starting profile..." TIMESTAMP=$(date +%Y%m%d_%H%M%S) py-spy record -o "profile_${TIMESTAMP}.svg" --rate 20 --duration 60 --pid $PID echo "Profile saved." fi sleep 10 done

Использование:

./auto_profile.sh 12345

#Профилирование по сигналу

Добавьте в код обработчик сигнала:

import signal import subprocess import os def start_profiling(signum, frame): pid = os.getpid() timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') filename = f'/tmp/profile_{timestamp}.svg' subprocess.run([ 'py-spy', 'record', '-o', filename, '--rate', '20', '--duration', '60', '--pid', str(pid) ]) print(f"Profile saved to {filename}") signal.signal(signal.SIGUSR1, start_profiling)

Запуск профилирования:

kill -USR1 12345

Профиль сохранится в /tmp/profile_YYYYMMDD_HHMMSS.svg.

#Безопасность

#Ограничение доступа

py-spy требует доступа к памяти процесса. Ограничьте круг лиц:

# Запустите py-spy от имени специального пользователя sudo -u profiler py-spy record -o profile.svg --pid 12345

#Удаление профилей

Профили могут содержать чувствительные данные (имена функций, пути). Удаляйте после анализа:

# Автоматическое удаление через 24 часа find /path/to/profiles -name "*.svg" -mtime +1 -delete

#Изоляция

Профилируйте в изолированной среде (контейнер, VM) если possible.

#Ограничения продакшен-профилирования

  1. Не показывает продакшен-баги: Некоторые баги проявляются только при специфичных условиях.

  2. Может пропустить редкие события: При низком rate (10/s) можно пропустить функции короче 100 мс.

  3. Требует доступа: Может потребоваться sudo или настройка ptrace_scope.

  4. Не заменяет APM: Для постоянного мониторинга используйте APM-системы (DataDog, New Relic).

#Чеклист продакшен-профилирования

  • Снизили частоту семплирования до 10-20
  • Ограничили длительность 60 секундами
  • Профилируете под репрезентативной нагрузкой
  • Не используете --native без необходимости
  • Не используете --children для 10+ процессов
  • Удаляете профили после анализа
  • Предупредили команду о профилировании

#Практическое задание

  1. Разверните любой Python-сервис локально
  2. Создайте нагрузку (например, ab или wrk)
  3. Запрофилируйте 60 секунд с --rate 20
  4. Проанализируйте flame graph
  5. Найдите топ-3 функции по времени

Ключевая идея: Продакшен-профилирование — это баланс. Получайте достаточно данных для анализа, но минимизируйте влияние на пользователей.

Далее: Кейсы оптимизации