Слайды доклада на конференции C++ Corehard Winter 2017 (г.Минск).
Автор доклада давно и успешно использует Модель Акторов при разработке приложений на C++. В основном это был положительный опыт. Но есть некоторые неочевидные моменты, про которые было бы хорошо узнать заранее. О том, где использование Модели Акторов уместно, а где нет, на какие грабли довелось наступить, какие шишки были набиты, как можно упростить себе жизнь и пойдет речь в докладе.
Презентация с Highload++ 2011
---
Принципы работы сборщика мусора в JVM. Использование принципа поколений. Параллельная и фоновая сборка мусора. Особенности реализации алгоритмов сборки мусора в HostSpot и JRockit JVM. Причины пауз сборки мусора и способы борьбы с ними. Особенности работы с "большими" JVM - 32 гигабайта и больше. Альтернативы сборщике мусора, прямое управление памятью в Java.
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)aragozin
Обеспечение достойной производительности высокоуровневого языка с динамической типизацией - непростая задача. Just-in-time (JIT) компиляция - динамическая генерация машинного кода с учетом информации, собранной во время выполнения приложения - ключевой элемент производительности виртуальной машины (будь то Java, .NET или даже JavaScript). JIT-компилятор, в свою очередь, должен иметь впечатляющий набор трюков и оптимизаций, что бы компенсировать "динамизм" языка.
В докладе речь пойдет о достижениях современной JIT компиляции в целом и более подробно будут освещены особенности HotSpot JVM (бесплатной JVM от Oracle)
There are hundreds of JVM parameters and options out there. Here we are going to take a closer look at the internal structure of HotSpot VM while over-viewing memory spaces and different types of Garbage Collectors.
Слайды доклада на конференции C++ Corehard Winter 2017 (г.Минск).
Автор доклада давно и успешно использует Модель Акторов при разработке приложений на C++. В основном это был положительный опыт. Но есть некоторые неочевидные моменты, про которые было бы хорошо узнать заранее. О том, где использование Модели Акторов уместно, а где нет, на какие грабли довелось наступить, какие шишки были набиты, как можно упростить себе жизнь и пойдет речь в докладе.
Презентация с Highload++ 2011
---
Принципы работы сборщика мусора в JVM. Использование принципа поколений. Параллельная и фоновая сборка мусора. Особенности реализации алгоритмов сборки мусора в HostSpot и JRockit JVM. Причины пауз сборки мусора и способы борьбы с ними. Особенности работы с "большими" JVM - 32 гигабайта и больше. Альтернативы сборщике мусора, прямое управление памятью в Java.
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)aragozin
Обеспечение достойной производительности высокоуровневого языка с динамической типизацией - непростая задача. Just-in-time (JIT) компиляция - динамическая генерация машинного кода с учетом информации, собранной во время выполнения приложения - ключевой элемент производительности виртуальной машины (будь то Java, .NET или даже JavaScript). JIT-компилятор, в свою очередь, должен иметь впечатляющий набор трюков и оптимизаций, что бы компенсировать "динамизм" языка.
В докладе речь пойдет о достижениях современной JIT компиляции в целом и более подробно будут освещены особенности HotSpot JVM (бесплатной JVM от Oracle)
There are hundreds of JVM parameters and options out there. Here we are going to take a closer look at the internal structure of HotSpot VM while over-viewing memory spaces and different types of Garbage Collectors.
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...IT-Portfolio
13 октября, DEV {web} - конференция о Highload веб-разработке. «Грабли при масштабировании веб-приложения, на которые очень легко наступить», Евгений Коковихин (системный архитектор WapStart)
Аннотация
Что происходит при росте приложения с 1М до 50М хитов в сутки. С какими проблемами можно столкнуться, когда серверов становится больше одного. О чем важно помнить при проектировании приложения, способного масштабироваться.
Подробно
Когда мы сделали первую публичную версию plus1.wapstart.ru, она помещалась на один сервер и была соответствующим образом спроектирована. Потом нагрузка начала расти, а мы начинали наступать на грабли. В докладе будет рассказано о наиболее типичных "граблях", что возможно позволит избежать их другими разработчиками при проектировании приложения.
О чем пойдет речь (кратко):
* балансировка нагрузки;
* кеширование данных и прогрев кешей;
* работа с сетью;
* сессии;
* файлы, загружаемые пользователями;
* работа с СУБД.
Мы пишем на PHP, используем фреймворк OnPHP, СУБД Postgres.
Биография
Родился в несуществующем городе несуществующей страны. Первый мобильный телефон увидел в 1997 году. С детства любил программировать, последние 4 года посвятил развитию рекламы в мобильном веб. Своими глазами видел эволюцию мобильных устройств и предпочтений рекламодателей.
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
Кто-то верно подметил, что разработчики статических анализатора часто сталкиваются с "проблемой айсберга". Им сложно объяснить разработчикам, почему сложно написать и развивать статические анализаторы кода. Дело в том, что сторонние наблюдатели видят только вершину всего процесса, так как им доступен для изучения только простой интерфейс, который предоставляют анализаторы для взаимодействия с миром. Это ведь не графический редактор с сотнями кнопок и рычажков. В результате и возникает ощущение, что раз прост интерфейс взаимодействия, то и прост продукт. На самом деле статические анализаторы кода — это сложные программы, в которых живут и взаимодействуют разнообразнейшие методы поиска дефектов. В них реализуется множество экспертные системы, выдающие заключения о коде на основе как точных, так и эмпирических алгоритмах. В парном докладе, основатели анализатора PVS-Studio расскажут о том, как незаметно потратить 10 лет, чтобы написать хороший анализатор. Дьявол кроется в деталях!
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Ontico
Unity3D - это внушительный набор средств для кроссплатформенной разработки игр и 3D-приложений. Однако ряд его особенностей может привести к внезапному падению производительности продукта на мобильных платформах.
Где же прячутся подводные камни? Как обеспечить оптимальный user experience на старом смартфоне? Каких "граблей" стоит избегать при написании кода и подготовке графики? Рассмотрим на примере RPG "Гильдия Героев" для Android и iOS.
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...Ontico
HighLoad++ 2017
Зал «Сингапур», 8 ноября, 12:00
Тезисы:
http://www.highload.ru/2017/abstracts/3035.html
- "Горячий" резерв, что это и зачем это нужно? Всем ли нужен?
- Почему Московская Биржа решила это реализовывать.
- Классические архитектуры построения горячего резерва, обзор наработок.
- Почему потребовалось разрабатывать свой алгоритм. (Биржа должна быть максимально доступна, даже если алгоритм думает, что лучше, вообще, все прекратить на сегодня...).
...
Вместе с Алексеем Ашурком мы расскажем о том, как проект «Фламп» релизится по 2n раз в неделю и комфортно себя при этом чувствует:
— Ветки - это хорошо или о переходе с SVN на Git.
— Чем плоха «классическая» модель релизов.
— Что такое модель пофичных релизов, в чём её плюсы и минусы.
— Почему она подходит для веб-сервисов.
— Как идти в ногу со временем или частые деплои.
— Как ловить ошибки и минимизировать их число.
Видео доклада: http://devday.2gis.ru/report/15
Презентация к докладу «Практические приёмы оптимизации .NET-приложений» с конференции dotnetconf (Челябинск, 19 апреля 2015) http://dotnetconf.ru/materialy/optimization
Deployment to production with an unexpected loadGrid Dynamics
In his talk, Max Mazur a DevOps Engineer at Grid Dynamics, shares his experience deploying to production despite unexpected loads using the example of the web application (RTB). There you can find specific cases of using MySQL and resolving solutions. Technology stack: Linux, MySQL, PHP, Nginx, Kafka, Redis, Gearman
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...IT-Portfolio
13 октября, DEV {web} - конференция о Highload веб-разработке. «Грабли при масштабировании веб-приложения, на которые очень легко наступить», Евгений Коковихин (системный архитектор WapStart)
Аннотация
Что происходит при росте приложения с 1М до 50М хитов в сутки. С какими проблемами можно столкнуться, когда серверов становится больше одного. О чем важно помнить при проектировании приложения, способного масштабироваться.
Подробно
Когда мы сделали первую публичную версию plus1.wapstart.ru, она помещалась на один сервер и была соответствующим образом спроектирована. Потом нагрузка начала расти, а мы начинали наступать на грабли. В докладе будет рассказано о наиболее типичных "граблях", что возможно позволит избежать их другими разработчиками при проектировании приложения.
О чем пойдет речь (кратко):
* балансировка нагрузки;
* кеширование данных и прогрев кешей;
* работа с сетью;
* сессии;
* файлы, загружаемые пользователями;
* работа с СУБД.
Мы пишем на PHP, используем фреймворк OnPHP, СУБД Postgres.
Биография
Родился в несуществующем городе несуществующей страны. Первый мобильный телефон увидел в 1997 году. С детства любил программировать, последние 4 года посвятил развитию рекламы в мобильном веб. Своими глазами видел эволюцию мобильных устройств и предпочтений рекламодателей.
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
Кто-то верно подметил, что разработчики статических анализатора часто сталкиваются с "проблемой айсберга". Им сложно объяснить разработчикам, почему сложно написать и развивать статические анализаторы кода. Дело в том, что сторонние наблюдатели видят только вершину всего процесса, так как им доступен для изучения только простой интерфейс, который предоставляют анализаторы для взаимодействия с миром. Это ведь не графический редактор с сотнями кнопок и рычажков. В результате и возникает ощущение, что раз прост интерфейс взаимодействия, то и прост продукт. На самом деле статические анализаторы кода — это сложные программы, в которых живут и взаимодействуют разнообразнейшие методы поиска дефектов. В них реализуется множество экспертные системы, выдающие заключения о коде на основе как точных, так и эмпирических алгоритмах. В парном докладе, основатели анализатора PVS-Studio расскажут о том, как незаметно потратить 10 лет, чтобы написать хороший анализатор. Дьявол кроется в деталях!
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Ontico
Unity3D - это внушительный набор средств для кроссплатформенной разработки игр и 3D-приложений. Однако ряд его особенностей может привести к внезапному падению производительности продукта на мобильных платформах.
Где же прячутся подводные камни? Как обеспечить оптимальный user experience на старом смартфоне? Каких "граблей" стоит избегать при написании кода и подготовке графики? Рассмотрим на примере RPG "Гильдия Героев" для Android и iOS.
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...Ontico
HighLoad++ 2017
Зал «Сингапур», 8 ноября, 12:00
Тезисы:
http://www.highload.ru/2017/abstracts/3035.html
- "Горячий" резерв, что это и зачем это нужно? Всем ли нужен?
- Почему Московская Биржа решила это реализовывать.
- Классические архитектуры построения горячего резерва, обзор наработок.
- Почему потребовалось разрабатывать свой алгоритм. (Биржа должна быть максимально доступна, даже если алгоритм думает, что лучше, вообще, все прекратить на сегодня...).
...
Вместе с Алексеем Ашурком мы расскажем о том, как проект «Фламп» релизится по 2n раз в неделю и комфортно себя при этом чувствует:
— Ветки - это хорошо или о переходе с SVN на Git.
— Чем плоха «классическая» модель релизов.
— Что такое модель пофичных релизов, в чём её плюсы и минусы.
— Почему она подходит для веб-сервисов.
— Как идти в ногу со временем или частые деплои.
— Как ловить ошибки и минимизировать их число.
Видео доклада: http://devday.2gis.ru/report/15
Презентация к докладу «Практические приёмы оптимизации .NET-приложений» с конференции dotnetconf (Челябинск, 19 апреля 2015) http://dotnetconf.ru/materialy/optimization
Deployment to production with an unexpected loadGrid Dynamics
In his talk, Max Mazur a DevOps Engineer at Grid Dynamics, shares his experience deploying to production despite unexpected loads using the example of the web application (RTB). There you can find specific cases of using MySQL and resolving solutions. Technology stack: Linux, MySQL, PHP, Nginx, Kafka, Redis, Gearman
3. Кто я такой?
• Студент факультета кибернетики КНУ им.
Шевченка.
2
4. Кто я такой?
• Студент факультета кибернетики КНУ им.
Шевченка.
• Пишу на C++, Java/Scala/Kotlin(JVM) и JS(V8).
2
5. Кто я такой?
• Студент факультета кибернетики КНУ им.
Шевченка.
• Пишу на C++, Java/Scala/Kotlin(JVM) и JS(V8).
• Люблю копаться в движках и писать фронтенд.
2
6. Кто я такой?
• Студент факультета кибернетики КНУ им.
Шевченка.
• Пишу на C++, Java/Scala/Kotlin(JVM) и JS(V8).
• Люблю копаться в движках и писать фронтенд.
• Компиляторов, если что.
2
16. Модель памяти в JS (V8)
6
• Отдельно представлены целые числа на
стеке
17. Модель памяти в JS (V8)
6
• Все остальные объекты, аллоцирующиеся в
хипе, неявно наследуются от HeapObject.
• Все объекты выровнены на 4 байта.
• Отдельно представлены целые числа на
стеке
19. Как устроен Heap
• New Space (aka YoungGen): Большинство
объектов живут именно здесь. Умирают тоже.
7
20. Как устроен Heap
• New Space (aka YoungGen): Большинство
объектов живут именно здесь. Умирают тоже.
• Old Space (aka OldGen) : Объекты, пережившие
одну и больше фаз сборки.
7
21. Как устроен Heap
• New Space (aka YoungGen): Большинство
объектов живут именно здесь. Умирают тоже.
• Old Space (aka OldGen) : Объекты, пережившие
одну и больше фаз сборки.
• Code Space: Здесь размещаются объекты кода,
содержащие инструкции JIT-компилятора. Это
единственное пространство с исполняемой
памятью.
7
27. Внезапная польза
• Подобная гипотеза, подтвержденная частыми
наблюдениями (не только в V8), позволяет
разработчикам виртуальных машин делать
некоторые спекулятивные операции.
10
28. Внезапная польза
• Подобная гипотеза, подтвержденная частыми
наблюдениями (не только в V8), позволяет
разработчикам виртуальных машин делать
некоторые спекулятивные операции.
• А именно - разделять сборки в регионах хипа, и
разрабатывать разные алгоритмы для них.
10
30. Подходы к сборке
• Stop-the-world (город main-thread приложения
засыпает, GC работает, после окончания
приложение опять просыпается).
11
31. Подходы к сборке
• Stop-the-world (город main-thread приложения
засыпает, GC работает, после окончания
приложение опять просыпается).
• Concurrent (сборщик (частями) работает
параллельно с приложением).
11
32. Подходы к сборке
• Stop-the-world (город main-thread приложения
засыпает, GC работает, после окончания
приложение опять просыпается).
• Concurrent (сборщик (частями) работает
параллельно с приложением).
• Важно : конкурентными могут быть несколько
из фаз сборки!
11
35. Стратегии сборки
Всего существует аж 3 стратегии сборки мусора :
• No operations: считаем все объекты мусором, и
творим тотальный экстерминатус всем обитателям
хипа, вырубая работающую VM.
12
36. Стратегии сборки
Всего существует аж 3 стратегии сборки мусора :
• No operations: считаем все объекты мусором, и
творим тотальный экстерминатус всем обитателям
хипа, вырубая работающую VM.
• Mark-Sweep/Compact: помечаем все живые объекты,
удаляем недостижимые (и делаем перемещение
живых регионов).
12
37. Стратегии сборки
Всего существует аж 3 стратегии сборки мусора :
• No operations: считаем все объекты мусором, и
творим тотальный экстерминатус всем обитателям
хипа, вырубая работающую VM.
• Mark-Sweep/Compact: помечаем все живые объекты,
удаляем недостижимые (и делаем перемещение
живых регионов).
• Pointer counting: присобачиваем к каждому объекту
счетчик ссылок на него и удаляем его, когда счетчик
равен нулю.
12
40. Немного недоумения
• Вообще-то, настоящим, на мой вкус, сборщиком
мусора, является подход с подсчетом ссылок.
• В Mark-* мы помечаем и перемещаем
достижимые объекты, а не мусор!
13
43. Сборка в YoungGen
• Два субрегиона : «From Space» и «To Space»
• «From Space» изначально пустой.
14
44. Сборка в YoungGen
• Два субрегиона : «From Space» и «To Space»
• «From Space» изначально пустой.
• К GC прилетел сигнал, что в «To Space»
переполнение.
14
45. Сборка в YoungGen
• Два субрегиона : «From Space» и «To Space»
• «From Space» изначально пустой.
• К GC прилетел сигнал, что в «To Space»
переполнение.
• Также существует специальный Pointer Map на
все объекты из Young Generation.
14
52. Scavenger, Part 2
3. Проходимся линейно по
From Space, помечаем
живые объекты.
16
53. Scavenger, Part 2
3. Проходимся линейно по
From Space, помечаем
живые объекты.
4. Перемещаем живые
объекты в To Space,
удаляем лишнее из From
Space.
16
54. Scavenger, Part 2
3. Проходимся линейно по
From Space, помечаем
живые объекты.
4. Перемещаем живые
объекты в To Space,
удаляем лишнее из From
Space.
5. To Space отдает эти
данные в OldGen.
16
57. Сборка в OldGen
Сборка в OldGen является классическим
алгоритмом Mark-Compact:
1. Сначала, начиная из rootset, проходимся по
всему графу объектов и помечаем
достижимые. (Mark*)
17
58. Сборка в OldGen
Сборка в OldGen является классическим
алгоритмом Mark-Compact:
1. Сначала, начиная из rootset, проходимся по
всему графу объектов и помечаем
достижимые. (Mark*)
2. Чистим хип. (Sweep)
17
59. Сборка в OldGen
Сборка в OldGen является классическим
алгоритмом Mark-Compact:
1. Сначала, начиная из rootset, проходимся по
всему графу объектов и помечаем
достижимые. (Mark*)
2. Чистим хип. (Sweep)
3. Сжимаем хип. (Compact)
17
61. Стадия : Mark
Алгоритм маркировки представляет собой (главным образом)
обход графа в глубину с использованием стека и трехцветной
абстракцией :
18
62. Стадия : Mark
Алгоритм маркировки представляет собой (главным образом)
обход графа в глубину с использованием стека и трехцветной
абстракцией :
• Черные - вершины с посещенными и просканированными
ссылками.
18
63. Стадия : Mark
Алгоритм маркировки представляет собой (главным образом)
обход графа в глубину с использованием стека и трехцветной
абстракцией :
• Черные - вершины с посещенными и просканированными
ссылками.
• Серые - посещенные вершины с непросмотренными ссылками.
18
64. Стадия : Mark
Алгоритм маркировки представляет собой (главным образом)
обход графа в глубину с использованием стека и трехцветной
абстракцией :
• Черные - вершины с посещенными и просканированными
ссылками.
• Серые - посещенные вершины с непросмотренными ссылками.
• Белые - непосещенные вершины.
18
65. Стадия : Mark
Алгоритм маркировки представляет собой (главным образом)
обход графа в глубину с использованием стека и трехцветной
абстракцией :
• Черные - вершины с посещенными и просканированными
ссылками.
• Серые - посещенные вершины с непросмотренными ссылками.
• Белые - непосещенные вершины.
Используется стек указателей, а не рекурсия. (Привет,
StackOverflow), и им является From Space из YoungGen.
18
80. Incremental Mark
31
• Начинается, когда куча становится больше
некоего порогового значения, а не заполняется.
• Пауз становится больше, но они становятся
короче.
81. Incremental Mark
31
• Начинается, когда куча становится больше
некоего порогового значения, а не заполняется.
• Пауз становится больше, но они становятся
короче.
• За паузу сканируется часть хипа.
82. Incremental Mark
31
• Начинается, когда куча становится больше
некоего порогового значения, а не заполняется.
• Пауз становится больше, но они становятся
короче.
• За паузу сканируется часть хипа.
• Но взамен на эту всю красоту появляются
проблемы с консистентностью графа объектов.
83. 32
Incremental Mark : трабла раз
Аллоцирование нового объекта в черном
объекте / указание ссылки на «мусорный»
объект.
88. 35
Write Barriers
• Существует специальный буфер, в который
помещаются перехваченные записи в хип.
• Удаления при этом обрабатываются.
То есть, удаленные ссылки не считаются
удаленными до конца текущей раскраски
объектов. После они спокойно удаляются.
96. Стадия : Sweep
• Sweep чрезвычайно прост: он просто
выполняет линейный поиск мёртвых
объекты в каждой странице хипа, очищает
память, и передает ее в специальный
список свободной памяти.
42
98. Стадия : Sweep
• В каждой странице хранятся отдельные списки
свободной памяти для небольших регионов
(< 2^8 слов), средние регионы (< 2^11 слов),
большие регионы (< 2^14 слова) и огромные
регионы.
43
99. Стадия : Sweep
• В каждой странице хранятся отдельные списки
свободной памяти для небольших регионов
(< 2^8 слов), средние регионы (< 2^11 слов),
большие регионы (< 2^14 слова) и огромные
регионы.
• Свободные списки в основном используются
алгоритмом Scavenge для перемещения выживших
объектов в OldGen, a также используются
алгоритмом уплотнения для перемещения объектов.
43
104. Parallel Sweep
• Так как хип размечен по регионам, выделить
N-ное количество потоков на уборку этих самых
регионов не составляет труда.
47
105. Parallel Sweep
• Так как хип размечен по регионам, выделить
N-ное количество потоков на уборку этих самых
регионов не составляет труда.
• Время паузы при этом заметно сокращается.
47
107. Стадия : Compact
• Самая сложная, на мой вкус, функция сборщика
мусора.
48
108. Стадия : Compact
• Самая сложная, на мой вкус, функция сборщика
мусора.
• Главная проблема здесь - обеспечить
дефрагментацию страниц.
48
109. Стадия : Compact
• Самая сложная, на мой вкус, функция сборщика
мусора.
• Главная проблема здесь - обеспечить
дефрагментацию страниц.
• Порождает N-нное количество головняка у
разработчиков GC.
48
111. Как справился Google?
• Google может выдохнуть, так как на самом
деле JS не является многопоточным, и большое
количество нюансов, которые надо
предусмотреть в многопоточной среде языка,
исчезают.
• Но перенос внутри VM все равно происходит в
критической секции.
113. Compact крупно
• Compact переносит объекты из фрагментированных
регионов (содержащих много небольших свободных
пространств) в свободные места на других регионах.
50
114. Compact крупно
• Compact переносит объекты из фрагментированных
регионов (содержащих много небольших свободных
пространств) в свободные места на других регионах.
• Для каждого живого объекта в эвакуируемом
регионе выделяется место из списка свободной
памяти другой страницы.
50
115. Compact крупно
• Compact переносит объекты из фрагментированных
регионов (содержащих много небольших свободных
пространств) в свободные места на других регионах.
• Для каждого живого объекта в эвакуируемом
регионе выделяется место из списка свободной
памяти другой страницы.
• Каждый объект копируется в выделенное место, а в
еще не удаленном объекте появляется так
называемый «forwarding pointer», указывающий на
настоящий объект.
50
130. Перенос объектов
59
Как только эвакуация завершена, V8 выполняет итерацию по
списку записанных мест указателя и обновляет их, указывая на
новые копии.
135. После уборки
• Все объекты снова маркируются как «белые».
• GC прибирается в кэшах и деоптимизрует
отмеченные для деоптимизиации объекты.
• Отпускает паузу.
62
137. Выводы
• Гуглу удалось создать коллектор, который балансирует
между средним временем паузы и оверхэдом на сборку.
При этом разработчики (большинство) довольны, так как
у них не возникает с ним проблем.
• Если уж приложение и тормозит, то вам стоит
покопаться в собственном коде и посмотреть на вкладку
«Performance», и проверить, а поэтому ли тормозит?
• Если да, то попросить приложение меньше мусорить.
63