Безопасное профилирование под нагрузкой, sampling rate, минимизация оверхеда
Профилирование в продакшене — это баланс между получением данных и минимизацией влияния на пользователей.
Профилирование в продакшене отличается от разработки:
py-spy создан для таких сценариев.
По умолчанию py-spy делает 100 снимков в секунду. Для продакшена снизьте до 10-20.
# Продакшен-профилирование
py-spy record -o profile.svg --rate 20 --pid 12345Компромисс:
Рекомендация: Начните с 20, увеличьте если нужно больше деталей.
Не профилируйте часами. 30-60 секунд достаточно для выявления узких мест.
# 60 секунд профилирования
py-spy record -o profile.svg --duration 60 --pid 12345Лучшее время для профилирования:
Избегайте:
Флаг --children профилирует все дочерние процессы. Это добавляет оверхед.
# Только главный процесс (меньше оверхед)
py-spy record -o profile.svg --pid 12345
# Все процессы (больше оверхед, но полная картина)
py-spy record -o profile.svg --children --pid 12345Рекомендация: Для микросервисов с 1-2 процессами используйте --children. Для 10+ процессов — выбирайте ключевые.
--native увеличивает оверхед с ~5% до ~10%. Используйте только если нужно профилировать C-код.
# Без нативного стека (безопаснее)
py-spy record -o profile.svg --pid 12345
# С нативным стеком (только если нужно)
py-spy record -o profile.svg --native --pid 12345Проблема: 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Что искать:
Проблема: Сервис потребляет 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Что искать:
Проблема: Сервис иногда тормозит на 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Анализ:
Проблема: Некоторые воркеры медленные.
Действия:
# 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>Скрипт для автоматического профилирования:
#!/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.
Не показывает продакшен-баги: Некоторые баги проявляются только при специфичных условиях.
Может пропустить редкие события: При низком rate (10/s) можно пропустить функции короче 100 мс.
Требует доступа: Может потребоваться sudo или настройка ptrace_scope.
Не заменяет APM: Для постоянного мониторинга используйте APM-системы (DataDog, New Relic).
--native без необходимости--children для 10+ процессовab или wrk)--rate 20Ключевая идея: Продакшен-профилирование — это баланс. Получайте достаточно данных для анализа, но минимизируйте влияние на пользователей.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.