Как определить высоконагруженность системы?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как определить высоконагруженность системы
Определение высоконагруженности — это критическая задача для 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 ✅ Планируйте масштабирование заранее, не реагируйте на кризисы ✅ Логируйте медленные операции для анализа узких мест