Отладка и эксплуатация rails-приложений

58
ОТЛАДКА И ЭКСПЛУАТАЦИЯ RAILS-ПРИЛОЖЕНИЙ

Upload: egor-baranov

Post on 15-Aug-2015

226 views

Category:

Software


9 download

TRANSCRIPT

Page 1: Отладка и эксплуатация Rails-приложений

ОТЛАДКА И ЭКСПЛУАТАЦИЯ RAILS-ПРИЛОЖЕНИЙ

Page 2: Отладка и эксплуатация Rails-приложений

ОБО МНЕ

@goganchic

Руководитель направления разработки

ruby/erlang/nodejs

Page 3: Отладка и эксплуатация Rails-приложений

СЛОЖНОСТИ ЭКСПЛУАТАЦИИ

ОТЛАДКА

Page 4: Отладка и эксплуатация Rails-приложений

СЛОЖНОСТИ ЭКСПЛУАТАЦИИ

ОТЛАДКА

ВЫСОКИЕ НАГРУЗКИ

Page 5: Отладка и эксплуатация Rails-приложений

СЛОЖНОСТИ ЭКСПЛУАТАЦИИ

ОТЛАДКА

ВЫСОКИЕ НАГРУЗКИ

ПРОФИЛАКТИКА

Page 6: Отладка и эксплуатация Rails-приложений

ОРГАНИЗАЦИОННЫЕ РЕШЕНИЯ

Page 7: Отладка и эксплуатация Rails-приложений

ТЕСТИРОВАНИЕ И КОД-РЕВЬЮ

Чем раньше найдена ошибка — тем она дешевле

Тесты — для продуманных заранее краевых случаев, код-ревью — для возможно пропущенных

Unit-тесты не отменяют приемочных

Page 8: Отладка и эксплуатация Rails-приложений

ЗНАТЬ ИСПОЛЬЗУЕМЫЕ ИНСТРУМЕНТЫ

Код библиотек не идеален

Разные библиотеки могут конфликтовать друг с другом

Лучше не использовать то, что сложно понять

Page 9: Отладка и эксплуатация Rails-приложений

МОНИТОРИНГ

Слежение за ресурсами (CPU/RAM/HDD) — Zabbix

Внутренние метрики — PulseMeter

Слежение за внешними системами (DB, Redis, внешние API) — Zabbix+скрипты

Page 10: Отладка и эксплуатация Rails-приложений

PULSEMETER

sensors = PulseMeter::Sensor::Configuration.new(

root_webpage_requests_per_5_minutes: {

sensor_type: 'timelined/counter',

args: {interval: 5.minutes, ttl: 1.week}

}

)

PulseMeter::Observer.observe_method(HomeController, :index,

sensors) do

root_webpage_requests_per_5_minutes(1)

end

Page 11: Отладка и эксплуатация Rails-приложений

PULSEMETER

https://github.com/savonarola/pulse-meter

Page 12: Отладка и эксплуатация Rails-приложений

ОПОВЕЩЕНИЯ

Определить, что нормально

Выставить триггеры

Определить приоритеты оповещений

Page 13: Отладка и эксплуатация Rails-приложений

МОНИТОРЬ ЗАРАНЕЕ

Page 14: Отладка и эксплуатация Rails-приложений

ЛОГИ

Processing GET "/requests/10" for 1.1.1.1

Completed 200 OK in 336ms (Views: 0.8ms | ActiveRecord: 12.9ms)

Page 15: Отладка и эксплуатация Rails-приложений

ПОСМОТРЮ-КА Я

ТВОИ ЛОГИ

Page 16: Отладка и эксплуатация Rails-приложений

ЛОГИ

Processing GET "/requests/10" for 1.1.1.1Completed 200 OK in 336ms (Views: 0.8ms | ActiveRecord: 12.9ms)

Когда был сделан запрос?Как получить все логи по запросу?Были ли запросы во внешние API и если были —то какие ответы были получены?Для какого пользователя запрос?

Page 17: Отладка и эксплуатация Rails-приложений

ЛОГИ

[2015-04-18 20:11:39] [7d1fe7a2] [user_id=42] Processing GET "/requests/10" for 1.1.1.1[2015-04-18 20:11:39] [7d1fe7a2] [user_id=42] PartnerApi request: http://example.com/?param=value[2015-04-18 20:11:39] [7d1fe7a2] [user_id=42] PartnerApi response: 403 Forbidden[2015-04-18 20:11:39] [7d1fe7a2] Completed 200 OK in 336ms (Views: 0.8ms | ActiveRecord: 12.9ms)

+ консолидация логов (logstash или скрипты)

Page 18: Отладка и эксплуатация Rails-приложений

АРХИТЕКТУРНЫЕ РЕШЕНИЯ + ПОЛЕЗНЫЕ УТИЛИТЫ

Page 19: Отладка и эксплуатация Rails-приложений

АСИНХРОННОСТЬ

def process_request(params)

resp = HttpRequest.perform(params_for(request))

data = ResponseParser.parse(resp)

DataProcessor.process(data)

end

requests.each {|r| process_request(r)}

Page 20: Отладка и эксплуатация Rails-приложений

АСИНХРОННОСТЬ — ЗЛО

def process_request(request)

AsyncHttpRequest.perform(params_for(request)) do |resp|

AsyncResponseParser.parse(resp) do |data|

AsyncDataProcessor.process(data)

end

end

end

requests.each {|r| process_request(r)}

Page 21: Отладка и эксплуатация Rails-приложений
Page 22: Отладка и эксплуатация Rails-приложений

АСИНХРОННОСТЬ — ЗЛО

Код менее читаемый

Все библиотеки должны знать про асинхронность

Все ошибки должны корректно обрабатываться (т.к. общее состояние)

Page 23: Отладка и эксплуатация Rails-приложений

МНОГОПОТОЧНОЕ ПРОГРАММИРОВАНИЕ

ТЕОРИЯ РЕАЛЬНОСТЬ

Page 24: Отладка и эксплуатация Rails-приложений

МНОГОПОТОЧНОСТЬ — БОЛЬ

Воспроизвести баг — нереально

Получить магию — проще простого

Чем выше нагрузка — тем хуже магия

Page 25: Отладка и эксплуатация Rails-приложений

SEGMENTATION FAULTS

SEGMENTATION FAULTS EVERYWHERE!

Page 26: Отладка и эксплуатация Rails-приложений

БЫСТРЫЕ ТРАНЗАКЦИИ В БД

БД — общий ресурс

Заблокировал общий ресурс —повесил всю систему

Page 27: Отладка и эксплуатация Rails-приложений

ДЛИТЕЛЬНЫЕ ОПЕРАЦИИ —В ОЧЕРЕДЬ

HTTP обработчиков в Rails-проектах обычно мало

Заблокировал несколько обработчиков —повесил всю систему

Page 28: Отладка и эксплуатация Rails-приложений

ПЛАВНАЯ ДЕГРАДАЦИЯ —ЭТО ХОРОШО

Возможно без некоторых внешних систем сервис может работать

Page 29: Отладка и эксплуатация Rails-приложений

АКТУАЛЬНЫЕ ВЕРСИИ БИБЛИОТЕК

Современные системы делают из готовых компонентов

Возможно ваши баги уже кто-то поправилbundle outdated в помощь

Избегайте пре-альфа версий

Page 30: Отладка и эксплуатация Rails-приложений

АДМИНСКИЕ ШТУЧКИ

Если все совсем плохо

stracenetstat

pshtop

tcpdumpи т.п.

Page 31: Отладка и эксплуатация Rails-приложений

ДЕЙСТВИЯ ПРИ ЧП!

НЕ ПАНИКОВАТЬ, НЕ ВЫКАТЫВАТЬ ХАОТИЧЕСКИЕ «ХОТФИКСЫ»

СОБРАТЬ КАК МОЖНО БОЛЬШЕ ИНФЫ

НЕ СТЕСНЯТЬСЯ СПРАШИВАТЬ ИДЕЙ У КОЛЛЕГ

ГУГЛИТЬ

ИСКАТЬ И ИСПРАВЛЯТЬ ПРИЧИНУ, А НЕ СЛЕДСТВИЕ

Page 32: Отладка и эксплуатация Rails-приложений

ПРИМЕР ИЗ ЖИЗНИ

Page 33: Отладка и эксплуатация Rails-приложений

ПРОБЛЕМЫ С ОДНИМ ГЕО-СЕРВИСОМ

Проекту около 5 лет

Нагрузка средняя

Есть внешние API

Page 34: Отладка и эксплуатация Rails-приложений

ПРОБЛЕМЫ С ОДНИМ ГЕО-СЕРВИСОМ

Ruby 2.1

Rails 4.1

Unicorn

PostgreSQL

PostGIS

Resque заменили на Sidekiq — начались проблемы

Page 35: Отладка и эксплуатация Rails-приложений

ЧТО СЛУЧИЛОСЬ?

RGeo::Error::ParseError: Not enough bytes left to fulfill 1 byte

Для пользователя некоторые запросы не обрабатывались, частично функционал не был досутпен.

Page 36: Отладка и эксплуатация Rails-приложений

АНАЛИЗ СИТУАЦИИ

Код не менялсяСтектрейс ведет в lib/coords.rb

@@parser = RGeo::WKRep::WKBParser.new

def coords

@@parser.parse(geo_coords)

end

Page 37: Отладка и эксплуатация Rails-приложений

РЕЗУЛЬТАТ АНАЛИЗА: ОДИН WKBPARSER НА ВСЕ ПОТОКИ

WKBParser не является потокобезопасным

Активно используются instance-переменные

Page 38: Отладка и эксплуатация Rails-приложений

ЕЩЕ ПРИМЕР

Page 39: Отладка и эксплуатация Rails-приложений

ЧТО СЛУЧИЛОСЬ?

502 на все запросы

Page 40: Отладка и эксплуатация Rails-приложений

АНАЛИЗ СИТУАЦИИ

Процессы работают

CPU — ОК

RAM — ОК

Сеть — ОК

В логах пусто — кого-то ждем

Page 41: Отладка и эксплуатация Rails-приложений

ПРОБЛЕМА 1

Причина: strace — подвисли на запросе к APIбез API можно обработать 85% запросов

Решение: мониторим состояние API и если все плохо —просто не делаем запросов

Page 42: Отладка и эксплуатация Rails-приложений

ЕЩЕ ПРИМЕР

Page 43: Отладка и эксплуатация Rails-приложений

ЧТО СЛУЧИЛОСЬ?

502 на все запросыДля пользователя тоже самое

Page 44: Отладка и эксплуатация Rails-приложений

АНАЛИЗ СИТУАЦИИ

В логах — началась обработка запроса и висит

Page 45: Отладка и эксплуатация Rails-приложений

ПРОБЛЕМА 2

Причина: Длинные транзакции в sidekiq воркерахПревышение лимита одновременных транзакций

Решение: Делаем в транзакции только самое необходимое, остальное — вне транзакции.

Page 46: Отладка и эксплуатация Rails-приложений

ЕЩЕ ПРИМЕР

Page 47: Отладка и эксплуатация Rails-приложений

ЧТО СЛУЧИЛОСЬ?

502 на все запросы

Page 48: Отладка и эксплуатация Rails-приложений

АНАЛИЗ СИТУАЦИИ

CPU — ОК

RAM — ОК

Сеть — ОК

В логах — пусто. Воспроизводится не регулярно

Page 49: Отладка и эксплуатация Rails-приложений

АДМИНЫ БД ГОВОРЯТ —ПРОБЛЕМА 2

ТВОЙ СОФТ — ГОВНО!

Page 50: Отладка и эксплуатация Rails-приложений

АНАЛИЗ СИТУАЦИИ

def fill_location(loc)

if loc

self.coords_source = loc.source

self.coords = loc.coords

fill_address_if_required

end

self.state = 'processed'

save! # ← зависает тут

end

Page 51: Отладка и эксплуатация Rails-приложений

АНАЛИЗ СИТУАЦИИ

BEGIN TRANSACTION;

UPDATE ...;

COMMIT;

Page 52: Отладка и эксплуатация Rails-приложений

Я ТЕБЕ НЕ ВЕРЮ!

Page 53: Отладка и эксплуатация Rails-приложений

PFF…

Page 54: Отладка и эксплуатация Rails-приложений

ПРОБЛЕМА 3

pg 0.14.1 (2012 год)

Page 55: Отладка и эксплуатация Rails-приложений
Page 56: Отладка и эксплуатация Rails-приложений

ПРОБЛЕМА 3

Зависание — в нативном расширении. Обновление гема pg спасло мир!

Page 57: Отладка и эксплуатация Rails-приложений

ВЫВОД

Отладка - набор эвристик + метод научного тыка. Чем лучше эвристики, тем выше вероятность того, что проблема будет решена быстро.

Page 58: Отладка и эксплуатация Rails-приложений

ВОПРОСЫ?