Что делать если весь сервер упал?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Действия при падении сервера: Incident Response
Это не просто техническая проблема
Падение сервера — это критический инцидент, который требует системного подхода. Вопрос на интервью проверяет не только техническую компетентность, но и способность действовать под давлением, коммуникацию и приоритизацию.
Фаза 1: Немедленное реагирование (первые 5 минут)
Шаг 1 — Остановить кровотечение
# Думай как инженер в боевых условиях:
import logging
class IncidentResponse:
def immediate_actions(self):
actions = [
"1. Подтвердить факт падения (не паника)",
"2. Уведомить team lead / DevOps",
"3. Запустить мониторинг для деградации",
"4. Начать логирование инцидента"
]
return actions
# Не делай:
bad_things = [
"Паниковать и сразу перезагружать",
"Скрывать информацию от остальной команды",
"Делать необдуманные изменения в production",
"Работать в одиночку без координации"
]
Шаг 2 — Быстро собрать информацию
# Ключевые вопросы:
diagnostics = {
"scope": [
"Весь сервер или конкретный сервис?",
"Какие пользователи затронуты?",
"Как долго это продолжается?"
],
"symptoms": [
"Высокий CPU/Memory?",
"Ошибки в логах?",
"Network issues?",
"Database unavailable?"
],
"recent_changes": [
"Было ли развёртывание в последнее время?",
"Какие изменения были сделаны?",
"Может ли это вызвать проблему?"
]
}
# Команды для диагностики:
diagnostic_commands = {
"system": "top, vmstat, iostat",
"processes": "ps aux, systemctl status",
"network": "netstat, tcpdump",
"logs": "journalctl, tail -f /var/log/",
"docker": "docker ps, docker logs",
"kubernetes": "kubectl get pods, kubectl describe node"
}
Фаза 2: Восстановление сервиса (5-30 минут)
Вариант A — Перезагрузка (если ничего не помогает)
def graceful_restart():
"""
Перезагрузка с минимизацией потерь данных
"""
steps = [
"1. Остановить приём нового трафика (load balancer)",
"2. Graceful shutdown: дать запросам 30-60 сек на завершение",
"3. Записать состояние в лог/метрики",
"4. Перезагрузить сервис / сервер",
"5. Проверить, что сервис запустился корректно",
"6. Постепенно включить трафик (canary deployment)"
]
return steps
# В коде должно быть:
if __name__ == "__main__":
import signal
def handle_shutdown(signum, frame):
print("Graceful shutdown...")
# Закончить текущие операции
close_database_connections()
stop_worker_threads()
# Записать метрики
log_shutdown_event()
exit(0)
signal.signal(signal.SIGTERM, handle_shutdown)
Вариант B — Выявить и исправить проблему
# Типичные причины падения:
common_causes = {
"out_of_memory": {
"symptoms": "OOMKiller в логах",
"fix": "Увеличить лимиты памяти или найти утечку",
"diagnosis": "cat /var/log/kern.log | grep OOM"
},
"disk_full": {
"symptoms": "Нет места на диске",
"fix": "Очистить логи/temp файлы",
"diagnosis": "df -h, du -sh /var/log"
},
"high_load": {
"symptoms": "CPU 100%, долгие запросы",
"fix": "Оптимизировать запросы или масштабировать",
"diagnosis": "top, slow query logs"
},
"database_issues": {
"symptoms": "Connection timeout",
"fix": "Переподключиться, перезагрузить БД",
"diagnosis": "psql, mysql -u root"
},
"recent_deployment": {
"symptoms": "Падение после deploy",
"fix": "Откатить предыдущую версию",
"diagnosis": "Проверить git log, docker images"
}
}
Фаза 3: Откат (если необходимо)
# Откат последнего развёртывания:
rollback_strategy = """
1. Определить, какую версию катить (предыдущую stable)
2. Остановить текущее приложение
3. Развернуть старую версию
4. Проверить логи и метрики
5. Уведомить команду о причине отката
"""
# Команды откат (зависит от инфраструктуры):
rollback_commands = {
"docker": "docker pull my-app:v1.2.3 && docker run...",
"kubernetes": "kubectl rollout undo deployment/my-app",
"git": "git revert HEAD, make deploy"
}
Фаза 4: Мониторинг и Stabilization (30+ минут)
import time
from monitoring import check_health
def stabilize_and_monitor():
"""Убедиться, что система стабильна"""
monitoring_checks = [
("Response time", lambda: check_response_time() < 200),
("Error rate", lambda: get_error_rate() < 1),
("Database connections", lambda: get_conn_count() < max_conns),
("Memory usage", lambda: get_memory_percent() < 80),
("CPU usage", lambda: get_cpu_percent() < 70),
]
for check_name, check_func in monitoring_checks:
for attempt in range(10): # 10 минут
if check_func():
print(f"✓ {check_name}: OK")
break
else:
print(f"✗ {check_name}: Still failing, waiting...")
time.sleep(60)
Фаза 5: Post-mortem (после стабилизации)
class PostMortem:
"""Анализ того, что произошло"""
def analyze(self):
questions = {
"what_happened": "Какая была root cause?",
"why_it_happened": "Почему это не было предусмотрено?",
"impact": "Какой был downtime? Сколько пользователей затронуто?",
"detection_time": "Когда мы это обнаружили? Почему не раньше?",
"response_time": "Как быстро мы отреагировали?"
}
def improvements(self):
"""Как предотвратить в будущем"""
return [
"Добавить лучше мониторинг",
"Настроить alerts",
"Улучшить graceful degradation",
"Добавить circuit breakers",
"Улучшить documentation",
"Провести training по incident response"
]
Пример правильного ответа на интервью
Вариант 1 — систематический подход:
"Первое — это не паниковать, а быстро определить масштаб проблемы. Я бы:
- Уведомил team lead и DevOps
- Проверил логи и метрики, чтобы понять, что произошло
- Проверил недавние изменения — может, это связано с последним deployment?
- Если это из-за deploy, откатил бы предыдущую версию
- Параллельно начал диагностику root cause
- После восстановления провел бы post-mortem, чтобы предотвратить повторение
Ключ — это координация с командой и систематический подход, а не попытки делать всё в одиночку."
Вариант 2 — если спрашивают про техническую часть:
"Это зависит от того, что упало. Я проверил бы:
- CPU/Memory (top, vmstat)
- Disk space (df -h)
- Логи приложения (journalctl, docker logs)
- Базу данных (есть ли соединения?)
- Сетевые проблемы (netstat, ping)
Если это из-за недавнего deploy, откатил бы. Если это утечка памяти, нужно отследить, откуда. Главное — работать систематично, а не хаотично."
Выводы
- Не паниковать — паника приводит к ошибкам
- Коммуникация — сразу уведомить team
- Систематическая диагностика — логи, метрики, recent changes
- Быстро восстановить — даже если не знаешь root cause
- Анализ и улучшения — post-mortem для предотвращения
- Мониторинг — должна быть система, которая уведомит раньше
- Документация — должны быть runbooks для типичных проблем