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

Как определить высоконагруженность системы?

1.7 Middle🔥 171 комментариев
#Архитектура и проектирование

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

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

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

Как определить высоконагруженность системы

Определение высоконагруженности — это критическая задача для Data Engineer при архитектурировании систем обработки данных. Нужно понимать, когда система начинает испытывать проблемы, чтобы своевременно масштабировать или оптимизировать.

Метрики производительности системы

1. Нагрузка на CPU (процессор)

# Linux команда для просмотра CPU load
top
uptime
cat /proc/loadavg

# Результат:
# 1.5 2.1 1.8 3/256 12345
# load average за 1, 5 и 15 минут

Интерпретация CPU load:

  • Load < количество ядер: система справляется
  • Load ≈ количество ядер: система работает на максимум
  • Load > количество ядер: очередь задач, потенциальное узкое место
# Python мониторинг CPU
import psutil

# Получить количество процессоров
num_cpus = psutil.cpu_count()

# Получить текущий load average
load_avg = psutil.getloadavg()  # (1min, 5min, 15min)
load_percent = (load_avg[0] / num_cpus) * 100

print(f'Load average: {load_avg}')
print(f'CPU load: {load_percent}%')
print(f'System is overloaded!' if load_percent > 100 else 'System is healthy')

# CPU usage by process
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent']):
    if proc.info['cpu_percent'] > 50:
        print(f"{proc.info['name']}: {proc.info['cpu_percent']}%")

2. Использование памяти (RAM)

# Просмотр памяти
free -h
cat /proc/meminfo

# Результат: используется 85% из 64GB

Критические уровни памяти:

  • < 70%: нормально
  • 70-85%: нужно следить
  • > 85%: высокий риск OOM (Out of Memory)
  • > 95%: критично, система может начать swap, что замедлит всё
import psutil

# Мониторинг памяти
memory = psutil.virtual_memory()
print(f'Total: {memory.total / (1024**3):.1f} GB')
print(f'Used: {memory.used / (1024**3):.1f} GB')
print(f'Available: {memory.available / (1024**3):.1f} GB')
print(f'Percent: {memory.percent}%')

if memory.percent > 85:
    print('ALERT: Memory usage is critical!')
    # Можно запустить cleanup процесс

3. Дисковое I/O (Input/Output)

# Мониторинг дисковых операций
iostat -x 1 5

# Ключевые метрики:
# %util - утилизация диска (100% = максимум)
# await - среднее время ожидания (ms)
# r/s, w/s - чтения/записи в секунду

Интерпретация:

  • %util < 70%: здоровое состояние
  • %util 70-85%: нагруженность растёт
  • %util > 85%: диск не справляется
  • await > 50ms: высокое время ответа
import psutil

# Дисковые операции
disk_io = psutil.disk_io_counters()
print(f'Read ops: {disk_io.read_count}')
print(f'Write ops: {disk_io.write_count}')
print(f'Read bytes: {disk_io.read_bytes / (1024**3):.1f} GB')
print(f'Write bytes: {disk_io.write_bytes / (1024**3):.1f} GB')

# Место на диске
disk = psutil.disk_usage('/')
print(f'Disk usage: {disk.percent}%')
if disk.percent > 85:
    print('WARNING: Disk space running out!')

4. Сетевые операции

# Мониторинг сети
iftop  # реальное время
netstat -tulpn  # активные соединения

Метрики:

  • Throughput (Mb/s): пропускная способность
  • Packet loss: потеря пакетов
  • Latency (ms): задержка
import psutil

# Сетевая статистика
net = psutil.net_io_counters()
print(f'Bytes sent: {net.bytes_sent / (1024**3):.1f} GB')
print(f'Bytes received: {net.bytes_recv / (1024**3):.1f} GB')
print(f'Packets sent: {net.packets_sent}')
print(f'Packets received: {net.packets_recv}')
print(f'Errors in: {net.errin}, Errors out: {net.errout}')

Специфичные метрики для Big Data систем

Hadoop/HDFS

# Проверка здоровья HDFS
import subprocess
import json

# Получить статус HDFS
result = subprocess.run(
    ['hdfs', 'dfsadmin', '-report'],
    capture_output=True,
    text=True
)

print(result.stdout)

# Ключевые метрики:
# - Live datanodes
# - Dead datanodes
# - Total blocks
# - Under-replicated blocks

Apache Spark

from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()

# Получить информацию о кластере
sc = spark.sparkContext

# Статус executor'ов
print(f'Number of executors: {sc.defaultParallelism}')
print(f'Memory per executor: {spark.conf.get("spark.executor.memory")}')
print(f'Cores per executor: {spark.conf.get("spark.executor.cores")}')

# Через REST API
import requests

response = requests.get('http://spark-master:4040/api/v1/applications')
apps = response.json()

for app in apps:
    print(f'App: {app["name"]}')
    print(f'Status: {app["status"]}')

PostgreSQL/MySQL

-- PostgreSQL: активные запросы
SELECT 
    pid,
    query,
    state,
    query_start,
    EXTRACT(EPOCH FROM (NOW() - query_start)) as duration_seconds
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY duration_seconds DESC;

-- MySQL: статус сервера
SHOW STATUS LIKE 'Threads%';
SHOW PROCESSLIST;

-- Ключевые переменные
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Connections';

Kafka

# Проверить задержку топика
kafka-consumer-groups --bootstrap-server localhost:9092 \
  --group my-consumer-group \
  --describe

# Результат показывает:
# - LAG (разница между последним offset и consumed)
# - Если LAG растёт - консьюмер не справляется

Комплексный мониторинг (Prometheus пример)

# prometheus.yml config
global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - 'localhost:9093'

rule_files:
  - '/etc/prometheus/rules.yml'

scrape_configs:
  - job_name: 'system'
    static_configs:
      - targets: ['localhost:9100']  # node_exporter
  
  - job_name: 'spark'
    static_configs:
      - targets: ['localhost:4040']
# alerts rules
groups:
  - name: system
    rules:
      # CPU load alert
      - alert: HighCPULoad
        expr: node_load15 > 4
        for: 5m
        annotations:
          summary: 'CPU load is high: {{ $value }}'
      
      # Memory alert
      - alert: HighMemoryUsage
        expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) > 0.85
        for: 5m
        annotations:
          summary: 'Memory usage is {{ $value | humanizePercentage }}'
      
      # Disk space alert
      - alert: DiskSpaceRunningOut
        expr: (node_filesystem_avail_bytes / node_filesystem_size_bytes) < 0.15
        for: 5m
        annotations:
          summary: 'Disk space: {{ $value | humanizePercentage }} available'

Признаки перегрузки системы

Если видите эти симптомы — система перегружена:

Timeout'ы: запросы начинают падать с timeout ✓ Медленные ответы: latency растёт (был 100ms, стал 2000ms) ✓ Очереди задач: в системе копятся необработанные задачи ✓ OOM ошибки: приложения падают из-за нехватки памяти ✓ Деградация: постепенное снижение производительности ✓ Queue grow: размер очереди в Kafka/RabbitMQ только растёт ✓ Replication lag: в Kafka потребители отстают от продюсеров

Стратегия масштабирования

# Пример: автоматическое масштабирование

def check_system_health():
    cpu_load = psutil.getloadavg()[0] / psutil.cpu_count()
    memory_percent = psutil.virtual_memory().percent
    
    if cpu_load > 0.8 or memory_percent > 85:
        return 'overloaded'
    elif cpu_load > 0.6 or memory_percent > 70:
        return 'warning'
    else:
        return 'healthy'

# Рекомендации по масштабированию:
if check_system_health() == 'overloaded':
    # Вертикальное масштабирование: добавить CPU/RAM на машину
    # Горизонтальное: добавить ещё машин в кластер
    # Оптимизация: улучшить код/запросы
    pass

Выводы

Мониторьте CPU, память и диск в реальном времени ✅ Задавайте пороги алертов (70%, 85%, 95%) ✅ Используйте инструменты: Prometheus, Grafana, ELK Stack ✅ Делайте нагрузочное тестирование перед production ✅ Планируйте масштабирование заранее, не реагируйте на кризисы ✅ Логируйте медленные операции для анализа узких мест

Как определить высоконагруженность системы? | PrepBro