Команда top, live-мониторинг в терминале, сортировка и фильтрация
Как htop, но для Python-функций. В реальном времени.
Команда top показывает использование CPU Python-функциями в реальном времени. Это ваш инструмент для быстрого понимания того, что происходит прямо сейчас.
py-spy top --pid <PID>Пример:
# Найдите PID Python-процесса
ps aux | grep python
# Запустите top
py-spy top --pid 12345Вы увидите:
py-spy top (0.1s samples)
Total Samples 452
Command python3.9 my_app.py
%Self %Total Self Time Total Time Count Function
45.2% 45.2% 0.045s 0.045s 12 process_data (my_app.py:25)
23.1% 68.3% 0.023s 0.068s 8 parse_json (my_app.py:42)
15.4% 15.4% 0.015s 0.015s 45 <listcomp> (my_app.py:45)
8.7% 84.0% 0.009s 0.084s 3 fetch_from_db (db.py:12)
5.2% 5.2% 0.005s 0.005s 120 str.replace
2.4% 2.4% 0.002s 0.002s 34 dict.__setitem__
| Колонка | Описание |
|---|---|
| %Self | Процент CPU, проведённый непосредственно в функции (без учёта вызовов) |
| %Total | Процент CPU в функции включая вызванные ею функции |
| Self Time | Время в секундах, проведённое в функции (без вызовов) |
| Total Time | Время включая вызванные функции |
| Count | Количество сэмплов, где функция была в стеке |
| Function | Имя функции и местоположение (файл:строка) |
Ключевое различие:
Пример:
def outer():
time.sleep(0.5) # Self time
inner() # Вызов другой функции
def inner():
time.sleep(0.3) # Self timeВ top:
inner: %Self = 37.5%, %Total = 37.5% (0.3с из 0.8с)outer: %Self = 62.5%, %Total = 100% (0.5с self + 0.3с inner)Нажмите клавиши для сортировки:
| Клавиша | Сортировка |
|---|---|
| s | По Self Time (по умолчанию) |
| t | По Total Time |
| c | По Count (количество сэмплов) |
Когда что использовать:
Нажмите / и введите имя:
/filter process
Покажет только функции, содержащие "process" в имени.
/filter .py
Покажет только Python-файлы (исключит встроенные функции).
Нажмите Esc для сброса.
Нажмите Пробел для паузы обновления. Удобно для изучения снимка.
Нажмите q или Ctrl+C.
У вас есть Flask-приложение, которое отвечает 3 секунды вместо 200 мс.
flask run --port 5000lsof -i :5000
# или
ps aux | grep flaskpy-spy top --pid <PID>В другом терминале:
curl http://localhost:5000/api/slow-endpointВ top вы увидите:
py-spy top (0.1s samples)
Total Samples 312
Command python3.9 app.py
%Self %Total Self Time Total Time Count Function
52.1% 52.1% 1.56s 1.56s 1 slow_endpoint (app.py:45)
28.3% 28.3% 0.85s 0.85s 45 expensive_computation (utils.py:12)
12.4% 12.4% 0.37s 0.37s 12 json.dumps
5.2% 5.2% 0.16s 0.16s 234 str.split
2.0% 2.0% 0.06s 0.06s 89 list.append
Вывод: expensive_computation занимает 28% CPU — это кандидат на оптимизацию или кэширование.
Можно запустить программу сразу с top:
py-spy top -- python my_script.pypy-spy запустит скрипт и начнёт мониторинг.
По умолчанию py-spy обновляется каждые 0.1 секунды (10 раз в секунду).
Для изменения используйте --interval:
# Обновление каждые 0.5 секунды
py-spy top --interval 0.5 --pid 12345top показывает агрегированные данные по всем потокам. Если нужно видеть каждый поток отдельно, используйте record с последующим анализом в speedscope.
| Характеристика | top | record |
|---|---|---|
| Режим | Реальное время | Запись в файл |
| Интерактивность | Да (сортировка, фильтр) | Нет (только просмотр SVG) |
| История | Только текущее состояние | Можно перемотать, изучить детали |
| Экспорт | Нет | SVG, speedscope, raw |
| Лучше для | Быстрого анализа «что сейчас» | Глубокого анализа, отчётов |
Рекомендация: Используйте top для быстрого понимания ситуации, record для детального анализа и сохранения результатов.
Нет истории: Видите только текущий срез. Для истории используйте record.
Агрегация по потокам: Не показывает разделение по потокам.
Терминал: Требует терминал, нельзя открыть в браузере.
py-spy top --pid <PID>s — сортировка по Self Timet — сортировка по Total Time/ и введите имя функцииПробел для паузыq для выходаКлючевая идея: top — это ваш быстрый инструмент для понимания «что происходит прямо сейчас». Не требует записи, не создаёт файлов, показывает результат немедленно.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.