Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов

36 %
64 %
Information about Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Technology

Published on September 26, 2014

Author: yandex

Source: slideshare.net

Description

В докладе речь пойдёт о языке Go. Вячеслав расскажет о внутреннем устройстве языка (структуре, оптимизации, сборщике мусора и т.д.), о том, как и почему Go используют в Яндексе и что о нём говорят разработчики на С++. Отдельно Вячеслав остановится на многопоточном программировании и особенностях отладки и профилирования в Go.

Плюсы и минусы Go для разработчиков на C++ Слава Бахмутов - старший разработчик C++ party Новосибирск, 26.09.2014

Структура доклада 1. Пропаганда 1. История Go и описание языка 2. Особенности нашей разработки 3. Выбор, внедрение и выводы 2. Внутренности A. Память B. Функции и escape analysis C. Go рутины D. Планировщик E. Стек 3

Пропаганда 4 1. История Go и описание языка 2. Особенности нашей разработки 3. Выбор, внедрение и выводы

История Go. Начало. Разработан и поддерживается Google 2007 — начало разработки 2009 — публичный релиз 2012 — go 1.0 2014 — go 1.3. ОС: Linux, Mac OS X, FreeBSD, NetBSD, OpenBSD, Plan 9 и Microsoft Windows. Платформы: i386, amd64 и ARM 2015 — go 1.4 поддержка Android?* 5 * http://bit.ly/go-android Кен То́мпсон Роб Пайк

История Go. Развитие. 6 https://www.openhub.net/languages/compare

История Go. Развитие. 7 https://www.openhub.net/languages/compare

История Go. Проекты. 8 Gogs Github репозитории, написанные на Go

История Go. Сообщество. 9 Группа Golang Russian

История Go. Бизнес. 10 Список компаний

Описание языка. Кратко. 1. Очень простой. 2. Компилируемый, со строгой типизацией. 3. Со сборкой мусора 4. Лёгкие процессы - Go рутины. 5. Нет дженериков, наследования, переопределения операторов, pointer arithmetic. 6. Богатая стандартная библиотека, но не шлак. 7. Большой набор инструментов для разработки (запуск тестов с [покрытием], форматирование кода, кросскомпиляция, отладка, поиск гонок, профилирование и т.д.) 8. Разработан для больших команд и высокой нагрузки (со вкусом Google) 11

Особенности нашей разработки. 12 Python C++ ~500 RPS >5000 RPS

Проблемы - медленная разработка - трудно писать юнит тесты - а никто и не пишет =( 13 С++ Python - медленная работа - юнит тесты для проверки типов - жадный до ресурсов - лапша калбеков - зависимости Гибридная нагрузка!

В поисках нового. 14

В поисках нового. 15

В поисках нового. 16

В поисках нового. 17

В поисках нового. 18 GO!

Внедрение Go в Cocaine. Написали фреймворк за выходные* Приложения в облаке — обычные HttpHandler Приложения запускаются и без Cocaine 19 * http://bit.ly/cocaine-go

Внедрение Go в Cocaine. 20

Выводы. Плюсы. 21 Тесты Go рутины Простота языка Исследование проблем, улов утечек Мало потребляет, много обрабатывает Питонщики с радостью переходят на Go Нет зависимостей Быстрая компиляция

Выводы. Тесты. 22 Всё включено: go test -bench go test -bench -cpu=1,2,4 go test -benchmem go test -cpuprofile go test -memprofile go test -blockprofile

Выводы. Тесты. 23 + мощность покрытия

Выводы. Тесты 24 BDD, TDD и другие

Выводы. Профайлинг. 25 1.Профайлер горутин 2.Трейсер GC 3.Трейсер планировщика 4.Трейсер аллокатора памяти 5.Статистика аллокатора памяти 6.Дамп кучи

Выводы. Профайлинг. 26

Выводы. Профайлинг. 27

Выводы. Races. 28

Выводы. Производительность. 29 Python C++ Регулярки уже починили

Выводы. Производительность. 30 С++ Тесты http доступа к Elliptics

Выводы. Производительность. 31 Go 1.3 GC off Тесты http доступа к Elliptics

Выводы. Производительность. 32 Go 1.3 GC on Тесты http доступа к Elliptics

Выводы. Память. 33 Много данных В среднем Много клиентских http запросов (~1000rps)

Выводы. Минусы. Моё мнение. 34 Generics - но не так критично Работа с ошибками Неочевидность некоторых вещей Проблемы в библиотеках Часть вещей приходится писать самим Плюсовики переходят на Go с трудом

Выводы. Минусы плюсовиков. Дорогие вызовы сишных расширений Писать расширения для С++ - задолбешься и вызовешь сОтОну Нет возможностей тонкого управления GC Недооптимизированный оптимизатор Встроенные range, len, cap, make итд только для builtin типов Нет человеческих исключений. Протаскивание ошибок по стеку сильно утомляет Зато есть странные паники и затычка в виде defer. Определение области видимости по регистру первой буквы. Хорошо еще блоки не пробельными символами определяются. ! 35

Выводы. Плюсы плюсовиков. Интерфейсы зашибись, для проектирования и тестирования. Асинхронщина легка, как утренний ветер. К тому же HTTP библиотека хорошая, плюсы похвастать этим не могут. Тесты - важная часть программирования. То что они "в пакете" - это ценно. Удобно устанавливать пакеты через go get Хорошее и удобное low-level crypto api 36

Выводы. Результаты. 37 В 2 раза медленнее C++ и в 8-15 раз быстрее python* В ~30 раз меньше потребление памяти чем python* Нагрузка на кластер уменьшилась на 70 % Ручки работают уже год и не единого разрыва * на наших задачах

Внутренности 38 A. Память B. Функции и escape analysis C. Go рутины D. Планировщик E. Стек

Память. 39 Go - 4 байта Python - 24 байта Java - 4 байта Java - 16/24 байта (32/64) Структуры с поправкой на выравнивание

Память. 40

Вызов функций 1.Создаётся новый фрейм стека и записывается информация о вызывающей функции. 2.Все регистры, которые могут быть перезаписаны - сохраняются. 3.Контекст выполнения переключается на адрес новой функции 41 Достаточно дорого

Вызов функций. Inlining 1.Почти все небольшие функции встраиваются. 2.Даже между разными пакетами. В том числе и из стандартной библиотеки (учитывает это). 3.Увеличивается размер исполняемого файла. 4.Уменьшаются накладные расходы 5.Ничего нового, так делают почти все. 6.Приводит к дополнительным оптимизациям. 42

Вызов функций. Inlining 43 Оптимизируется мёртвый код Помогает решить: стек или куча

Escape analysis 1.Go сам решает, где выделяется память 2.Определяет, выходят ли указатели на значение за функцию или нет. 3.Если нет, то данные спокойно располагаются на стеке 4.Данные на стеке удаляются после выхода из функции и освобождения стека все скопом. 5.Нет повода беспокоить сборщик мусора ! 44

Escape analysis. Пример 1 45 1.Значение numbers расположится на стеке 2.Функция ничего не размещает в куче 3.Сборщик мусора не у дел

Escape analysis. Пример 2 46 1.Функция Center встроится в CenterCursor 2.Cursor не покидает функцию и будет располагаться на стеке

Escape analysis. Дебаг 47

Go рутины. Причины. 1.Системные треды тяжелые 2.Избыточная функциональность. 3.При сборке мусора нужно консистентное состояние 4.Хочется модель N:M 48

Go рутины. 1.Кооперативная многозадачность 2.Переключение между Go рутинами в точно определённых моментах 3.Компилятор знает, какие регистры используются и сохраняет их автоматически 4.Выделяется 4 кб памяти на стек (дальше меньше) 5.Выделение памяти только при запуске. 49

Go рутины. Переключение 1.Работа с каналами 2.Блокирующие системные вызовы 3.Сборка мусора 4.Вызов функций (не инлайн) 5.netpoller (epoll, kqueue ..) 6.Добровольно runtime.gosched 7.ещё 50

Go рутины. Переключение 51

Go рутины. Планировщик. 52 Как это было 14% is spent in runtime.futex()

Go рутины. Планировщик. 53 M - системный тред P - процессор (контекст) G - Go рутина Как стало

Go рутины. Планировщик. 54

Go рутины. Планировщик. 55 M1 берётся из пула или создаётся

Go рутины. Планировщик. 56 Балансировка Go рутин

Go рутины. Планировщик. 57 1.Пытаемся распределять Go рутины, в зависимости друг от друга 2.Go рутины запускаются на горячем кеше 3.Одна глобальная очередь и локальные на каждом P 4.Оптимизация работы с каналами (отдельная большая тема) 5.Маленькие накладные расходы, 4кб на стек

Стек 58 Надо сразу выделить побольше стека

Стек в Go рутинах 59 1.Нет guard pages 2.Размер стека очень маленький (4кб) 3.Стек растёт если нужно

Стек в Go рутинах 60

Стек в Go рутинах 61 Hot-split problem

Стек в Go рутинах 62

Garbage collector. Планы 1.Гибридный STW/CGC, tricolor mark and sweep 2.Quality of Service 10/50 ms 3.Огромное пространство для улучшения 4.Отдельная большая тема ! 63

Источники 1.Analysis of the Go runtime scheduler (Columbia University) 2.Morsing’s Blog 3.The Go Programming Language Blog 4.Dmitry Vyukov (blog, answers and proposals) 5.Dave Chaney 6.Golang groups: nuts and devs and russian 64

Спасибо за внимание 65 twitter: @m0sth8 email: m0sth8@yandex-team.ru доклад: http://bit.ly/go-doklad2

Add a comment

Related presentations

Related pages

002. Плюсы и минусы Go для разработчиков на C++ - Вячеслав ...

... как и почему Go и ... Go для разработчиков на C++ ... Вячеслав Бахмутов ...
Read more

Плюсы и минусы Go для разработчиков на C++, Вячеслав ...

Плюсы и минусы Go для разработчиков на ... Плюсы и минусы Go для ... Go. Вячеслав ...
Read more

C++ Party 2014: Лекция 2. Плюсы и минусы Go для ...

Бахнутов Вячеслав рассказывает о плюсах и минусах Go для разработчиков на С ...
Read more

C 002 — BIQLE Video

Плюсы и минусы Go для разработчиков на C++ - Вячеслав Бахмутов. ... и Анна часть 002 c 6 ...
Read more

C++ за час - YouTube

... Go для разработчиков на ... Плюсы и минусы Go для разработчиков на C++ - Вячеслав ...
Read more

Виртуализация в SQA Плюсы и минусы - Education

Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов В докладе речь пойдёт о ...
Read more

Молодёжные субкультуры: плюсы и минусы - Documents

Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов ... плюсы и минусы на ...
Read more

C++ party - expozilla.ru

19:20 Плюсы и минусы Go для разработчиков на C++ (Вячеслав Бахмутов, ... На указанный Вами ...
Read more

В Бахмуте судили "Якута". Суд оцепила вооруженная охрана ...

Суд оцепила вооруженная охрана без регистрации и в высоком качестве на ... a b c d e f g h i j ...
Read more