Обновить
256K+

Высоконагруженные системы *

Методы получения высокой производительности систем

117,13
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Почему ваш Parallel.ForEach впустую сжигает CPU — ускоряем обработку данных до 600+ раз

Время на прочтение7 мин
Охват и читатели6.3K

Практически в каждом высоконагруженном .NET-проекте рано или поздно появляется один и тот же паттерн:

Есть коллекция данных.

Для каждого элемента нужно выполнить дорогую операцию.

Например:

вычислить хэш;

Читать далее

Новости

Как мы ускорили расчёт факторов ранжирования в поиске Ozon с помощью динамической компиляции

Уровень сложностиСредний
Время на прочтение27 мин
Охват и читатели8.9K

Всем привет! Меня зовут Петя Портнов, я работаю в Ozon ведущим разработчиком в команде среднего поиска — слоя, который ранжирует поисковую выдачу.

Представьте, что вы вводите запрос в поисковую строку маркетплейса. За этим простым действием скрывается сложный поисковый пайплайн: миллионы товаров фильтруются, ранжируются и сортируются по релевантности. Но как именно система решает, что показать первым? В основе этого решения лежат вычисления, среди которых — сотни разнообразных формул, учитывающих цену, рейтинг, популярность, персонализацию и другие факторы. По мере развития системы таких формул становится всё больше, а сами они усложняются. В какой-то момент вычисления превращаются в узкое место: начинают потреблять значительную долю CPU, создают множество промежуточных объектов — и так для каждого поискового запроса. Возникает вопрос: как снизить стоимость таких вычислений в JVM?

В этой статье я расскажу, что сделали мы, чтобы снизить нагрузку на систему: как заменили интерпретирующий движок формул на динамический компилятор, выполняющий построение эффективного байт-кода, отлично векторизующегося JIT-компилятором. Это текстовая версия доклада с Joker 2025 с дополнениями, которые не вошли в выступление или появились в проекте уже после конференции.

Читать далее

Как избежать 7 критических ошибок при переходе на микросервисы

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели7.1K

Микросервисы обещают масштабирование и независимость команд, но чаще ломают систему медленнее монолита. Почему?

В статье разбираем семь архитектурных ошибок, которые можно встретить в реальных системах: выбор по моде, shared database, игнорирование network latency, операционная сложность на потом, слишком мелкая декомпозиция, отсутствие стратегии consistency, недооценка сроков миграции.

Разобрать ошибки

Автоскейлинг StarRocks в Kubernetes: как я довел его до предела

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели6.1K

Классическая проблема аналитических систем: кластер СУБД сайзится под пик, а 28 дней в месяц он задействован чуть больше чем наполовину. StarRocks (shared-data) и автоскейл Kubernetes убирают этот избыток. Compute добавляется под нагрузку и сворачивается на спаде. Внутри легкая пятничная статья: как это работает и где у эластичности потолок.

Читать далее

Оптимизация сетевой обработки в высоконагруженных системах

Уровень сложностиСредний
Время на прочтение25 мин
Охват и читатели6.7K

В условиях стремительного роста объёмов интернет‑трафика особое значение приобретают высоконагруженные системы. Под этим термином понимают подкласс систем массового обслуживания, предназначенных для обработки большого числа запросов при минимальном времени отклика. Стабильность таких систем определяется их способностью сохранять работоспособность при увеличении нагрузки и обеспечивать предсказуемый рост задержек.

Для достижения требуемого уровня производительности применяется масштабирование. Его принято разделять на два основных подхода: вертикальное масштабирование, при котором увеличиваются вычислительные ресурсы отдельных узлов, и горизонтальное масштабирование, предполагающее добавление в систему дополнительных сервисов, обслуживающих запросы. Однако независимо от выбранного подхода сетевой уровень остаётся критическим фактором, влияющим на производительность. Это связано с тем, что сетевую часть невозможно масштабировать столь же гибко, как остальные компоненты системы.

Так, при вертикальном масштабировании увеличение числа процессоров ускоряет обработку запросов, но количество сетевых интерфейсов остаётся ограниченным: клиенты продолжают взаимодействовать с сетевым адресом, привязанным к конкретной сетевой карте. При горизонтальном масштабировании все запросы проходят через балансировщик нагрузки, который остаётся единственной точкой входа. В результате именно эффективность сетевой обработки может стать узким местом, нивелирующим преимущества масштабирования.

Как следствие, при проектировании высоконагруженных систем необходимо уделять особое внимание организации сетевой обработки. В моей практике эта задача особенно остро проявилась при разработке VPN‑сервиса, который можно рассматривать как типичный пример высоконагруженной системы. В статье будет показано, как применение нестандартных технических решений позволяет существенно повысить скорость сетевой обработки и, как следствие, улучшить общую производительность системы.

Читать далее

Тест современных компрессоров для HTTP

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели7.9K

Сжатие текста уже давно стало стандартом в мире веб‑приложений. Сокращение объёма данных даёт сокращение времени передачи и снижение нагрузки на сетевой канал. Однако, часто настройка компрессии сводится к динамическому сжатию gzip и настройкам по умолчанию. В этой статье разберём вопрос сжатия более глубоко. Для начала вспомним основные технологии сжатия, доступные в вебе.

Читать далее

Не все якори одинаково полезны, или как I2I-рекомендации свежими сохранять

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели6.9K

Привет, Хабр! Меня зовут Иван Воробьев,  я работаю в команде рекомендаций VK Видео, AI VK. В данной статье хочу рассказать, как и зачем я переделывал систему построения I2I-рекомендаций. Поговорим о том, какие решения были поставлены в её основу, насколько они оправдались, а также причём тут якори и как они связаны со свежестью рекомендаций. 

В первую очередь сосредоточимся на бэкенде: организации работы с данными и вычислений, их конфигурациях, и требуемых вычислительных ресурсах. Основной эффект от внедрения новой системы кроется именно тут: удалось обеспечить свежесть I2I-рекомендаций примерно в час, сократив при этом количество используемых ядер в три раза. Саму логику построения рекомендаций тоже затронем, но в меньшей мере.

Читать далее

Реальный time series агрегатор: как обрабатывать 10 событий/сек на графе из 300k узлов

Время на прочтение7 мин
Охват и читатели8.4K

Представьте, что у вас есть многослойный пайплайн обработки данных.

Ширина слоя — 5000 узлов. Количество слоёв — 60. Общее число узлов — 300 000.

Каждую секунду приходит 10 новых событий (изменений на входе). Наивный подход — пересчитать всё с нуля — будет перебирать все 300 000 узлов на каждое обновление. При 10 обновлениях в секунду это 3 млн вычислений узлов в секунду. А если ширина слоя 100 000 и слоёв 100? Получаем 10 млн узлов на пересчёт. Компьютер не справляется.

Читать далее

Микросекундные оценки опционов: как пересчитать портфель из 200k инструментов за 10 мс

Время на прочтение7 мин
Охват и читатели8.2K

Финансовые системы предъявляют жёсткие требования к производительности.

Риск-департамент запрашивает переоценку портфеля из 200 000 опционов. Маржинальная система требует пересчитать все позиции клиентов после сильного движения рынка. Алгоритмический трейдер хочет оценить Greeks для тысяч потенциальных сделок за миллисекунды.

Стандартные подходы на .NET дают сбой по трём причинам.

Причина 1: Объектная модель

Каждый опцион становится отдельным объектом в куче. Виртуальные методы, ссылки, разрозненное расположение в памяти. Для 200 000 объектов — миллионы байтов, GC-паузы на сборку, промахи кэша процессора.

Причина 2: Позлементные вычисления

Вызов функции ценообразования в цикле — плохо. Процессор не может векторизовать код, потому что не видит всю картину целиком. SIMD-инструкции простаивают.

Причина 3: Аллокации в горячем пути

Каждый вызов new double[100000] для хранения промежуточных результатов — это давление на GC. В 24/7 сервисе такие аллокации накапливаются и вызывают непредсказуемые паузы.

Требования к решению

Читать далее

Шифрование на уровне протокола

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели7.5K

Как организовать шифрование на уровне протокола? На самом деле тема непростая и пожалуй (имхо) это как раз та самая тема, где прийти к компромиссу почти никогда не получается. Разве что просто не передавать чувствительные данные вовсе.

Я расскажу как шифрование можно организовать на уровне протокола brec и ни в коем случае не буду затрагивать те самые принципиальные решения, влияющие на безопасность (как передавать, куда передавать, отправлять ли, и хранить ли чувствительные данные вовсе). Иными словами нас интересует инструментальная сторона вопроса.

Читать далее

Кэширование в Symfony: как мы сломали авторизацию и починили ее через Lock

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели6.3K

Привет, Хабр! На связи команда «Исходного Кода».

Когда бэкенд на Symfony начинает тормозить, одним из первых инструментов оптимизации почти всегда становится кэширование. И это логично: правильно настроенный кэш круто снижает нагрузку на базу данных, режет latency API и убирает лишние ресурсоемкие операции внутри приложения.

Но на практике мы редко ограничиваемся простым cache->get() и базовым TTL, особенно когда приложение крутится не на одном сервере, а в Kubernetes-кластере с пачкой внешних API и жесткой конкуренцией запросов. В таких условиях кэш - это уже не только про скорость, но и про синхронизацию состояния между процессами и pod'ами.

Читать далее

Нагрузочное тестирование без нагрузки и тестов: используем k6 для мониторинга API

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели5.7K

На связи Дмитрий Рыбалка, SRE‑инженер Mindbox. В статье описываю стандартный инструмент для нагрузочного тестирования k6 в новом амплуа: как агента для мониторинга, который в ряде случаев работает лучше, чем привычные инструменты. 

В материале рассказываю, как настроить К6, что смотреть в итоговом отчете и как анализировать метрики. А еще делюсь реальными кейсами применения агента.

Читать далее

Оптимизация запросов к PostgreSQL: 5 неочевидных настроек для продакшена

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели13K

В реальных проектах PostgreSQL часто работает не на полную мощность из-за дефолтных настроек, которые не учитывают специфику нагрузки. Разберём 5 неочевидных параметров, которые стоит подкрутить в postgresql.conf для стабильной работы в продакшене.

Важно: перед внесением изменений обязательно протестируйте их в тестовой среде. Изменения глобальных параметров конфигурации могут как ускорить, так и замедлить работу базы данных.

Читать далее

Ближайшие события

Пап, а это HTAP? — Ну такое, это две разные СУБД в длинном плаще

Уровень сложностиПростой
Время на прочтение12 мин
Охват и читатели11K

HTAP — одна из главных тем в мире СУБД. Вокруг PostgreSQL массово появляются конструкции с внешними аналитическими движками со своими моделями хранения данных и ограничениями совместимости, однако бизнесу не совсем комфортно жить в архитектуре, где транзакционные данные находятся в одной системе, аналитика — в другой, а между ними — разного рода ETL, CDC и прочие parquet‑файлы.

В Tantor мы движемся по иному пути, развивая HTAP внутри PostgreSQL, а не рядом с ним. Вокруг этой идеи строятся СУБД Tantor Polar и машина баз данных Tantor XData Gen3, в которой OLTP и аналитика, не теряя совместимости с Postgres, работают поверх общего хранилища данных и общей видимости транзакций. В этой статье хочется поговорить не столько о самом термине HTAP, сколько о том, как меняется архитектура PostgreSQL, когда OLTP и аналитика начинают работать поверх общего хранилища данных.

Читать далее

Почему современный стадион больше похож на ЦОД, чем на арену

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели9.5K

Привет, Хабр! Меня зовут Сергей Пауков, я директор департамента инженерных и мультимедийных систем КРОК. В ближайшие недели спорт снова станет глобальным технологическим стресс-тестом: 30 мая Будапешт примет финал Лиги чемпионов, а уже 11 июня стартует чемпионат мира по футболу 2026 года в США, Канаде и Мексике.

Для болельщиков это большой праздник спорта. Для инженеров: распределенная сеть высоконагруженных объектов, где в день матча должны одновременно работать контроль доступа, связь, видеонаблюдение, трансляции, климатические системы, мобильные приложения, фуд-корты, цифровые экраны и десятки других подсистем.

Стадион в такие моменты больше похож не на арену, а на высоконагруженную ИТ-систему с пиковыми нагрузками. Если где-то проседает сеть, зависает турникет, не открывается приложение или сбоит экран, это сразу видят десятки тысяч людей. В статье разберем, какие технологии помогают современным аренам выдерживать такие сценарии.

Читать далее

Cache is hard — почему инвалидация кэша — это проблема согласованности, а не производительности

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели5.6K

Кэш часто воспринимают как простой способ ускорить систему: положили данные ближе к приложению — получили быстрый ответ. Но на практике главная сложность начинается не с производительности, а с согласованности. Когда данные меняются, кэш может начать «врать»: показывать старые остатки, устаревшие статусы или разные версии одной и той же сущности разным пользователям.

В статье разбираем, почему инвалидация кэша — это архитектурная проблема, как TTL, события, CDC и lease‑подходы влияют на консистентность и когда кэш лучше вообще не использовать.

Читать далее

brec: контролируемая обратная совместимость протокола

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели7.3K

С момента последней (и вроде единственной) статьи о brec прошло какое-то время, и мне кажется, что будет полезно лишний раз напомнить о проекте. Даже неожиданно для меня самого он продолжает развиваться. Пусть я пока не могу похвастаться значимым интересом со стороны сообщества, но в паре локальных проектов он уже появился. Да, скорее как эксперимент. Тем даже лучше: можно провести, что называется, полевые испытания.

Читать далее

CPU не умер, он просто ждал. Китай строит двухэксафлопсный суперкомпьютер без единого GPU — прорыв, необходимость, фейк?

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели22K

El Capitan, Frontier, Aurora, JUPITER Booster — четыре нынешние эксафлопсные системы из рейтинга Top500, первые строчки суперкомпьютерной табели о рангах. Все четыре используют GPU-ускорение. Это архитектурный консенсус, который формировался около десяти лет и к 2024 году стал самоочевидным: хочешь эксамасштаб — используй GPU.

На этом фоне Китай объявляет о суперкомпьютере исключительно на CPU, без единого ускорителя. Это либо достаточно нетривиальное архитектурное решение, либо красивая история про независимость и импортозамещение. Скорее всего, оба варианта одновременно. Но чтобы это понять, нужно посмотреть назад и выяснить, как GPU вообще оказался на вершине суперкомпьютинга и почему это происходило не один год. Да и вообще неплохо бы разобраться, как GPU добрался до вершины суперкомпьютинга, что в этом противостоянии осталось от CPU и почему именно Китай решил поставить на него.

Разобраться, в чём там дело

Java и постквантовый TLS

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели15K

В JDK 27 появится JEP 527: гибридный post-quantum key exchange для TLS 1.3. Разбираем, что меняется в JSSE, зачем нужен X25519MLKEM768 и какие проблемы могут всплыть при миграции.

А ты готов к квантовым атакам ?

Что сейчас с Project Loom? Примеры и код

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели15K

Практика Project Loom: как включить preview Structured Concurrency в javac, Maven и Gradle, как использовать ScopedValue для request context и StructuredTaskScope для параллельных вызовов, joiner’ы, timeout и связка обеих фич в одном примере. Примеры под JDK 25+

Что же с Project Loom?
1
23 ...