Let's calculate an average of one column for each key, like the following query: SELECT key, avg(value) FROM table GROUP BY key. What can be more simple? But the question is: what is the most efficient way to do it? How to write code to achieve maximum performance on a variety of hardware?
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Ontico
Многие современные высоконагруженные системы построены с использованием очередей. Не является исключением и внутренний сервис обработки OAuth токенов, который создала наша команда. Исключением является то, что и в качестве основного хранилища, и в качестве всех очередей используется один и тот же продукт - Tarantool. Более того, мы поставили себе амбициозную цель по отказоустойчивости - полную доступность сервиса, когда уходят любые два из трёх датацентров, и успешно её достигли.
При решении мы столкнулись с массой интересных инженерных задач и в нашем докладе мы расскажем вам о том, какие технологии и подходы использовались. В частности, рассмотрим более детально такие вещи, как:
- создание deadline очереди и проблемы, с ней связанные;
- создание кольцевой очереди;
- интеграция между собой шардинга, Raft и очередей;
- как мы победили split brain ;)
PostgreSQL + PostGIS + TimescaleDB is a ready-to-use symbiosis from a reliable RDBMS, a powerful set of geographical objects and calculations, and work with time-series data. This bundle perfectly solves the problem of storing telemetry, while leaving the whole PostgreSQL ecosystem in your hands.
Структуры данных в разделяемой памяти,
про алгоритмы замещения страниц в буфере и блокировки, которые используются на разных уровнях взаимодействия.
А также средства мониторинга памяти, уже существующие и те, которые ещё только в процессе разработки.
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...Ontico
HighLoad++ 2017
Зал «Пекин + Шанхай», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2960.html
При изучении алгоритмов и структур данных я предлагаю студентам закрепить знания и попытаться сделать мир лучше, выполнив небольшие проекты по внедрению эффективных алгоритмов в свободное программное обеспечение. В этом докладе я расскажу несколько идей для таких проектов.
Мы рассмотрим существующие фрагменты исходного кода, поговорим о том, что в нём можно допилить, и обсудим, сколько баллов за это надо давать.
Реализацией идей могут заняться, разумеется, все желающие.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Alexey Lesovsky
Потоковая репликация, которая появилась в 2010 году, стала одной из прорывных фич постгреса и в настоящее время практически ни одна инсталляция не обходится без использования потоковой репликации. Она надежна, легка в настройке, нетребовательна к ресурсам. Однако при всех своих положительных качествах, при её эксплуатации могут возникать различные проблемы и неприятные ситуации. Для диагностики и решения проблем, связанных с потоковой репликацией, есть множество инструментов, как встроенных в PostgreSQL, так и сторонних.
В этом докладе я сделаю обзор доступных инструментов и расскажу, как с помощью этих средств диагностировать различные типы проблем и как устранять их. Рассматривая методы решения, мы также рассмотрим проблемы, которые возникают при эксплуатации потоковой репликации.
Доклад будет полезен DBA и системным администраторам.
SOA: строим свой service mesh / Иван Круглов (Booking.com)Ontico
HighLoad++ 2017
Зал «Дели + Калькутта», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/3006.html
Service mesh - это выделенный слой в инфраструктуре компании, который призван упростить взаимодействие между сервисами, а также сделать его надежным и безопасным. В юрисдикцию service mesh, по разным мнениям, входят: маршрутизация запросов, service discovery, балансировка, обработка ошибок, мониторинг, трейсинг, авторизация и аутентификация и др. вещи. Реализация тоже варьируется от размазывания функционала по всему стеку до концентрации большей части его в одной точке.
...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Ontico
Многие современные высоконагруженные системы построены с использованием очередей. Не является исключением и внутренний сервис обработки OAuth токенов, который создала наша команда. Исключением является то, что и в качестве основного хранилища, и в качестве всех очередей используется один и тот же продукт - Tarantool. Более того, мы поставили себе амбициозную цель по отказоустойчивости - полную доступность сервиса, когда уходят любые два из трёх датацентров, и успешно её достигли.
При решении мы столкнулись с массой интересных инженерных задач и в нашем докладе мы расскажем вам о том, какие технологии и подходы использовались. В частности, рассмотрим более детально такие вещи, как:
- создание deadline очереди и проблемы, с ней связанные;
- создание кольцевой очереди;
- интеграция между собой шардинга, Raft и очередей;
- как мы победили split brain ;)
PostgreSQL + PostGIS + TimescaleDB is a ready-to-use symbiosis from a reliable RDBMS, a powerful set of geographical objects and calculations, and work with time-series data. This bundle perfectly solves the problem of storing telemetry, while leaving the whole PostgreSQL ecosystem in your hands.
Структуры данных в разделяемой памяти,
про алгоритмы замещения страниц в буфере и блокировки, которые используются на разных уровнях взаимодействия.
А также средства мониторинга памяти, уже существующие и те, которые ещё только в процессе разработки.
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...Ontico
HighLoad++ 2017
Зал «Пекин + Шанхай», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2960.html
При изучении алгоритмов и структур данных я предлагаю студентам закрепить знания и попытаться сделать мир лучше, выполнив небольшие проекты по внедрению эффективных алгоритмов в свободное программное обеспечение. В этом докладе я расскажу несколько идей для таких проектов.
Мы рассмотрим существующие фрагменты исходного кода, поговорим о том, что в нём можно допилить, и обсудим, сколько баллов за это надо давать.
Реализацией идей могут заняться, разумеется, все желающие.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Alexey Lesovsky
Потоковая репликация, которая появилась в 2010 году, стала одной из прорывных фич постгреса и в настоящее время практически ни одна инсталляция не обходится без использования потоковой репликации. Она надежна, легка в настройке, нетребовательна к ресурсам. Однако при всех своих положительных качествах, при её эксплуатации могут возникать различные проблемы и неприятные ситуации. Для диагностики и решения проблем, связанных с потоковой репликацией, есть множество инструментов, как встроенных в PostgreSQL, так и сторонних.
В этом докладе я сделаю обзор доступных инструментов и расскажу, как с помощью этих средств диагностировать различные типы проблем и как устранять их. Рассматривая методы решения, мы также рассмотрим проблемы, которые возникают при эксплуатации потоковой репликации.
Доклад будет полезен DBA и системным администраторам.
SOA: строим свой service mesh / Иван Круглов (Booking.com)Ontico
HighLoad++ 2017
Зал «Дели + Калькутта», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/3006.html
Service mesh - это выделенный слой в инфраструктуре компании, который призван упростить взаимодействие между сервисами, а также сделать его надежным и безопасным. В юрисдикцию service mesh, по разным мнениям, входят: маршрутизация запросов, service discovery, балансировка, обработка ошибок, мониторинг, трейсинг, авторизация и аутентификация и др. вещи. Реализация тоже варьируется от размазывания функционала по всему стеку до концентрации большей части его в одной точке.
...
Asterisk: настраиваем цифровую АТС за одно занятиеSkillFactory
Инструктор онлайн-школы SkillFactory Александр Левичев о самом популярном open-source решении для IP-телефонии – Asterisk, а также о том, как правильно установить и провести базовую конфигурацию, даже если вы в первый раз сталкиваетесь с этим решением.
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Badoo Development
Каждый день на badoo.com пользователи просматривают порядка 100 миллионов профилей других юзеров. Мы храним счетчики и полную историю посещений за последние 90 дней, с некоторой агрегацией - это около 5 миллиардов ивентов. Система обрабатывающая этот поток данных создана давно и пережила несколько инкарнаций, становясь все ближе к базе данных.
В какой-то момент мы решили перестать изобретать велосипед, отказались от демонов на C+sqlite, не стали делать на mysql-ях, редисах и мемкешах, а взяли и запилили на Tarantool.
Рассказываем почему Tarantool, как шардим, реплицируем (все просто) и как плавно это дело внедрили на живой системе без downtime.
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»Tanya Denisyuk
"Мое выступление поможет ответить на следующие вопросы:
1. Что такое HTTP reverse proxy?
2. Настройка NGINX в режиме reverse proxy.
3. Стандартные способы выбора upstream server: Round Robin, Hash, Consistent Hash.
4. Не сдерживаем фантазию -- пишем свой алгоритм.
5. Примеры, когда создание собственного решения оправдано."
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupMail.ru Group
Денис рассказал о трех кейсах использования Tarantool в Mail.Ru Group - это система аутентификации пользователей, система нотификаций для мобильных приложений и система показа рекламы. Во всех трех кейсах Tarantool является краеугольным камнем распределенной серверной инфраструктуры, которая обслуживает суммарно порядка 100 миллионов пользователей в месяц.
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в TarantoolTimur Safin
Презентация для выступления на Владивостокском митапе https://moscowdjango.timepad.ru/event/1884275/
"Основной режим разработки приложений в Тарантуле — это написание скриптов и манипуляции данными на Lua (оставим пока за скобками режим SQL). Часто внедрению Тарантула в некую систему становится блокером использование Lua.
В экосистеме Lua мало тулинга, это касается как встроенного интерпретатора, так и JIT-транслятора LuaJIT.
Давайте оглядимся, как обстоят дела с тестированием, профилированием, статическим анализом и дебагом в Lua. И как это все может быть использовано при разработке сервисов, в архитектуре которых есть Tarantool."
CSSO – инструмент для минификации CSS, который недавно вернулся к активной разработке. Зачем?
Дело в том, что минификация CSS – задача сложная. Сейчас нет идеального минификатора, и чтобы эффективным был и делал все правильно. Ведь нужно учитывать не только особенности CSS, который постоянно меняется, но и уровень его поддержки браузерами, их баги, префиксы, хаки и т.д. Все это требует решения ряда непростых задач. Поговорим об этом, а так же принципах работы CSS-минификаторов, новых идеях и развитии CSSO.
Подробнее: http://www.slideshare.net/basisjs/csso-compress-css-english-version
My talk is about DSLs, their kinds and when it’s worth to be using them. I’ll also demonstrate different approaches to developing internal and external DSLs in Python and will try to give the comparative analysis of those.
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...Ontico
В процессе обновления высоконагруженных серверов раздачи видео (40Gbit/s с каждого сервера) со старого OpenSuSE 10.2 на новый CentOS 7 (время между релизами — 7 лет) мы столкнулись с рядом проблем — необъяснимый свопинг и запуски OOM killer, неравномерное распределение нагрузки по ядрам, обрывы соединений, скачки системной нагрузки на CPU.
В докладе будет рассказано о том, как мы боролись с этими проблемами и какие технологии для этого использовали.
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
Евгений Крутько, НИЦ «Курчатовский институт».
В докладе на примере программы моделирования динамики движения конструкций по методу конечных элементов рассматриваются возможности и практика распараллеливания вычислений. Речь в нём пойдёт как о технике создания новых вычислительных потоков, так и об использовании стандартов openMP и MPI.
Asterisk: настраиваем цифровую АТС за одно занятиеSkillFactory
Инструктор онлайн-школы SkillFactory Александр Левичев о самом популярном open-source решении для IP-телефонии – Asterisk, а также о том, как правильно установить и провести базовую конфигурацию, даже если вы в первый раз сталкиваетесь с этим решением.
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Badoo Development
Каждый день на badoo.com пользователи просматривают порядка 100 миллионов профилей других юзеров. Мы храним счетчики и полную историю посещений за последние 90 дней, с некоторой агрегацией - это около 5 миллиардов ивентов. Система обрабатывающая этот поток данных создана давно и пережила несколько инкарнаций, становясь все ближе к базе данных.
В какой-то момент мы решили перестать изобретать велосипед, отказались от демонов на C+sqlite, не стали делать на mysql-ях, редисах и мемкешах, а взяли и запилили на Tarantool.
Рассказываем почему Tarantool, как шардим, реплицируем (все просто) и как плавно это дело внедрили на живой системе без downtime.
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»Tanya Denisyuk
"Мое выступление поможет ответить на следующие вопросы:
1. Что такое HTTP reverse proxy?
2. Настройка NGINX в режиме reverse proxy.
3. Стандартные способы выбора upstream server: Round Robin, Hash, Consistent Hash.
4. Не сдерживаем фантазию -- пишем свой алгоритм.
5. Примеры, когда создание собственного решения оправдано."
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupMail.ru Group
Денис рассказал о трех кейсах использования Tarantool в Mail.Ru Group - это система аутентификации пользователей, система нотификаций для мобильных приложений и система показа рекламы. Во всех трех кейсах Tarantool является краеугольным камнем распределенной серверной инфраструктуры, которая обслуживает суммарно порядка 100 миллионов пользователей в месяц.
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в TarantoolTimur Safin
Презентация для выступления на Владивостокском митапе https://moscowdjango.timepad.ru/event/1884275/
"Основной режим разработки приложений в Тарантуле — это написание скриптов и манипуляции данными на Lua (оставим пока за скобками режим SQL). Часто внедрению Тарантула в некую систему становится блокером использование Lua.
В экосистеме Lua мало тулинга, это касается как встроенного интерпретатора, так и JIT-транслятора LuaJIT.
Давайте оглядимся, как обстоят дела с тестированием, профилированием, статическим анализом и дебагом в Lua. И как это все может быть использовано при разработке сервисов, в архитектуре которых есть Tarantool."
CSSO – инструмент для минификации CSS, который недавно вернулся к активной разработке. Зачем?
Дело в том, что минификация CSS – задача сложная. Сейчас нет идеального минификатора, и чтобы эффективным был и делал все правильно. Ведь нужно учитывать не только особенности CSS, который постоянно меняется, но и уровень его поддержки браузерами, их баги, префиксы, хаки и т.д. Все это требует решения ряда непростых задач. Поговорим об этом, а так же принципах работы CSS-минификаторов, новых идеях и развитии CSSO.
Подробнее: http://www.slideshare.net/basisjs/csso-compress-css-english-version
My talk is about DSLs, their kinds and when it’s worth to be using them. I’ll also demonstrate different approaches to developing internal and external DSLs in Python and will try to give the comparative analysis of those.
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...Ontico
В процессе обновления высоконагруженных серверов раздачи видео (40Gbit/s с каждого сервера) со старого OpenSuSE 10.2 на новый CentOS 7 (время между релизами — 7 лет) мы столкнулись с рядом проблем — необъяснимый свопинг и запуски OOM killer, неравномерное распределение нагрузки по ядрам, обрывы соединений, скачки системной нагрузки на CPU.
В докладе будет рассказано о том, как мы боролись с этими проблемами и какие технологии для этого использовали.
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
Евгений Крутько, НИЦ «Курчатовский институт».
В докладе на примере программы моделирования динамики движения конструкций по методу конечных элементов рассматриваются возможности и практика распараллеливания вычислений. Речь в нём пойдёт как о технике создания новых вычислительных потоков, так и об использовании стандартов openMP и MPI.
В предыдущей записи блога я обещал рассказать, почему сложно демонстрировать 64-битные ошибки на простых примерах. Разговор касался operator[] и я говорил, что в простых случая может работать даже явно некорректный код.
Казалось, закончились долгие обсуждения в форумах, как измерить время работы алгоритма, какие функции использовать, какую точность ожидать. Жаль, но опять придется вернуться к этому вопросу. На повестке дня вопрос – как лучше измерить скорость работы параллельного алгоритма.
CSSO – инструмент для минификации CSS, который не так давно вернулся к активной разработке. Помимо исправленных багов и новых фич, он значительно ускорился и стал одним из самых быстрых структурных минификаторов CSS.
Доклад о том как это достигалось, оптимизациях, деоптимизациях, структурах данных и подходах.
Holy.js, Санкт-Петербург, 5 июня 2016
Видео: https://www.youtube.com/watch?v=8o3gKKD_J4A
Андрей Карпов
Вы узнаете, что такое статический анализ кода и историю его развития. Узнаете, как эффективно применять инструменты статического анализа в своей работе, увидите практические примеры использования этой методологии. Доклад ориентирован на программистов, использующих языки Си/Си++, но будет полезен всем
"What I learned through reverse engineering", Yuri ArtiukhFwdays
In recent years, I have gained most of my knowledge through reverse engineering, how I did it and what I learned during this period, I decided to share. All this concerns graphic programming, performance, best practices in the frontend.
"Impact of front-end architecture on development cost", Viktor TurskyiFwdays
I have heard many times that architecture is not important for the front-end. Also, many times I have seen how developers implement features on the front-end just following the standard rules for a framework and think that this is enough to successfully launch the project, and then the project fails. How to prevent this and what approach to choose? I have launched dozens of complex projects and during the talk we will analyze which approaches have worked for me and which have not.
"Micro frontends: Unbelievably true life story", Dmytro PavlovFwdays
A real life story about the experience of using Micro frontends in an existing Enterprise product. Problems and their solutions on the way from the integration of a separate component to an extensible No-code platform.
"Objects validation and comparison using runtime types (io-ts)", Oleksandr SuhakFwdays
A common task in modern JS is parsing, validating and then comparing JSON objects. In this talk I will quickly go through most common ways to parse/validate and compare objects we use today and then focus more on how runtime types (based on io-ts) can help make such tasks easier and quicker to implement.
"JavaScript. Standard evolution, when nobody cares", Roman SavitskyiFwdays
Should we take a look at JavaScript when everyone is writing in TypeScript? What happens to the standard? What did we get last year? What new features can we expect this and next year? And most importantly, when will Observer be standardized?
Let's try to answer all these questions and even a little more, dream about the future, and enjoy that Observer is alive (or not).
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...Fwdays
Case study of how small team in Preply started with inheriting an existing ranking model to being able to produce a model per day. In this talk we'll cover steps to take if you find yourself in a similar situation: what kind of technology and processes can you introduce in order to achieve a great speedup in a development speed.
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil TopchiiFwdays
In my talk, I will tell about the world of GenAI services beyond GPT-wrappers and how we developed and scaled GenAI-centric applications. I'll share personal experiences about the obstacles, lessons, and strategic tools and methodologies that were key in taking GenAI applications from 0 to 1. I'll talk about the challenges we faced when launching LLM-based and image generative applications and delivering them to end users, and what conclusions and solutions were made.
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
Python engineers are introduced to the transformative potential of Large Language Models (LLMs) in the realm of advanced data analysis and the application of Semantic Kernel techniques. We will talk about how LLMs like ChatGPT can be integrated into Python environments to automate data processing, enhance predictive modeling, and unlock deeper insights from complex datasets. The session will delve into practical strategies for embedding Semantic Kernel methods within Python projects, illustrating how these advanced techniques can refine the accuracy of machine learning models by embedding domain-specific knowledge directly into the analysis process. Attendees will leave with a clear roadmap for leveraging the combined power of LLMs and Semantic Kernels, equipped with actionable knowledge to drive innovation in their data analysis projects and beyond, marking a significant leap forward in the evolution of Python engineering practices.
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
Federated learning. Algorithmic solution to the problem of privacy preserving ML. Pieces involved to support the training with NVIDIA Flare as example. How newest legislation affects federated learning.
"What is a RAG system and how to build it",Dmytro SpodaretsFwdays
Today, large language models are becoming an integral part of almost every IT solution. However, their use is often accompanied by certain limitations, such as the relevance of information or its depth and specificity. One of the ways to overcome these limitations is the method of working with LLMs - RAG (Retrieval Augmented Generation).
In an ideal world, you would write Python code and then it would work perfectly. But unfortunately, it doesn't work in this manner. In my talk, I'll cover how to efficiently debug your programs, especially in cloud environments or inside Kubernetes.
MLOps (Machine Learning Operations) is a recent buzzword, that trends a lot. Let's figure out together how maintaining applications with machine learning components is significantly different from maintaining applications without them.
We will look into MLOps best practices and typical problems and their implementations/solutions in real world production.
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
Ever seen a code base where understanding a simple method meant jumping through tangled class hierarchies? We all have! And while "Favor composition over inheritance!" is almost as old as object-oriented programming, strictly avoiding all types of subclassing leads to verbose, un-Pythonic code. So, what to do?
The discussion on composition vs. inheritance is so frustrating because far-reaching design decisions like this can only be made with the ecosystem in mind – and because there's more than one type of subclassing!
Let's take a dogma-free stroll through the types of subclassing through a Pythonic lens and untangle some patterns and trade-offs together. By the end, you'll be more confident in deciding when subclassing will make your code more Pythonic and when composition will improve its clarity.
"Distributed graphs and microservices in Prom.ua", Maksym KindritskyiFwdays
The current architecture of Prom.ua is built on microservices and GraphQL API, but it was not always like that. In this talk, I'll tell you how far we've come and how we've made using graphs in a microservice architecture convenient and simple. I will talk about the problems we faced and how we overcame them, made our development process more accessible, deployments faster, and the remains of the monolith less loaded.
"Rethinking the existing data loading and processing process as an ETL exampl...Fwdays
ETL stands for extract, transform, load. It's a process that combines data from different sources into a single repository for further processing, analysis, and utilization.
This talk provides an example of how pandas can be used to solve ETL tasks as a stage in the evolution of the data intake component. This involves preliminary validation, filtering, and conversion of data according to a set of business rules and internal representation, with intermediate combination with other sources.
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...Fwdays
I’m confident that many IT professionals are currently facing the same situation I was in a few months ago. Mobilization, uncertainty. How can I be maximally beneficial to the country with my experience and continue professional development in such circumstances? Since the onset of the full-scale invasion, I've been actively volunteering and assisting the army. Mobilization became the next logical step.
I want to share:
My journey in IT, volunteering, and the beginning of my service in the Armed Forces
Impressions from the first few months
Which Soft Skills are helpful in this context
I aim to dispel myths about the mobilization process and projects of the Armed Forces. Address your questions
And yes, military personnel can travel abroad during their leave.
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...Fwdays
The leader must be strong all the time. The leader cannot afford to make mistakes, let alone fail in front of their team. Is that really true? Nick Gicinto, a cybersecurity leader with over 25 years of experience, who has worked for the CIA and has built security systems from scratch at Tesla and Uber, fully hiring teams for these projects, will talk about the importance of being vulnerable to build trust within a team.
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...Fwdays
Sharing open feedback can be difficult because it equals much work on yourself. However, feedback needs attention and a special place in the corporate culture. It helps to grow dynamically, build a team of like-minded people and achieve powerful results.
In the presentation, I will talk about:
The ability to work with feedback as a soft, solid skill in developing technical specialists.
A list of difficulties that prevent quality work with feedback.
The 4A Framework is a tool for successful giving and receiving feedback.
I will also help specialists learn the following:
Form constructive feedback and understand how and when to give it.
Work analytically with the received feedback.
Feel free to share your thoughts and be heard.
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...Fwdays
Will discuss:
Current communication challenges, including mishaps and toxic versus productive interactions.
Ever wondered about PDP? It’s likely because its relevance to career planning, even outside your current company, hasn’t been fully spotlighted.
Exploring how PDP functions within career planning, applicable even if you’re eyeing an exit.
“Who do I aspire to become?”
Summarizing key points with a reference to a practical form you can download to use.
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...Fwdays
This talk will reveal four destructive communication patterns that can undermine team spirit, reduce productivity and cause conflict, and offer effective strategies for neutralizing them.
Let's start with exciting storytelling about a fictional team of developers working on Scrum. You will learn about situations that their team member noticed during team meetings.
Next, we will analyze "The Gottman Four Horsemen" model, which describes the four "horsemen of the apocalypse" of work relationships: criticism, defensiveness, contempt, and stonewalling. For each of these patterns, specific "antidotes" will be offered that allow you to build healthier and more productive relationships in the team.
Finally, we'll look at why this topic is critical to team productivity, drawing on Google's "Project Aristotle" research. Special attention will be paid to the concept of psychological safety, which is a key factor in the success of high-performance teams.
This talk will not only provide valuable insights and tools for improving communication and management in Tech teams, but will also help each member better understand their own contribution to the overall success of the team.
3. ClickHouse не тормозит.
А является ли ClickHouse самой быстрой системой во всех сценариях?
— в частных случаях можно выиграть...
... пока я этого не заметил.
5. DBMS-X
Работает с данными только с помощью mmap.
Не поддерживает сжатие данных.
Не поддерживает индексы и не сортирует хранимые данные.
Почти не поддерживает SQL.
Выполняет один запрос быстрее чем ClickHouse?
6. DBMS-X
Выполняет один запрос быстрее чем ClickHouse?
SELECT sum(x) FROM table
x Nullable(Float64)
— суммирование 1 млрд чисел double.
ClickHouse: 0.116 sec
DBMS-X: 0.066 sec
AWS c5.metal, 96 vCPU
7. Sanity Check — считаем байты
Скорость сканирования данных в ГБ/сек.
double — 8 байт + маска NULL, возможно 1 байт,
всего 9 байт на значение в оперативке.
Нужно обработать 9 ГБ данных в памяти.
ClickHouse: 0.116 sec, 78 ГБ/сек.
DBMS-X: 0.066 sec, 136 ГБ/сек.
STREAM benchmark: 160 ГБ/сек.
160 ГБ/сек. — максимальная скорость
сканирования памяти на данной машине.
8. Как быстрее всего суммировать числа?
1. Используем доступные ядра CPU
(делим работу по потокам).
2. Используем векторную обработку запроса
(только простые циклы, никаких виртуальных вызовов внутри).
3. Обрабатываем данные по блокам
(правильно используем кэш CPU).
4. Кэшируем несжатые данные в оперативке
(убираем разжатие, десериализацию, копирования).
9. Как быстрее всего суммировать числа?
Исполняемый базой данных код должен быть таким же,
как если бы вы вручную написали идеальный код на C++.
template <typename T>
T sum(const T * ptr, const T * end)
{
T res{};
while (ptr < end)
{
res += *ptr;
++ptr;
}
return res;
}
10. Как быстрее всего суммировать числа?
while (ptr < end)
{
res += *ptr;
++ptr;
}
Но разве это идеальный код на C++?
— можно развернуть цикл;
— можно векторизовать цикл;
— выравнивание;
— префетч;
Но разве компилятор C++ не обязан сам это делать?
14. Как быстрее всего суммировать числа?
$ clang++ -O3 -march=native -S main.cpp && cat main.s
.LBB2_2: # =>This Inner Loop Header: Depth=1
vaddsd (%rdi), %xmm0, %xmm0
addq $8, %rdi
cmpq %rsi, %rdi
jb .LBB2_2
Цикл не развёрнут, не векторизован... но это лучше на моей машине.
15. Почему компилятор не векторизует цикл?
Цикл с double, float — не векторизует.
Цикл с int — векторизует.
16. Почему компилятор не векторизует цикл?
Цикл с double, float — не векторизует.
Цикл с int — векторизует.
— Потому что это противоречит стандарту C++ и IEEE-754.
(a + b) + c != a + (b + c).
17. Почему компилятор не векторизует цикл?
Это можно «исправить», надо всего-лишь:
$ clang++ -O3 -march=native -ffast-math main.cpp && ./a.out
Res: 499999999500000000.000, time: 0.362, 22.086 GB/sec.
$ g++ -O3 -march=native -ffast-math main.cpp && ./a.out
Res: 499999999268435456.000, time: 0.392, 20.428 GB/sec.
$ clang++ -O3 -march=native -ffast-math -S main.cpp && cat main.s
.LBB2_4: # =>This Inner Loop Header: Depth=1
vaddpd (%rdi,%rcx,8), %ymm0, %ymm0
vaddpd 32(%rdi,%rcx,8), %ymm1, %ymm1
vaddpd 64(%rdi,%rcx,8), %ymm2, %ymm2
vaddpd 96(%rdi,%rcx,8), %ymm3, %ymm3
addq $16, %rcx
cmpq %rcx, %rdx
jne .LBB2_4
Но так делать нельзя :(
18. Почему компилятор не векторизует цикл?
-ffast-math использовать нельзя.
Потому что это ломает точность вычислений.
Kahan Summation:
while (ptr < end)
{
double compensated_value = *ptr - compensation;
double new_sum = sum + compensated_value;
compensation = (new_sum - sum) - compensated_value;
sum = new_sum;
++ptr;
}
19. Почему компилятор не векторизует цикл?
-ffast-math использовать нельзя.
Потому что это ломает точность вычислений.
Kahan Summation:
while (ptr < end)
{
double compensated_value = *ptr - compensation;
double new_sum = sum + compensated_value;
compensation = (sum + compensated_value - sum) - compensated_value;
sum = new_sum;
++ptr;
}
20. Почему компилятор не векторизует цикл?
-ffast-math использовать нельзя.
Потому что это ломает точность вычислений.
Kahan Summation:
while (ptr < end)
{
double compensated_value = *ptr - compensation;
double new_sum = sum + compensated_value;
compensation = 0;
sum = new_sum;
++ptr;
}
21. Можно развернуть отдельный цикл вручную
/// Vectorized version
template <typename Value>
void NO_INLINE addMany(const Value * __restrict ptr, size_t count)
{
/// Compiler cannot unroll this loop, do it manually.
/// (at least for floats, most likely due to the lack of -fassociative-math)
/// Something around the number of SSE registers * the number of elements fit in register.
constexpr size_t unroll_count = 128 / sizeof(T);
T partial_sums[unroll_count]{};
const auto * end = ptr + count;
const auto * unrolled_end = ptr + (count / unroll_count * unroll_count);
while (ptr < unrolled_end)
{
for (size_t i = 0; i < unroll_count; ++i)
partial_sums[i] += ptr[i];
ptr += unroll_count;
}
for (size_t i = 0; i < unroll_count; ++i)
sum += partial_sums[i];
while (ptr < end)
{
sum += *ptr;
++ptr;
}
}
22. Можно развернуть отдельный цикл вручную
#pragma GCC push_options
#pragma GCC optimize ("-ffast-math")
template <typename T>
__attribute__((__noinline__)) T sum(const T * ptr, const T * end)
{
T res{};
while (ptr < end)
{
res += *ptr;
++ptr;
}
return res;
}
#pragma GCC pop_options
Только для gcc.
23. Развернул цикл и...
Поднял машину в AWS, воспроизвёл результаты.
median, 1000 queries
ClickHouse: 0.090 sec
DBMS-X: 0.093 sec
ClickHouse на три миллисекунды быстрее!
24. ClickHouse не тормозит.
А является ли ClickHouse самой быстрой системой во всех сценариях?
Может ли кто-то стать быстрее ClickHouse хотя бы на одном запросе?
25. DBMS-Y
Умеет использовать не только CPU но и GPU.
Работает только с данными, помещающимися в память.
Не поддерживает сжатие данных.
Не поддерживает индексы и не сортирует хранимые данные.
Почти не поддерживает GROUP BY по строкам.
Выполняет один запрос быстрее чем ClickHouse?
26.
27. DBMS-Y
Выполняет один запрос быстрее чем ClickHouse?
SELECT passenger_count, avg(total_amount)
FROM trips
GROUP BY passenger_count
passenger_count UInt8, total_amount Float32
— вычисление avg по ключу 0..255.
ClickHouse: 0.827 sec (MergeTree)
ClickHouse: 0.395 sec (MergeTree + uncompressed cache)
ClickHouse: 0.332 sec (Memory)
DBMS-Y: 0.204 sec
Xeon E5-2650v2, 32 logical CPU
28. Какой был бы идеальный код?
Для выполнения запроса:
SELECT key, avg(value) FROM table GROUP BY key
Структура данных:
Lookup таблица, 256 ячеек
— массив пар sum, count.
Алгоритм:
Просто цикл по входным данным
и обновление состояния в ячейке.
29. Какой был бы «идеальный» код?
struct State
{
float sum = 0;
size_t count = 0;
void add(float value)
{
sum += value;
++count;
}
};
void process(const vector<uint8_t> & keys,
const vector<float> & values)
{
State map[256]{};
size_t size = keys.size();
for (size_t i = 0; i < size; ++i)
map[keys[i]].add(values[i]);
return map[0].result();
}
30. Какой код реально используется?
Используется loookup таблица.
Но есть всякие мелочи:
1. Состояния хранятся не прямо в ней,
а по указателю, выделяются в отдельной арене.
2. В каждой ячейке хранится ещё один бит, занята ли она.
3. Буфер для lookup таблицы выделяется отдельно.
4. Размер lookup таблицы хранится отдельно и обновляется при insert.
Четыре возможности по оптимизации!
31. Четыре возможности по оптимизации
Я попробовал все.
Они помогли, но недостаточно.
Наш код уже «идеальный».
Но он работает недостаточно быстро,
нужна какая-то магия!
32. Развернуть цикл
Создать несколько таблиц состояний.
Агрегировать в разные, а потом слить вместе.
State map[256 * UNROLL_COUNT]{};
size_t size = keys.size();
size_t i = 0;
size_t size_unrolled = size / UNROLL_COUNT * UNROLL_COUNT;
for (; i < size_unrolled; i += UNROLL_COUNT)
for (size_t j = 0; j < UNROLL_COUNT; ++j)
map[256 * j + keys[i + j]].add(values[i + j]);
for (size_t key = 0; key < 256; ++key)
for (size_t j = 1; j < UNROLL_COUNT; ++j)
map[key].merge(map[256 * j + key]);
for (; i < size; ++i)
map[keys[i]].add(values[i]);
33. Развернуть цикл по-другому
struct State4
{
float sum[4]{};
size_t count[4]{};
...
};
State4 map[256]{};
size_t size = keys.size() / 4 * 4;
for (size_t i = 0; i < size; i += 4)
{
map[keys[i]].add<0>(values[i]);
map[keys[i + 1]].add<1>(values[i]);
map[keys[i + 2]].add<2>(values[i]);
map[keys[i + 3]].add<3>(values[i]);
}
...
34. Буферизация и Batching
State map[256]{};
static constexpr size_t BUF_SIZE = 16384 / 256 / sizeof(float); /// Should fit in L1d.
float buffers[256 * BUF_SIZE];
float * ptrs[256];
for (size_t i = 0; i < 256; ++i)
ptrs[i] = &buffers[i * BUF_SIZE];
size_t size = keys.size();
const auto * key = keys.data();
const auto * key_end = key + size;
const auto * value = values.data();
while (key < key_end)
{
*ptrs[*key] = *value;
if (++ptrs[*key] == &buffers[(*key + 1) * BUF_SIZE]) /// Calculation is better than L1d load.
{
ptrs[*key] -= BUF_SIZE;
map[*key].addBatch<BUF_SIZE>(ptrs[*key], BUF_SIZE);
}
++key;
++value;
}
for (size_t i = 0; i < 256; ++i)
map[i].addBatch<4>(&buffers[i * BUF_SIZE], ptrs[i] - &buffers[i * BUF_SIZE]);
35. Вариация на тему Bucket Sort
State map[256]{};
size_t size = keys.size();
/// Calculate histograms of keys.
using CountType = UInt32;
static constexpr size_t HISTOGRAM_SIZE = 256;
CountType count[HISTOGRAM_SIZE * UNROLL_COUNT]{};
size_t unrolled_size = size / UNROLL_COUNT * UNROLL_COUNT;
for (const UInt8 * elem = keys.data(); elem < keys.data() + unrolled_size; elem += UNROLL_COUNT)
for (size_t i = 0; i < UNROLL_COUNT; ++i)
++count[i * HISTOGRAM_SIZE + elem[i]];
for (const UInt8 * elem = keys.data() + unrolled_size; elem < keys.data() + size; ++elem)
++count[*elem];
for (size_t i = 0; i < HISTOGRAM_SIZE; ++i)
for (size_t j = 1; j < UNROLL_COUNT; ++j)
count[i] += count[j * HISTOGRAM_SIZE + i];
/// Row indices in a batch for each key.
PODArray<UInt32> indices(size);
UInt32 * positions[HISTOGRAM_SIZE];
positions[0] = indices.data();
for (size_t i = 1; i < HISTOGRAM_SIZE; ++i)
positions[i] = positions[i - 1] + count[i - 1];
for (size_t i = 0; i < size; ++i)
*positions[keys[i]]++ = i;
/// Update states.
UInt32 * idx = indices.data();
for (size_t i = 0; i < HISTOGRAM_SIZE; ++i)
for (; idx < positions[i]; ++idx)
map[i].add(values[*idx]);
36. А во сколько раз разворачивать цикл?
При тестировании на разных серверах получаются разные результаты.
На процессорах AMD EPYC, Ryzen больше кэш
— можно разворачивать в 8 раз.
На процессорах Intel это вызывает ужасные тормоза
— и можно максимум в 4 раза.
37. А во сколько раз удаётся ускорить?
На модельном коде:
Baseline: 360 million rows/sec., 1804 MiB/sec.
Optimized: 1339 million rows/sec., 6695 MiB/sec. x3.72
Реальный запрос в ClickHouse:
ClickHouse (old): 0.332 sec.
DBMS-Y: 0.204 sec
ClickHouse (new): 0.197 sec. x1.69
38. Выводы
Если какая-то система на каком-то вырожденном запросе
работает чуть-чуть быстрее ClickHouse
— это значит, что я ещё не оптимизировал код,
и сделаю это завтра.
Внутреннее устройство ClickHouse позволяет
выполнять оптимизации под задачу и железо.
39. Бонус
Batch Aggregator:
https://github.com/ClickHouse/ClickHouse/pull/6435
Ускорение функции sum:
https://github.com/ClickHouse/ClickHouse/pull/10992
Ускорение GROUP BY 8bit key:
https://github.com/ClickHouse/ClickHouse/pull/13055
https://github.com/ClickHouse/ClickHouse/pull/13056
https://github.com/ClickHouse/ClickHouse/pull/13084
https://github.com/ClickHouse/ClickHouse/pull/13091
https://github.com/ClickHouse/ClickHouse/pull/13096
https://github.com/ClickHouse/ClickHouse/pull/13099
И тест с примерами:
https://github.com/ClickHouse/ClickHouse/blob/master/
src/Common/tests/average.cpp