Николай Сивко "Хорошо поддерживаемое в продакшне приложение"
Мир	глазами	разработчика	
1.  Есть	задача	с	требованиями	
2.  Пишу	код	+	тесты	
3.  Показал	demo	заказчику	
4.  Передал	в	producIon	
	
Если	баг	или	проблема	в	producIon:	GOTO	#1
Мир	глазами	админа	
•  Выкатил	новую	версию	приложения	
•  В	3:00	утра	SMS:	“HTTP-50x	>	20rps”	
•  Приложение	жрет	4	ядра,	в	логе	пусто	
•  Фронтенд	не	дожидается	ответа	от	сервиса	за	10s	и	отдает	
пользователям	504	
•  Разработчик	просит	проверить	сеть/БД/… и	вообще	перезапустить
DevOps:	РазрабАдмин?
С	чего	обычно	начинается	DevOps?	
•  ConInuous	delivery	и	деплой	10	раз	в	час!	
•  Спрячем	от	разработчика	железки	за	Docker	c	оркестрацией!	
•  Чтобы	все	масштабировалось	на	лету	будем	ходить	за	
конфигами	по	сети,	целостность	нам	обеспечит	Paxos/Ray!	
•  Так	мы	без	проблем	будем	расти	до	планетарного	масштаба	
ничего	не	меняя	коде!
С	чего	обычно	начинается	DevOps?	
•  ConInuous	delivery	и	деплой	10	раз	в	час!	
•  Спрячем	от	разработчика	железки	за	Docker	c	оркестрацией!	
•  Чтобы	все	масштабировалось	на	лету	будем	ходить	за	
конфигами	по	сети,	целостность	нам	обеспечит	Paxos/Ray!	
•  Так	мы	без	проблем	будем	расти	до	планетарного	масштаба	
ничего	не	меняя	коде!
Чего	хочет	бизнес?	
•  ProducIon	должен	работать	
•  Если	что-то	ломается,	нужно	быстро	
определить	причину	и	починить	
•  Сделать	так,	чтобы	не	повторялось
DevOps:	РазрабАдмин		
Разработчик	думает	о	том,	как	поддерживать	
приложение	в	producIon	или	сам	это	делает	
	
ИЛИ	
	
Когда	админ	начинает	писать	код	(это	горе	в	
семье,	но	случается:)
Будем	говорить	про	диагностику	
•  Посмотрим,	как	сделано	у	популярного	
софта:	nginx,	mongo,	postgresql	
•  Какие	вообще	есть	подходы?	
•  Как	делать	у	себя?
•  Входящие	запросы	
•  Бэкенды	
•  Статика,	кэш	
•  Lua,	perl,	…
Nginx:	error_log	
	
2016/10/10	12:27:57	[error]	6219#0:	*130819912	upstream	Imed	out	(110:	
ConnecIon	Imed	out)	while	connecIng	to	upstream,	client:	1.2.3.4,	server:	
okmeter.io,	request:	"POST	/metric/write	HTTP/1.1",	upstream:	"h‘p://
192.168.100.9:8088/metric/write",	host:	"okmeter.io"	
	
•  У	какого	именно	клиента	ошибка	
•  Какой	бэкенд	не	ответил
Nginx:	access_log	
1.2.3.4 - - [10/Oct/2016:14:04:38 +0300] "POST /metric/write HTTP/1.1" 200
2 "-" "Go-http-client/1.1" 0.103 - [0.039, 0.064] {192.168.100.5:8088,
192.168.100.4:8088} 	{504,	200}	
•  Какой	статус	вернули	клиенту	
•  Что	вернул	каждый	бэкенд,	сколько	было	попыток	
•  Сколько	ждали	каждого	бэкенда	
•  Сколько	ждал	пользователь
Nginx:	debug	log	
•  Показывает	все	этапы	обработки	запроса	
•  Можно	только	для	конкретных	IP/сетей	
(debug_connecIon)	
•  Можно	в	циклический	буфер	в	памяти
Nginx:	stub_status	
AcIve	connecIons:	291		
server	accepts	handled	requests	
	16630948	16630948	31070465		
Reading:	6	WriIng:	179	WaiIng:	106
Nginx:	тёмные	пятна	
•  Сколько	ждали	диск:	читали	данные	с	
диска,	писали	лог		
•  Другие	блокировки	IO	loop:	логика	nginx,	
логика	пользователя	(lua)
•  Данные	
•  Запросы	+	CPU	bound	логика	(aggregaIon)	
•  Ресурсы:	диск,	сеть,	процессор
Mongo	
•  serverStatus	-	server-wide	метрики	
•  dbStats-	db-wide	метрики	
•  collStats	–	collecIon-wide	метрики
Mongo:	query	profiler	
•  Capped	collecIon	с	профайлингом	запросов	
•  Включается	для	всех	или	только	для	
“медленных”	
•  Может	негативно	повлиять	на	
производительность
Mongo:	практика	
Метрик	много,	но	большинство	из	них	для	
разработчика	mongo	
	
Пользователь	может	только:	
	-	прибить	плохой	запрос	
	-	исправить	запросы/схему	данных/индексы	
	-	поменять	конфиг		
	-	добавить	ресурсов
Mongo:	тёмные	пятна	
•  Какой	запрос	прямо	сейчас	всё	убивает?	
•  На	какие	запросы	уходят	ресурсы?	
•  Какие	запросы	удерживают	локи?
•  Данные	
•  Запросы	
•  Ресурсы:	диск,	сеть,	процессор
PostgreSQL:	данные	
•  pg_stat_all_(tables|indexes)	
•  pg_staIo_all_(tables|indexes)
PostgreSQL:	запроcы	
•  pg_stat_acIvity	– что	происходит	прямо	
сейчас	
•  pg_stat_statements	–	накопленные	счетчики	
по	группам	запросов
PostgreSQL:	локи	
•  pg_stat_acIvity.wait_event	– 9.6+	
•  pg_locks	– можно	JOIN	на	pg_stat_acIvity	по	
pid
PostgreSQL:	тёмные	пятна	
В	постгресе	почти	идельная	диагностика.	
Постгрес	умный.	
Будь	как	постгрес.
Зачем	мы	все	это	смотрели?	
•  Web	приложения	похожи	на	nginx,	только	больше	
вычислений	после	получения	данных,	у	nginx	
хорошие	логи	
•  Mongo	– пример	того,	как	всё	покрыли	счетчиками,	
но	забыли	про	сценарии	использования	
диагностики	
•  PG	– пример	того,	как	должно	быть
Диагностика:	вопросы		
•  Чем	приложение	занято	прямо	сейчас?	
•  Чем	приложение	занималось	в	вчера	в	18:43?	
•  На	какие	задачи/запросы	были	потрачены	ресурсы?	
•  Сколько	и	каких	ошибок	было?	
•  Сколько	ждали	ответа	базы	вчера/сегодня?	
•  Почему	отдали	HTTP-400?
Подходы	
•  Thread/stack	dump	и	аналоги	
	
•  Лог	
•  Счетчики/таймеры/мгновенные	значения
Thread/stack	dump	и	аналоги	
•  Мгновенный	снимок:	в	каком	месте	кода	
находится	управление	каждого	“потока”	
•  Больше	про	runIme,	а	не	ваш	код	
•  Высокоуровневые	аналоги:	какие	запросы	
сейчас	обрабатываем	и	на	какой	они	стадии
Thread/stack	dump	и	аналоги	
•  Java:		jstack	<pid>	
•  Golang:		
– enable	pprof		
– curl	
h‘p://IP:PORT/debug/pprof/gorouIne?debug=2
Высокоуровневые	аналоги	
•  PG:	pg_stat_acIvity	
•  Mysql:	SHOW	PROCESSLIST	
•  Apache:	mod_status
Лог	
•  Правильно	писать	логи	очень	сложно	
•  Правильно	=	написать	нужное	и	НЕ	писать	
лишнее	
•  Общего	рецепта	нет	– все	системы	разные	
•  Предлагаю	исходить	из	сценариев	
использования
Лог:	сценарий	
Вы	видите	в	логе	nginx:	
…..	”GET /url HTTP/1.1" 504		
request_Ime=0.101 	
upstream_response_Ime=[0.101] 	
upstream_addr={192.168.1.1:8000} 		
upstream_status={504}	
	
Что	вы	будете	делать	дальше?
Лог:	сценарий	
Вы	захотите	узнать,	что	в	логе	у	192.168.1.1	по	
этому	запросу!	
	
Что	такое	“этот	запрос”?
Лог:	request_id	
•  На	входе	генерим	id	запроса	(nginx	$request_id	например)	
•  Ставим	заголовком	во	все	запросы	дальше:	
						X-Request-Id:	123456	
•  Во	всех	сервисах	пишем	в	лог	
•  Можно	даже	в	SQL	комментарий
Лог:	request_id	
Nginx	
…..	”GET /url HTTP/1.1" 504		
0.101 [0.101] 	{192.168.1.1:8000} 	{504}	req_id=123456		
	
192.168.1.1:	
<Imestamp>	id:123456	querying	session	from	session_db1	<Imestamp>	id:123456	client	
closes	connecIon	
<Imestamp>	id:123456	GET	/api/blabla	499	0.101s	
	
PG:	
<Imestamp>	<pid>	<user>@<db>	from	192.168.1.1	[vxid:x/y	txid:0]	[SELECT]	LOG:		
duraIon:	147.020	ms		execute	<unnamed>:				
/*	123456	*/	select	*	from	session	where	session.id=$1		AND	…
Лог:	итого	
•  Нужно	отличать	запросы	друг	от	друга	(request	id)	
•  Пишем	не	только	законченные	действия	(бывает	нужно	ловить	
залипшие)	
•  Если	куда-то	идем,	пишем	конкретный	адрес	
•  Пишем	все	ошибки	и	как	их	обработали	
•  Замеряем	время	значимых	операций
Лог:	нагрузка	
•  Подробное	логирование	создает	нагрузку	
•  Если	вводим	разные	уровни	логирования,	то	
нужна	ручка	переключения	без	перезапуска	
•  К	логам	можно	цеплять	парсеры	для	
получения	метрик,	но	это	тоже	нагрузка
Метрики	приложения	
•  Счетчики	событий	(ошибки,	запросы,	…)	
•  Таймеры	(замеряем	продолжительность	
каких-то	действий)	
•  Мгновенные	значения	(текущее	количество	
соединений,	размер	кэша,…)
Метрики	приложения	
•  Теряем	часть	информации	по	сравнению	с	логом	
•  Но	сильно	дешевле	логов	
•  Экспортируем	в	мониторинг	то,	что	насчитали	
•  Рисуем	графики	
•  Настраиваем	алерты,	если	нужно
Метрики	приложения:	инструменты	
•  <your_lang>-metrics	
•  <your_lang>-statsd-client
Инструменты:	<your_lang>-metrics	
•  Либа	для	вашего	приложения,	есть	для	всех	
ЯП	
•  Аккумулирует	замеры	в	памяти	
•  Экспортирует	в	различные	системы	(graphite,	
influx,	лог,	…)
Инструменты:	statsd	
•  UDP	сервер	принимает	отстрелы	замеров	из	
приложения,	агрегирует	и	экспортирует	в	мониторинг	
•  Клиенты	для	всех	ЯП	
•  Семантика	примерно	такая	же	как	в	*-metrics	
•  Есть	библиотеки	с	предварительной	агрегацией	на	
клиенте
Счетчики	
Golang
Таймеры	
Golang
Кейс	с	HTTP-504
Николай Сивко "Хорошо поддерживаемое в продакшне приложение"
Цена	метрик	(golang)	
•  GetOrRegister 122 ns/op
•  CounterInc 	10 ns/op
•  Timer_Time 	879 ns/op
•  2xNow 			38 ns/op	
	
10.000	rps	*	(10	таймеров	в	каждом)	=	диагностика	
займет	~9%	одного	ядра
Итого	
•  DevOps	нужно	начинать	с	диагностики	
•  Диагностика	–	это	просто	
•  Делайте	диагностику	исходя	из	сценариев	использования	
•  Есть	много	готовых	инструментов	
	
•  После	этого	можно	docker,	CI/CD	и	100500	микросервисов	:)
Спасибо	за	внимание!	
Вопросы?	
	
Николай	Сивко	
nsv@okmeter.io

More Related Content

PDF
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)
PDF
DevOps-трансформация Альфа-Банка / Антон Исанин (Альфа-Банк)
PDF
"Девопс - это не только для программистов. Практические примеры из жизни одно...
PDF
«CI. Jenkins. 2GIS» — Игорь Павлов, 2ГИС
PDF
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
PDF
Highway to Сontinuous Integration, Денис Трифонов (2GIS)
PDF
А так ли нужен DevOps инженер в проекте?
PDF
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)
DevOps-трансформация Альфа-Банка / Антон Исанин (Альфа-Банк)
"Девопс - это не только для программистов. Практические примеры из жизни одно...
«CI. Jenkins. 2GIS» — Игорь Павлов, 2ГИС
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
Highway to Сontinuous Integration, Денис Трифонов (2GIS)
А так ли нужен DevOps инженер в проекте?
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)

What's hot (19)

PDF
Continuousdelivery
PPTX
Codeception + Docker + Robo и что из этого вышло
PDF
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
PPTX
SECON'2017, Кулагин Егор, Непрерывное развертывание. Конвейер здорового челов...
PPTX
Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019
PDF
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
PDF
DevOps-40 meetup #7, Project FiFo
ODP
Обзор Continuous integration инструментов
PDF
Тестирование осень 2013 лекция 5
PPTX
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
PPTX
Как мы собираем проекты в выделенном окружении в Windows Docker
PDF
Опыт использования Erlang в разработке многопользовательской игры
PDF
Continuous Delivery, или волшебная кнопка для релизов по запросу, Денис Яковл...
PDF
Winium — это как Selenium, только под Windows
PDF
Tech Talks @NSU: Проходим тест Джоэла
PDF
Страх и ненависть в мире релиз-инжиниринга
PDF
Erlyvideo v3
PPT
Devpoint2 video in internet
PDF
TК°Conf. Микросервисы и Docker. Глеб Паньшин.
Continuousdelivery
Codeception + Docker + Robo и что из этого вышло
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
SECON'2017, Кулагин Егор, Непрерывное развертывание. Конвейер здорового челов...
Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
DevOps-40 meetup #7, Project FiFo
Обзор Continuous integration инструментов
Тестирование осень 2013 лекция 5
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
Как мы собираем проекты в выделенном окружении в Windows Docker
Опыт использования Erlang в разработке многопользовательской игры
Continuous Delivery, или волшебная кнопка для релизов по запросу, Денис Яковл...
Winium — это как Selenium, только под Windows
Tech Talks @NSU: Проходим тест Джоэла
Страх и ненависть в мире релиз-инжиниринга
Erlyvideo v3
Devpoint2 video in internet
TК°Conf. Микросервисы и Docker. Глеб Паньшин.
Ad

Viewers also liked (17)

PDF
Алексей Лесовский "Тюнинг Linux для баз данных. "
PPTX
Александр Краковецкий "Разработка интеллектуальных ботов с помощью Microsoft ...
PDF
Алексей Залесов-«Управление контейнерами в облаках»
PDF
Артем Маринов "Сегментируем 600 млн. пользователей в режиме реального времени...
PDF
Сергей Аверин "Распространенные ошибки применения баз данных"
PDF
Артем Гавриченков "The Dark Side of Things: Distributed Denial of Service Att...
PDF
Левон Авакян "Архитектура мета игры Wargaming. Глобальная карта 2.0"
PPTX
Сергей Сверчков "Want to build a secure private cloud for IoT with high avail...
PDF
Вадим Мадисон "Опыт разработки через микросервисы"
PDF
Дмитрий Хоревич "Cloud native security with UAA \ Как защитить микросервисы с...
PDF
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
PDF
Артем Маринов "Сегментируем 600 млн. пользователей в режиме реального времени...
PDF
Максим Барышиков-«WoT: Geographically distributed cluster of clusters»
PDF
Юрий Насретдинов-«Сбор логов в «облаке» в Badoo»
PDF
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
PDF
Левон Авакян-«Эволюция кланов в Wargaming. От веб страницы на танковом портал...
PDF
Александр Ломов-«Как перестать беспокоиться и начать использовать Cloud Foundry»
Алексей Лесовский "Тюнинг Linux для баз данных. "
Александр Краковецкий "Разработка интеллектуальных ботов с помощью Microsoft ...
Алексей Залесов-«Управление контейнерами в облаках»
Артем Маринов "Сегментируем 600 млн. пользователей в режиме реального времени...
Сергей Аверин "Распространенные ошибки применения баз данных"
Артем Гавриченков "The Dark Side of Things: Distributed Denial of Service Att...
Левон Авакян "Архитектура мета игры Wargaming. Глобальная карта 2.0"
Сергей Сверчков "Want to build a secure private cloud for IoT with high avail...
Вадим Мадисон "Опыт разработки через микросервисы"
Дмитрий Хоревич "Cloud native security with UAA \ Как защитить микросервисы с...
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Артем Маринов "Сегментируем 600 млн. пользователей в режиме реального времени...
Максим Барышиков-«WoT: Geographically distributed cluster of clusters»
Юрий Насретдинов-«Сбор логов в «облаке» в Badoo»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Левон Авакян-«Эволюция кланов в Wargaming. От веб страницы на танковом портал...
Александр Ломов-«Как перестать беспокоиться и начать использовать Cloud Foundry»
Ad

Similar to Николай Сивко "Хорошо поддерживаемое в продакшне приложение" (20)

PDF
Хорошо поддерживаемое приложение
PPTX
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
PDF
Docker - счастье для хомячка или ника?
PDF
QA Fest 2019. Александр Хотемской. WebdriverIO + Puppeteer. Double gun - doub...
PPT
История проекта, который никогда не падает / Андрей Шетухин
PDF
Проходим тест Джоэла
PDF
Rozum robotics release cycle
PDF
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
PPTX
WebdriverIO + Puppeteer. Double gun – double fun
PPTX
Как не подавиться большим старым проектом
PDF
Алексей Лустин. Непрерывная проверка качества кода.
PDF
Андрей Сибирёв "Ваше собственное облако — война за независимость"
PPTX
разработка корп приложений на платформе 1с 8
PPTX
Net core and linux in production
PDF
Мифы о DevOps / Александр Титов, Иван Евтухович (Экспресс 42)
PDF
PPT
Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Ваше...
PDF
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
PPTX
Лучшие практики на практике
PDF
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Хорошо поддерживаемое приложение
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Docker - счастье для хомячка или ника?
QA Fest 2019. Александр Хотемской. WebdriverIO + Puppeteer. Double gun - doub...
История проекта, который никогда не падает / Андрей Шетухин
Проходим тест Джоэла
Rozum robotics release cycle
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
WebdriverIO + Puppeteer. Double gun – double fun
Как не подавиться большим старым проектом
Алексей Лустин. Непрерывная проверка качества кода.
Андрей Сибирёв "Ваше собственное облако — война за независимость"
разработка корп приложений на платформе 1с 8
Net core and linux in production
Мифы о DevOps / Александр Титов, Иван Евтухович (Экспресс 42)
Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Ваше...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Лучшие практики на практике
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...

More from Tanya Denisyuk (13)

PPTX
Павел Вейник-«Программирование и лингвистика: как понять язык и как извлечь з...
PPTX
Михаил Серченя-«Построение отказоустойчивой масштабируемой среды для WEB и бе...
PPTX
Дмитрий Лазаренко-«Живая миграция и отказоустойчивость контейнеров в гибридно...
PDF
Андрей Федоренчик- «Высоконагруженная система с аналитикой на InfoBright»
PDF
Роман Иманкулов-«Быстрые и масштабируемые приложения с Sync API»
PPTX
Дмитрий Дурасов-«Технологии контейнеризации в Windows Server 2016»
PDF
Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если на...
PDF
Александр Тоболь, Кадры решают все, или стриминг видео в Одноклассниках
PDF
Денис Баталов, Принципы построения высоконагруженных сайтов на платформе АWS
PDF
Кирилл Алешин, Ламбда Архитектура на практике
PDF
Михаил Табунов, Аналитическая платформа на несколько миллиардов событий в месяц
PDF
Alvaro Videla, Building a Distributed Data Ingestion System with RabbitMQ
PDF
Антон Тюрин, Евгений Сафронов, Инфраструктура под Cocaine
Павел Вейник-«Программирование и лингвистика: как понять язык и как извлечь з...
Михаил Серченя-«Построение отказоустойчивой масштабируемой среды для WEB и бе...
Дмитрий Лазаренко-«Живая миграция и отказоустойчивость контейнеров в гибридно...
Андрей Федоренчик- «Высоконагруженная система с аналитикой на InfoBright»
Роман Иманкулов-«Быстрые и масштабируемые приложения с Sync API»
Дмитрий Дурасов-«Технологии контейнеризации в Windows Server 2016»
Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если на...
Александр Тоболь, Кадры решают все, или стриминг видео в Одноклассниках
Денис Баталов, Принципы построения высоконагруженных сайтов на платформе АWS
Кирилл Алешин, Ламбда Архитектура на практике
Михаил Табунов, Аналитическая платформа на несколько миллиардов событий в месяц
Alvaro Videla, Building a Distributed Data Ingestion System with RabbitMQ
Антон Тюрин, Евгений Сафронов, Инфраструктура под Cocaine

Николай Сивко "Хорошо поддерживаемое в продакшне приложение"