← Назад к вопросам

Какие ресурсы потребляет программа у компьютера при запуске?

1.2 Junior🔥 71 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ресурсы, которые потребляет программа при запуске

Программа Python может потреблять различные системные ресурсы. Давайте разберём основные из них и способы их мониторинга.

1. Память (RAM)

Один из критичных ресурсов:

import psutil
import os
from datetime import datetime

# Информация о памяти процесса
process = psutil.Process(os.getpid())
mem_info = process.memory_info()

print(f"RSS (Resident Set Size): {mem_info.rss / 1024 / 1024:.2f} MB")
print(f"VMS (Virtual Memory Size): {mem_info.vms / 1024 / 1024:.2f} MB")
print(f"Процент памяти: {process.memory_percent():.2f}%")

# Информация о системе
system_memory = psutil.virtual_memory()
print(f"\nОбщая память системы: {system_memory.total / 1024 / 1024 / 1024:.2f} GB")
print(f"Используется: {system_memory.used / 1024 / 1024 / 1024:.2f} GB")
print(f"Доступно: {system_memory.available / 1024 / 1024 / 1024:.2f} GB")
print(f"Процент использования: {system_memory.percent}%")

# Отследение утечек памяти
import tracemalloc

tracemalloc.start()

# Код программы
data = [i for i in range(1000000)]

current, peak = tracemalloc.get_traced_memory()
print(f"\nТекущая память: {current / 1024 / 1024:.2f} MB")
print(f"Пиковая память: {peak / 1024 / 1024:.2f} MB")

tracemalloc.stop()

2. CPU (Процессор)

Использование вычислительной мощности:

import psutil
import os
import time

# Информация о CPU
process = psutil.Process(os.getpid())

print(f"CPU cores: {psutil.cpu_count()}")
print(f"CPU физических ядер: {psutil.cpu_count(logical=False)}")

# Использование CPU процессом
print(f"CPU процессом: {process.cpu_num()}")
print(f"Процент CPU процессом: {process.cpu_percent(interval=1)}%")

# Использование CPU системой
print(f"\nОбщее использование CPU: {psutil.cpu_percent(interval=1)}%")
print(f"Использование по ядрам:")
for i, percent in enumerate(psutil.cpu_percent(interval=1, percpu=True)):
    print(f"  Core {i}: {percent}%")

# Время CPU
print(f"\nВремя в пользовательском режиме: {process.cpu_times().user:.2f}s")
print(f"Время в системном режиме: {process.cpu_times().system:.2f}s")

3. Дисковый ввод-вывод (I/O)

Чтение и запись на диск:

import psutil
import os

process = psutil.Process(os.getpid())
io_info = process.io_counters()

print(f"Прочитано с диска: {io_info.read_bytes / 1024 / 1024:.2f} MB")
print(f"Написано на диск: {io_info.write_bytes / 1024 / 1024:.2f} MB")
print(f"Количество операций чтения: {io_info.read_count}")
print(f"Количество операций записи: {io_info.write_count}")

# Информация о диске
for partition in psutil.disk_partitions():
    print(f"\nРаздел: {partition.device}")
    try:
        usage = psutil.disk_usage(partition.mountpoint)
        print(f"  Общий размер: {usage.total / 1024 / 1024 / 1024:.2f} GB")
        print(f"  Использовано: {usage.used / 1024 / 1024 / 1024:.2f} GB")
        print(f"  Свободно: {usage.free / 1024 / 1024 / 1024:.2f} GB")
        print(f"  Процент использования: {usage.percent}%")
    except PermissionError:
        pass

# Скорость I/O
io_counters = psutil.disk_io_counters()
if io_counters:
    print(f"\nОбщие I/O операции:")
    print(f"  Чтений: {io_counters.read_count}")
    print(f"  Записей: {io_counters.write_count}")
    print(f"  Прочитано MB: {io_counters.read_bytes / 1024 / 1024:.2f}")
    print(f"  Написано MB: {io_counters.write_bytes / 1024 / 1024:.2f}")

4. Сетевые ресурсы

Использование сетевых интерфейсов:

import psutil

# Сетевая статистика
net_io = psutil.net_io_counters()
print(f"Отправлено байт: {net_io.bytes_sent / 1024 / 1024:.2f} MB")
print(f"Получено байт: {net_io.bytes_recv / 1024 / 1024:.2f} MB")
print(f"Входящие пакеты: {net_io.packets_recv}")
print(f"Отправленные пакеты: {net_io.packets_sent}")
print(f"Ошибок входящих: {net_io.errin}")
print(f"Ошибок исходящих: {net_io.errout}")

# Информация об интерфейсах
for interface_name, interface_addrs in psutil.net_if_addrs().items():
    print(f"\nИнтерфейс: {interface_name}")
    for addr in interface_addrs:
        print(f"  Семейство: {addr.family.name}")
        print(f"  Адрес: {addr.address}")
        print(f"  Маска: {addr.netmask}")

# Открытые соединения
for conn in psutil.net_connections(kind='inet'):
    if conn.status == 'ESTABLISHED':
        print(f"\nСоединение: {conn.laddr} -> {conn.raddr}")

5. Дескрипторы файлов (File Descriptors)

Открытые файлы и сокеты:

import psutil
import os

process = psutil.Process(os.getpid())

# Количество открытых файлов
print(f"Открытых файлов: {len(process.open_files())}")
print(f"Лимит файлов: {process.rlimits()[0][1]}")

# Информация о каждом открытом файле
for open_file in process.open_files():
    print(f"Файл: {open_file.path}")
    print(f"  FD: {open_file.fd}")
    print(f"  Позиция: {open_file.position}")

# Открытые соединения
for conn in process.net_connections():
    print(f"Соединение: {conn.family.name} {conn.type.name}")
    print(f"  Локальный адрес: {conn.laddr}")
    print(f"  Удалённый адрес: {conn.raddr}")
    print(f"  Статус: {conn.status}")

6. Потоки и процессы

Параллельные потоки выполнения:

import psutil
import os
import threading

process = psutil.Process(os.getpid())

# Количество потоков
print(f"Количество потоков: {process.num_threads()}")
print(f"Потоки: {process.threads()}")

# Дочерние процессы
print(f"\nДочерние процессы:")
for child in process.children(recursive=False):
    print(f"  PID {child.pid}: {child.name()}")

# Рекурсивно
for descendant in process.children(recursive=True):
    print(f"  Потомок PID {descendant.pid}")

# Информация о потоке
print(f"\nТекущий поток: {threading.current_thread().name}")
print(f"Активных потоков: {threading.active_count()}")
for thread in threading.enumerate():
    print(f"  {thread.name} (daemon={thread.daemon})")

7. Батарея (для ноутбуков)

import psutil

battery = psutil.sensors_battery()
if battery:
    print(f"Уровень батареи: {battery.percent}%")
    print(f"Подключено: {battery.power_plugged}")
    print(f"Времени на разрядку: {battery.secsleft / 3600:.2f} часов")
else:
    print("Батарея не обнаружена")

8. Полная диагностика системы

import psutil
import os
from datetime import datetime

class SystemMonitor:
    @staticmethod
    def get_full_report():
        process = psutil.Process(os.getpid())
        
        report = {
            "timestamp": datetime.now().isoformat(),
            "memory": {
                "rss_mb": process.memory_info().rss / 1024 / 1024,
                "vms_mb": process.memory_info().vms / 1024 / 1024,
                "percent": process.memory_percent()
            },
            "cpu": {
                "percent": process.cpu_percent(interval=0.1),
                "user_time": process.cpu_times().user,
                "system_time": process.cpu_times().system,
                "num_ctx_switches": process.num_ctx_switches()[0]
            },
            "io": {
                "read_count": process.io_counters().read_count,
                "write_count": process.io_counters().write_count,
                "read_mb": process.io_counters().read_bytes / 1024 / 1024,
                "write_mb": process.io_counters().write_bytes / 1024 / 1024
            },
            "process": {
                "pid": process.pid,
                "ppid": process.ppid(),
                "num_threads": process.num_threads(),
                "num_fds": len(process.open_files()),
                "status": process.status(),
                "create_time": datetime.fromtimestamp(process.create_time()).isoformat()
            },
            "system": {
                "total_memory_gb": psutil.virtual_memory().total / 1024 / 1024 / 1024,
                "used_memory_gb": psutil.virtual_memory().used / 1024 / 1024 / 1024,
                "available_memory_gb": psutil.virtual_memory().available / 1024 / 1024 / 1024,
                "cpu_count": psutil.cpu_count(),
                "cpu_percent": psutil.cpu_percent(interval=0.1),
                "boot_time": datetime.fromtimestamp(psutil.boot_time()).isoformat()
            }
        }
        
        return report
    
    @staticmethod
    def print_report():
        report = SystemMonitor.get_full_report()
        print("\n=== System Monitor Report ===")
        print(f"Время: {report['timestamp']}\n")
        
        print("Memory:")
        for key, value in report["memory"].items():
            print(f"  {key}: {value:.2f}")
        
        print("\nCPU:")
        for key, value in report["cpu"].items():
            print(f"  {key}: {value:.2f}")
        
        print("\nI/O:")
        for key, value in report["io"].items():
            print(f"  {key}: {value:.2f}")
        
        print("\nProcess Info:")
        for key, value in report["process"].items():
            print(f"  {key}: {value}")

monitor = SystemMonitor()
monitor.print_report()

9. Типичные ресурсы при запуске Python программы

# Минимальный процесс Python:
# - Память: 10-30 MB
# - CPU: <1% при простое
# - Open files: 10-20 (STDIN, STDOUT, STDERR и т.д.)
# - Threads: 1 (основной поток)

# FastAPI приложение:
# - Память: 50-150 MB (зависит от зависимостей)
# - CPU: 0-5% при простое (зависит от воркеров)
# - Open files: 20-50
# - Threads: 2-4+ (зависит от конфига)
# - Network connections: 1+ (слушание портов)

# Django приложение:
# - Память: 100-300 MB
# - CPU: 1-10% (зависит от load)
# - Open files: 20-100 (БД соединения)
# - Threads: 2-10+

Best Practices для оптимизации

  1. Профилирование памяти:
from memory_profiler import profile

@profile
def my_function():
    big_list = [i for i in range(1000000)]
    return sum(big_list)
  1. Профилирование CPU:
import cProfile
import pstats

profiler = cProfile.Profile()
profiler.enable()

# Код
for i in range(1000000):
    pass

profiler.disable()
stats = pstats.Stats(profiler)
stats.sort_stats('cumulative').print_stats(10)
  1. Мониторинг в production:
import psutil
import logging

logger = logging.getLogger(__name__)

if psutil.virtual_memory().percent > 85:
    logger.warning(f"High memory usage: {psutil.virtual_memory().percent}%")

if psutil.cpu_percent(interval=1) > 80:
    logger.warning(f"High CPU usage: {psutil.cpu_percent()}%")

Основная задача разработчика - понимать, какие ресурсы потребляет его приложение и оптимизировать их использование в зависимости от требований.