Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Ruby Meditation
Talk of Julik Tarkhanov, senior backend engineer, WeTransfer, Amsterdam, at Ruby Meditation #28 Kyiv 26.10.2019
Next conference - http://www.rubymeditation.com/
It is often a choice, sometimes a whim, and sometimes an act of desperation. We idolise reuse while sometimes the road not taken is just as exciting. Let's chat about where it is appropriate to "do the thing again", take the scenic route and enjoy the view.
Announcements and conference materials https://www.fb.me/RubyMeditation
News https://twitter.com/RubyMeditation
Photos https://www.instagram.com/RubyMeditation
The stream of Ruby conferences (not just ours) https://t.me/RubyMeditation
* The channel of the organizers of the meetup https://t.me/incredevly
Проект «Одноклассники» Mail.Ru Group, Андрей ПаньгинEYevseyeva
Презентация с технической секции #BitByte - фестиваля профессионального развития, который прошел 19 мая в Санкт-Петербурге.
Андрей Паньгин, Ведущий инженер проекта компании Mail.Ru Group «Одноклассники»: «Незаурядная Java как инструмент разработки высоконагруженного сервера».
Cоциальный граф "Одноклассников" в myTargetOleg Tsarev
Задача выглядит обманчиво простой — рядом с баннером игры из Одноклассников показывать текстовый тизер «эту игру играет Кот Матроскин и ещё 5 твоих друзей» (имя и количество берутся из друзей пользователя на Одноклассниках).
Как обрабатывать граф друзей проекта Одноклассники для этой задачи?
На этот простой вопрос дают разные ответы:
- взять графовую базу данных
- использовать матрицу инцидентности
- использовать список смежных вершин.
Если уточнить, что сырые данные занимают полтора терабайта, в графе 200 миллионов вершин и 13 миллиардов связей, то ручные решения сразу отметаются.
«Графовая база данных!» Стоит озвучить нагрузку в десятки тысяч запросов секунду и требования отвечать за миллисекунды (тысячные доли секунды!) как графовые базы сразу оказываются за бортом — типичное время ответа на простые запросы — единицы секунд.
Экс-разработчик MySQL и SciDB, ныне ведущий разработчик myTarget Олег Царёв расскажет, как решалась эта непростая задача в рамках проекта.
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Ruby Meditation
Talk of Julik Tarkhanov, senior backend engineer, WeTransfer, Amsterdam, at Ruby Meditation #28 Kyiv 26.10.2019
Next conference - http://www.rubymeditation.com/
It is often a choice, sometimes a whim, and sometimes an act of desperation. We idolise reuse while sometimes the road not taken is just as exciting. Let's chat about where it is appropriate to "do the thing again", take the scenic route and enjoy the view.
Announcements and conference materials https://www.fb.me/RubyMeditation
News https://twitter.com/RubyMeditation
Photos https://www.instagram.com/RubyMeditation
The stream of Ruby conferences (not just ours) https://t.me/RubyMeditation
* The channel of the organizers of the meetup https://t.me/incredevly
Проект «Одноклассники» Mail.Ru Group, Андрей ПаньгинEYevseyeva
Презентация с технической секции #BitByte - фестиваля профессионального развития, который прошел 19 мая в Санкт-Петербурге.
Андрей Паньгин, Ведущий инженер проекта компании Mail.Ru Group «Одноклассники»: «Незаурядная Java как инструмент разработки высоконагруженного сервера».
Cоциальный граф "Одноклассников" в myTargetOleg Tsarev
Задача выглядит обманчиво простой — рядом с баннером игры из Одноклассников показывать текстовый тизер «эту игру играет Кот Матроскин и ещё 5 твоих друзей» (имя и количество берутся из друзей пользователя на Одноклассниках).
Как обрабатывать граф друзей проекта Одноклассники для этой задачи?
На этот простой вопрос дают разные ответы:
- взять графовую базу данных
- использовать матрицу инцидентности
- использовать список смежных вершин.
Если уточнить, что сырые данные занимают полтора терабайта, в графе 200 миллионов вершин и 13 миллиардов связей, то ручные решения сразу отметаются.
«Графовая база данных!» Стоит озвучить нагрузку в десятки тысяч запросов секунду и требования отвечать за миллисекунды (тысячные доли секунды!) как графовые базы сразу оказываются за бортом — типичное время ответа на простые запросы — единицы секунд.
Экс-разработчик MySQL и SciDB, ныне ведущий разработчик myTarget Олег Царёв расскажет, как решалась эта непростая задача в рамках проекта.
Семинар по Node.js в КПИ 20 октября 2014. Докладчики: Тимур Шемсединов, Никита Савченко, Максим Петренко. Краткое содержание:
* Что такое Node.js и как работает JavaScript в V8
* Профессионалы расскажут, почему они выбрали Node.js
* Вы узнаете его сильные и слабые стороны и где его лучше применять
* Будет полный обзор особеностей и внутреннего строения Node.js
* Примеры внедрения и Highload-проекты
* Вопросы развертывания, хостинг, тестирования, и отладки
* Где и что учить, что читать, как осваивать
Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...Ontico
Rspamd — это система фильтрации спама с открытым кодом, выполняющая оценку e-mail сообщений по множеству критериев, который возник как попытка адаптировать фильтрацию спама к современным реалиям и постоянно растущему потоку электронных писем, нуждающихся в обработке.
Тезисы - http://www.highload.ru/2015/abstracts/1892.html
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Ontico
Общие принципы оптимизации производительности мобильных приложений:
- работа с длинными списками — таблицы, коллекции;
- графика — загрузка из сети, кэширование;
- ленивая загрузка частей приложения.
Работа с периодически обновляемыми структурированными данными.
- как передавать данные с сервера на клиент: запросы, объем, формат, десериализация;
- как хранить полученные данные на клиенте — виды хранилищ: от плоских файлов до NoSQL.
Практический кейс. "Едадил": как мы ускоряли работу приложения для Android.
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Ontico
Unity3D - это внушительный набор средств для кроссплатформенной разработки игр и 3D-приложений. Однако ряд его особенностей может привести к внезапному падению производительности продукта на мобильных платформах.
Где же прячутся подводные камни? Как обеспечить оптимальный user experience на старом смартфоне? Каких "граблей" стоит избегать при написании кода и подготовке графики? Рассмотрим на примере RPG "Гильдия Героев" для Android и iOS.
Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...Ontico
Так как я работаю в позиции SRE (site reliability engineer), то более подробно затрону вопросы того, как мы добились годового durability 99.9999999999% и доступности более 99.99%:
- Изоляция
-- Физическая
--- Хранение данных в разных стойках, датацентрах, с разными версиями оборудования и вендорами.
--- Бэкапы вне основной инфраструктуры.
-- Логическая
--- Слабая связанность компонентов.
--- Не давать падению одного мастера (в зукипере или базе) утащить за собой всю зону.
-- Операционная
--- Процесс релиза.
--- Инструменты деплоя, сборки, хелзчекинга и т.д.
--- Контроль доступа.
- Защита данных
-- Восстановление
--- Восстановление после опасных операций (удаление).
-- Охрана данных и валидация операций
----в том числе от операторов.
- Контроль
-- Все совершают ошибки, нужно уметь детектировать их.
-- Метрики, SRE, OnCall.
-- Различные системы детектирование проблем, не связанные между собой, на каждом уровне систем (хост, кластер, ячейка, дата центр, внешние).
-- Тестирование
--- Disaster recovery testing.
- Автоматизация
-- Быстрое восстановление.
-- Быстрая реакция на события (нет времени реагировать вручную).
-- (introduce autoremedeation systems).
Семинар по Node.js в КПИ 20 октября 2014. Докладчики: Тимур Шемсединов, Никита Савченко, Максим Петренко. Краткое содержание:
* Что такое Node.js и как работает JavaScript в V8
* Профессионалы расскажут, почему они выбрали Node.js
* Вы узнаете его сильные и слабые стороны и где его лучше применять
* Будет полный обзор особеностей и внутреннего строения Node.js
* Примеры внедрения и Highload-проекты
* Вопросы развертывания, хостинг, тестирования, и отладки
* Где и что учить, что читать, как осваивать
Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...Ontico
Rspamd — это система фильтрации спама с открытым кодом, выполняющая оценку e-mail сообщений по множеству критериев, который возник как попытка адаптировать фильтрацию спама к современным реалиям и постоянно растущему потоку электронных писем, нуждающихся в обработке.
Тезисы - http://www.highload.ru/2015/abstracts/1892.html
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Ontico
Общие принципы оптимизации производительности мобильных приложений:
- работа с длинными списками — таблицы, коллекции;
- графика — загрузка из сети, кэширование;
- ленивая загрузка частей приложения.
Работа с периодически обновляемыми структурированными данными.
- как передавать данные с сервера на клиент: запросы, объем, формат, десериализация;
- как хранить полученные данные на клиенте — виды хранилищ: от плоских файлов до NoSQL.
Практический кейс. "Едадил": как мы ускоряли работу приложения для Android.
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Ontico
Unity3D - это внушительный набор средств для кроссплатформенной разработки игр и 3D-приложений. Однако ряд его особенностей может привести к внезапному падению производительности продукта на мобильных платформах.
Где же прячутся подводные камни? Как обеспечить оптимальный user experience на старом смартфоне? Каких "граблей" стоит избегать при написании кода и подготовке графики? Рассмотрим на примере RPG "Гильдия Героев" для Android и iOS.
Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...Ontico
Так как я работаю в позиции SRE (site reliability engineer), то более подробно затрону вопросы того, как мы добились годового durability 99.9999999999% и доступности более 99.99%:
- Изоляция
-- Физическая
--- Хранение данных в разных стойках, датацентрах, с разными версиями оборудования и вендорами.
--- Бэкапы вне основной инфраструктуры.
-- Логическая
--- Слабая связанность компонентов.
--- Не давать падению одного мастера (в зукипере или базе) утащить за собой всю зону.
-- Операционная
--- Процесс релиза.
--- Инструменты деплоя, сборки, хелзчекинга и т.д.
--- Контроль доступа.
- Защита данных
-- Восстановление
--- Восстановление после опасных операций (удаление).
-- Охрана данных и валидация операций
----в том числе от операторов.
- Контроль
-- Все совершают ошибки, нужно уметь детектировать их.
-- Метрики, SRE, OnCall.
-- Различные системы детектирование проблем, не связанные между собой, на каждом уровне систем (хост, кластер, ячейка, дата центр, внешние).
-- Тестирование
--- Disaster recovery testing.
- Автоматизация
-- Быстрое восстановление.
-- Быстрая реакция на события (нет времени реагировать вручную).
-- (introduce autoremedeation systems).
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подходCodeFest
Code coverage metrics provide a measure of how much source code is covered during testing. While achieving high code coverage percentages, like 100%, may require significant testing effort, the primary goal of code coverage should be effectiveness over completeness. Code coverage should be used to guide test improvement and identify areas for additional testing, not as an absolute target. Automated test generation has limitations and cannot replace manual functional testing.
CodeFest 2014. Осипов К. — NoSQL: вангуем вместеCodeFest
This document discusses NoSQL databases and alternatives to relational databases. It covers three key aspects: data models, data consistency, and data storage. For data models, it describes popular NoSQL models like key-value, document, and column stores and compares them to the relational and graph models. For consistency, it discusses CAP theorem and tradeoffs between consistency, availability and performance. It provides examples to illustrate how different databases approach consistency. For storage, it covers technologies like B-trees, LSM trees, and consistent hashing. The document recommends keeping an eye on specific databases and technologies and suggests some existing databases that can be used.
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.
Про некоторые кейсы использования elasticsearch в современных проектах.
- С какими сложностями столкнулись
- Где успешо применили elasticsearch, а где был избыточен
Презентация с мероприятия https://habr.com/ru/company/odnoklassniki/blog/452978/
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)Pavel Tsukanov
Расскажу зачем они вообще нужны. Пройдемся по технологиям и промоем им косточки. Рассмотрим достоинства и недостатки, а также где и когда лучше всего применять ту или иную ORM.
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...Ontico
РИТ++ 2017, HighLoad Junior
Зал Сингапур, 5 июня, 11:00
Тезисы:
http://junior.highload.ru/2017/abstracts/2683.html
Наш доклад описывает способ использования больших объемов памяти, которые стали доступны в последние годы. К сожалению, эта память обычно остается незадействованной в управляемых средах исполнения в связи с принудительной сборкой мусора. Разработчики прибегают к внешним хранилищам данных ( i.e Memcached), что несет дополнительные расходы.
...
SETCON'18 - Vitali Fokin - Kubernetes 101Nadzeya Pus
Обзор возможностей Kubernetes, зачем он нужен, кому и когда, а также немного хороших практик по развертыванию и разработке Kubernetes-powered приложений.
The document discusses Uber's APIs and how they can be used to build experiences that enhance transportation. It notes that Uber has facilitated over 2 billion trips across more than 470 cities. Developers can integrate their apps with Uber's APIs to authenticate users, request rides, access ride details and context through the trip to improve users' experiences. The document provides examples of how ride context could be used to suggest local guides, play media based on trip duration, and control smart home devices like heating when approaching home.
This document discusses building and shipping software using GitHub. It provides key facts about GitHub such as being founded in 2008, having over 15 million registered users and 36 million repositories. It also shares principles from "The Zen of GitHub" including that responsive is better than fast, practicality beats purity, and favor focus over features. The document advocates for empowering businesses to build great software through culture, tools, process and a DevOps approach.
This document introduces .NET Core and its advantages over the .NET Framework. It discusses how .NET Core is cross-platform, uses the .NET Standard library, and can create self-contained applications. It also highlights how .NET Core applications are smaller, faster, and container-friendly. The document demonstrates how to use the dotnet CLI and publish .NET Core applications to reduce their deployment size. Overall, it promotes adopting .NET Core for its performance, portability, and familiar .NET APIs.
René Gröschke gave a talk on the latest features and future direction of Gradle. Some of the key points included:
- Gradle is moving to a Kotlin-based DSL for improved performance, tooling support, and bringing application patterns to builds.
- Performance improvements include a dedicated performance team that has improved Android Gradle Plugin build times significantly.
- Composite builds allow including external projects to debug dependencies or test plugins against real projects.
- Build cache and distributed build cache are incubating features to cache and share build results for faster rebuilds.
- Gradle build scans provide insights into builds to debug issues, optimize performance, and compare builds
The document discusses containerizing ASP.NET Core applications with Kubernetes. It begins with an overview of .NET Core and containers, and how they have converged. It then discusses Kubernetes and how it can help manage containers at scale. It covers Kubernetes building blocks like deployments, pods, labels, services, and replica sets. It provides examples of deploying containers with Kubernetes, including demonstrations of creating deployments, services, scaling applications, and rolling updates.
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-приложениях
1. Управление памятью в Java:
footprint
Владимир Иванов
Oracle Corp.
vladimir.x.ivanov@oracle.com
1
2. Содержание
• Введение
• Структура «кучи» в Java
• «Сжатые» указатели
• Представление объекта в памяти
• Типы ссылок
• Разное
• Итоги
2
3. Введение
О чем пойдет речь?
• Производительность GC
• 3 характеристики
• Throughput
• Объем вычислительных ресурсов, затрачиваемых на GC
• Предсказуемость
• На какое время прерывается работа приложения
• Footprint
• Объем используемой памяти
3
4. Содержание
• Введение
• Структура «кучи» в Java
• «Сжатые» указатели
• Представление объекта в памяти
• Типы ссылок
• Разное
• Итоги
4
6. Критерии выбора размера «кучи»
• Чем больше памяти, тем лучше для GC
• Как для молодого, так и для старшего поколения
• Более редкие сборки
• Ниже затраты на сборку мусора
• Доступный объем памяти ограничен
• Физическая память
• 32-битный режим
• Наличие других приложений в системе
6
7. Содержание
• Введение
• Структура «кучи» в Java
• «Сжатые» указатели
• Представление объекта в памяти
• Типы ссылок
• Разное
• Итоги
7
8. «Сжатые» указатели
-XX:+UseCompressedOops
• 32-битные указатели в 64-битном режиме
• oop - Ordinary Object Pointer
Размер < 4Gb >= 4Gb >= 26Gb
«кучи» < 26Gb < 32Gb
Режим Zero-based Zero-based Offset-based
работы non-aligned 8-byte aligned 8-byte aligned
Декоди- не требуется x << 3 offset + x << 3
рование
8
9. «Сжатые» указатели
-XX:+UseCompressedOops
• Распаковка «сжатых» указателей дешева
– 64-bit JVM + zero-based COOPs быстрее 32-bit JVM
– 64-bit JVM + offset-based COOPs немного медленнее 64-bit
JVM + zero-based COOPs
• 1 регистр используется для хранения offset
• Работают для «кучи» размером не более 32Gb
• ~1.4x увеличение размера данных если выключены
• скачок: 32Gb -> 45Gb
9
10. Содержание
• Введение
• Структура «кучи» в Java
• «Сжатые» указатели
• Представление объекта в памяти
• Типы ссылок
• Разное
• Итоги
10
11. Представление объекта в памяти
• Заголовок (12/16/20 байт)
– mark word (4/8 байт)
– указатель на класс объекта (4/8 байт)
– длина (только для массива) (4 байта)
• Нестатические поля класса / элементы массива
– эффективное представление
– выбор оптимального порядка
– порядок полей
• long/double, int, short/char, byte/boolean, reference
• http://github.com/shipilev/java-object-layout
• -XX:+PrintCompactFieldsSavings
11
12. Представление объекта в памяти
• new int[1000] • new Integer[1000]
• 32-бита: 4+4+4+1000*4 = • 32-бита: 4+4+4+1000*(4+4+4+4) =
4012 байт 16012 байт
• 64-бита: 8+8+4+1000*4 = • 64-бита: 8+8+4+1000*(8+8+8+4) =
4020 байт 28020 байт
12
13. Содержание
• Введение
• Структура «кучи» в Java
• «Сжатые» указатели
• Представление объекта в памяти
• Типы ссылок
• Разное
• Итоги
13
14. Инженерная проблема
Кэширование данных
• Приложение оперирует объемами данных,
существенно превышающими доступную память
• Требуется организовать кэширование на уровне
приложения
14
15. Типы ссылок в Java
• Декларативный API к GC
• Контроль достижимости
• Представлены в виде объектов
• extends java.lang.ref.Reference
• 3 типа
• «мягкие»
• java.lang.ref.SoftReference
• «слабые»
• java.lang.ref.WeakReference
• «фантомные»
• java.lang.ref.PhantomReference
15
16. Типы ссылок в Java
Как использовать?
import java.lang.ref.*;
Object obj = new Object(); // strong reference
Reference softRef = new SoftReference(obj); // soft reference
Reference weakRef = new WeakReference(obj); // weak reference
// phantom reference
ReferenceQueue reqQueue = new ReferenceQueue(obj);
Reference phantomRef = new PhantomReference(obj, refQueue);
Object obj1 = softRef.get(); if (obj1 != null) { … }
16
18. Типы ссылок
SoftReference
• Удаление softly reachable объекта при нехватке
памяти в системе
• Гарантии
• Все «мягкие» ссылки к soft-достижимым объектам будут
очищены до того, как будет брошен OOME
• Применение
• memory-sensitive caches
• Можно контроллировать агрессивность очистки
• -XX:SoftRefLRUPolicyMSPerMB
18
19. Типы ссылок
WeakReference
• Наличие «слабой» ссылки не мешает GC удалить
объект
• Действия GC
• Атомарно очищает все «слабые» ссылки на объект
• Если надо, помещает объекты на финализацию
• Если надо, помещает «слабые» ссылки в очередь
• Использование
• canonicalizing mappings (interned strings)
19
20. Типы ссылок
PhantomReference
• Замена финализаторам
– protected void Object::finalize()
• Невозможно получить ссылку на объект
– PhantomReference.get() == null
• GC помещает «фантомные» ссылки в очередь
20
21. Типы ссылок
Чем плохи финализаторы?
• Замедление аллокации
– Требуется регистрация объектов с нетривиальными
финализаторами
• 2 цикла GC для удаления объекта
• Возможность «воскрешения» объекта
• Недетерминированный порядок исполнения
• Могут начать выполняться раньше чем кажется
• Многопоточность (даже в однопоточном приложении)
– Требуется синхронизация при доступе к структурам данных
21
22. Типы ссылок в Java
Оповещения об изменении достижимости объекта
• Помещение ссылки в очередь
• java.lang.ref.ReferenceQueue
• Получить оповещение, когда объект становится
• softy reachable
• weakly reachable
• phantom reachable
• Невозможно «воскресить» объект из очереди
– Reference.get() == null
22
23. Типы ссылок в Java
Автоматическая очиста ссылок
• «Мягкие» и «слабые» ссылки
• Автоматически очищаются GC перед добавлением в очередь
• Регистрация в очереди не обязательна
• «Фантомные» ссылки
• Обязаны быть зарегистрированы в очереди
• Объект остается phantom-достижим пока все достижимые
«фантомные» ссылки не очищены
23
24. Типы ссылок в Java
Резюме
• «Мягкие» ссылки
– очищаются при нехватке памяти в системе
– GC-friendly кэширование объектов
• «Cлабые» ссылки
– очищаются если на объект есть только «слабые» ссылки
– canonicalizing mappings (e.g. interned strings)
• «Фантомные» ссылки
– сообщение о «смерти» объекта
– освобождение ресурсов, ассоциированных с объектом
– надежнее финализаторов
24
25. Содержание
• Введение
• Структура «кучи» в Java
• «Сжатые» указатели
• Представление объекта в памяти
• Типы ссылок
• Разное
• Итоги
25
26. Разное…
Советы
• ThreadLocal + ThreadPool = ?
– «засоряют» пулы потоков
• Коллекции
– много пустых коллекций в приложении
– начальный размер может быть слишком велик
– выставлять желаемый размер явно при создании
• Массивы
– создавать перед использованием
– DirectByteBuffer vs byte[]
• используйте NIO для I/O вместо массивов
• не копирует данные
– пул <*>[]? фрагментация
26
27. Анализ содержимого «кучи» приложения
• Суммарный размер объектов по классам
$ jmap –histo[:live] <pid>
• Копия содержимого «кучи» (heap dump)
– Как получить
$ jmap –dump:live,format=b,file=<file> <pid>
$ java –XX:+HeapDumpOnOutOfMemoryError …
– Как анализировать heap dump?
• JHAT – Java Heap Analysis Tool
• $ jhat <file>
• http://localhost:7000
• поддерживает OQL (Object Query Language)
27
28. Содержание
• Введение
• Структура «кучи» в Java
• «Сжатые» указатели
• Представление объекта в памяти
• Типы ссылок
• Разное
• Итоги
28
29. Итоги
• Для комфортной работы GC требуется достаточно
свободного места в «куче»
• «Сжатые» указатели работают только до 32Gb
• Неоптимальное представление данных может
серьезно увеличить расход памяти
• За счет java.lang.ref.* API можно уменьшить расход
памяти приложением
29