Что происходит с облаками и инфраструктурой? Давайте посмотрим в новой подборке: так ли сейчас любят облака, как работать с S3 и где можно взять мощностей для LLM.
Почему компании возвращают нагрузки из публичного облака в 2026 году
Гибридное облако: что оставить у себя, а что вынести в публичный контур
Облако или свои серверы: почему бизнес выбирает гибридную инфраструктуру
Кто отвечает за работу облачной инфраструктуры: бизнес или провайдер
VPS или облачный IaaS в 2026: когда дешёвый сервер перестаёт справляться
Где арендовать GPU в 2026
GPU-серверы для LLM-инференса
S3 в инфраструктуре: где объектное хранилище помогает, а где не заменит файловую систему
Как хранить бэкапы в S3, чтобы их не удалил сбой или вирус
Почему компании возвращают нагрузки из публичного облака в 2026 году
Гибридное облако: что оставить у себя, а что вынести в публичный контур
Облако или свои серверы: почему бизнес выбирает гибридную инфраструктуру
Кто отвечает за работу облачной инфраструктуры: бизнес или провайдер
VPS или облачный IaaS в 2026: когда дешёвый сервер перестаёт справляться
Где арендовать GPU в 2026
GPU-серверы для LLM-инференса
S3 в инфраструктуре: где объектное хранилище помогает, а где не заменит файловую систему
Как хранить бэкапы в S3, чтобы их не удалил сбой или вирус
1❤12🔥6👏5💯5😁4🫡3🥰2🤓2🤪2😍1🍌1
Как Cloudflare освободила 100 ТБ памяти в DNS-кеше 1.1.1.1
Big Pineapple за сервисом 1.1.1.1 хранит больше 250 млрд записей кеша. В таком масштабе лишний байт обходится серверам более чем в 250 ГБ памяти. Пять изменений сократили запись больше чем вдвое и освободили около 100 ТБ. Пропускная способность вставки выросла на 43%, задержка поиска снизилась на 19%.
DNS-ответ в кеше уже не меняется, но
В разборе Cloudflare есть остальные шаги. Одних тестов мало: память процесса зависит от трафика, заполнения кеша и состояния распределителя памяти, поэтому её сверяли при внедрении.
Big Pineapple за сервисом 1.1.1.1 хранит больше 250 млрд записей кеша. В таком масштабе лишний байт обходится серверам более чем в 250 ГБ памяти. Пять изменений сократили запись больше чем вдвое и освободили около 100 ТБ. Пропускная способность вставки выросла на 43%, задержка поиска снизилась на 19%.
DNS-ответ в кеше уже не меняется, но
Vec хранит ёмкость для роста. Замена восьми векторов и строк на контейнеры фиксированного размера сэкономила 64 байта на запись. Ещё 28 байт убрали, объединив три раздела ответа в один список со смещениями.В разборе Cloudflare есть остальные шаги. Одних тестов мало: память процесса зависит от трафика, заполнения кеша и состояния распределителя памяти, поэтому её сверяли при внедрении.
1🔥30🤨8💔4👌3🤩2👀2🤝2😴1👻1💘1😘1
Forwarded from DevOps для ДевоПсов
В Суздаль за DevOps
Недавно мы съездили на «Без предела: Исходный код ритейла» от MAGNIT TECH в Суздаль. Разговор о технологиях начинался с купеческих рядов, продолжился на Demo Day на ГЭС на Нерли, а затем перешёл к самовару. Мы кайфанули от формата.
У Владимира Дроздецкого, например, зацепил заход через первый рабочий день инженера. По мере знакомства с инфраструктурой за привычными сборками и выкладками обнаруживается хозяйство на тысячи ядер. Через такую историю масштаб ощущается лучше, чем через цифры сами по себе: можно примерить на себя работу человека, которому всё это поддерживать. Ради этого взгляда изнутри советуем открыть презентацию. И наставление от Владимира не забудьте:
Недавно мы съездили на «Без предела: Исходный код ритейла» от MAGNIT TECH в Суздаль. Разговор о технологиях начинался с купеческих рядов, продолжился на Demo Day на ГЭС на Нерли, а затем перешёл к самовару. Мы кайфанули от формата.
У Владимира Дроздецкого, например, зацепил заход через первый рабочий день инженера. По мере знакомства с инфраструктурой за привычными сборками и выкладками обнаруживается хозяйство на тысячи ядер. Через такую историю масштаб ощущается лучше, чем через цифры сами по себе: можно примерить на себя работу человека, которому всё это поддерживать. Ради этого взгляда изнутри советуем открыть презентацию. И наставление от Владимира не забудьте:
Не важно, сколько раз ты упал – важно, сколько раз ты поднялся. Главное — поднимайся с правильным IP-адресом
1🔥11❤8🌭4💯4😁3🎉3👀3😨3🥰2👨💻2🤷2
Почему тип указателя не гарантирует безопасность памяти
Указатель сохраняет тип, даже когда байты по его адресу уже означают другое. В примере на Zig структура с меткой сначала хранит срез байтов. Код берёт указатель на это поле, записывает в ту же структуру 128-битное число, а затем разыменовывает старый указатель. Адрес и тип указателя прежние, но внутри уже число: возникает путаница типов.
Автор называет этот случай самым трудным контрпримером для безопасности памяти. Он не зависит от кучи и деструкторов; похожий сценарий ломает и Ada. Практическую опасность автор не преувеличивает: насколько такой баг пригоден для эксплуатации, неясно. Куда более распространённое переполнение буфера компилятор может закрыть проверкой границ.
В разборе Memory Safety’s Hardest Problem есть код, вывод программы и аргумент, почему встроенные границы массивов в C могли предотвратить немало проблем.
Указатель сохраняет тип, даже когда байты по его адресу уже означают другое. В примере на Zig структура с меткой сначала хранит срез байтов. Код берёт указатель на это поле, записывает в ту же структуру 128-битное число, а затем разыменовывает старый указатель. Адрес и тип указателя прежние, но внутри уже число: возникает путаница типов.
Автор называет этот случай самым трудным контрпримером для безопасности памяти. Он не зависит от кучи и деструкторов; похожий сценарий ломает и Ada. Практическую опасность автор не преувеличивает: насколько такой баг пригоден для эксплуатации, неясно. Куда более распространённое переполнение буфера компилятор может закрыть проверкой границ.
В разборе Memory Safety’s Hardest Problem есть код, вывод программы и аргумент, почему встроенные границы массивов в C могли предотвратить немало проблем.
matklad.github.io
Memory Safety's Hardest Problem
Uplifting a lobsters comment for easier reference.
1👌6🎉5🤝3🤩2🌚2🎃2👍1😢1🙏1🎄1🦄1
Forwarded from Data Analysis / Big Data
Мы вернулись из Суздаля с новым взглядом на магазин у дома
Были на tech-туре MAGNIT TECH «Без предела: Исходный код ритейла» и нам понравилось, как сошлись место и тема. Сначала купеческие ряды Суздаля, затем разговор о технологиях современной торговли на ГЭС на Нерли. В программе были и воздушный шар, и общение с инженерами у самовара. Получилась поездка, в которой было время и Суздалем полюбоваться, и познакомиться с людьми, стоящими за проектами.
Из выступлений особенно запомнился доклад Максима Покусенко о прогнозировании спроса. 17 млрд прогнозов ежедневно впечатляют, когда понимаешь связь с совершенно обыденной, казалось бы, вещью: приходишь в магазин, а нужный товар лежит на полке. Доклад помог увидеть, сколько расчётов стоит за этим привычным удобством.
Презентацию советуем посмотреть и тем, кто не работает с ритейлом. На одном понятном примере здесь можно проследить, как результат ML-модели становится решением о поставке.
Были на tech-туре MAGNIT TECH «Без предела: Исходный код ритейла» и нам понравилось, как сошлись место и тема. Сначала купеческие ряды Суздаля, затем разговор о технологиях современной торговли на ГЭС на Нерли. В программе были и воздушный шар, и общение с инженерами у самовара. Получилась поездка, в которой было время и Суздалем полюбоваться, и познакомиться с людьми, стоящими за проектами.
Из выступлений особенно запомнился доклад Максима Покусенко о прогнозировании спроса. 17 млрд прогнозов ежедневно впечатляют, когда понимаешь связь с совершенно обыденной, казалось бы, вещью: приходишь в магазин, а нужный товар лежит на полке. Доклад помог увидеть, сколько расчётов стоит за этим привычным удобством.
Презентацию советуем посмотреть и тем, кто не работает с ритейлом. На одном понятном примере здесь можно проследить, как результат ML-модели становится решением о поставке.
🔥10💘3👏2😢2🎉2🕊2💯2🤷♀1😁1🫡1🎅1
Как повторное использование ReverseProxy ускорило прокси на Go в 3,8 раза
Автор нагрузил свой обратный прокси и обнаружил хвост медленных запросов. Причина оказалась в обработчике: тот создавал новый
Вместе с прокси заново создавался
В тесте пропускная способность выросла с 1710 до 6541 запроса в секунду, а средняя задержка упала примерно с 58 до 7,6 мс. Если строите сервис на
Автор нагрузил свой обратный прокси и обнаружил хвост медленных запросов. Причина оказалась в обработчике: тот создавал новый
httputil.ReverseProxy для каждого запроса.Вместе с прокси заново создавался
http.Transport. Соединения с целевым сервером не переиспользовались, поэтому каждый запрос платил за новое подключение. Исправление: хранить по одному ReverseProxy на каждый целевой сервер в sync.Map.В тесте пропускная способность выросла с 1710 до 6541 запроса в секунду, а средняя задержка упала примерно с 58 до 7,6 мс. Если строите сервис на
ReverseProxy, http.Client или http.Transport, создавайте объект один раз для каждого адреса и не пересобирайте его внутри обработчика.👍15👏12❤11🏆7👀6🙉4👌3🎉2👾2🤔1🤣1
Как раздать 8,8 Гбит/с видео на одном ядре Go
Ошибочно отправленная ссылка уложила сервер: зрители одновременно открыли HLS-трансляцию, память закончилась, потоки оборвались. Автор собрал Ruseon Core на Go без перекодирования видео.
Кадр один раз попадает в буфер, а зрители читают те же байты. Отстающему подписчику сервер пропускает кадры до следующего ключевого, поэтому не хранит отдельную очередь видео для каждого.
В тесте 1000 пользователей за 70 секунд получили 81 ГБ данных: 8,8 Гбит/с и 60 822 HTTP-ответа без ошибок. В разборе Ruseon Core есть архитектура, исходники и нагрузочные тесты.
Ошибочно отправленная ссылка уложила сервер: зрители одновременно открыли HLS-трансляцию, память закончилась, потоки оборвались. Автор собрал Ruseon Core на Go без перекодирования видео.
Кадр один раз попадает в буфер, а зрители читают те же байты. Отстающему подписчику сервер пропускает кадры до следующего ключевого, поэтому не хранит отдельную очередь видео для каждого.
В тесте 1000 пользователей за 70 секунд получили 81 ГБ данных: 8,8 Гбит/с и 60 822 HTTP-ответа без ошибок. В разборе Ruseon Core есть архитектура, исходники и нагрузочные тесты.
👍21👏13🤩3😈3😴3🐳2🙈2🥰1😍1💋1🗿1
Иногда важнее понять, как всё устроено, чем выучить очередной инструмент. Эти статьи про логику и процессы: без привязки к конкретным технологиям, зато с идеями, которые пригодятся в любой команде. Будет полезно командам и разработчикам, которые хотят больше понимания процессов на уровне концепций!
Как выстроить работу с выделенной командой
Как работает IT-команда: путь задачи от бэклога до релиза
7 стратегий модернизации легаси
Стратегии деплоя, которые не роняют прод
Как сделать ИБ по-настоящему надёжной
Зачем бизнесу многофакторка
Использование разных фреймворков качает мозг
Как выстроить работу с выделенной командой
Как работает IT-команда: путь задачи от бэклога до релиза
7 стратегий модернизации легаси
Стратегии деплоя, которые не роняют прод
Как сделать ИБ по-настоящему надёжной
Зачем бизнесу многофакторка
Использование разных фреймворков качает мозг
🔥9👍8❤🔥4🆒3😁2😐2🙉2🙊2💔1🙈1🤗1
Архитектор решений: чем он занимается и как войти в профессию
Одна пропущенная система на схеме может обернуться сдвигом сроков и ростом бюджета: её доработку просто не заложат в проект. Архитектор решений должен заметить такой промах до реализации.
Он разбирает бизнес-требования на функции, распределяет их по системам и проектирует обмен данными между ними. Результат: архитектурный вижен, то есть диаграммы систем, интеграций, процессов и ролей. Это концепция будущих изменений, которую уточняют на следующих этапах.
Материал пригодится разработчикам, аналитикам, тимлидам и руководителям, которые присматриваются к роли архитектора решений. В нём разобраны необходимые знания, онбординг, первый год работы и собеседование с практическими задачами: кандидату нужно запросить недостающие данные, сравнить варианты и защитить решение.
Одна пропущенная система на схеме может обернуться сдвигом сроков и ростом бюджета: её доработку просто не заложат в проект. Архитектор решений должен заметить такой промах до реализации.
Он разбирает бизнес-требования на функции, распределяет их по системам и проектирует обмен данными между ними. Результат: архитектурный вижен, то есть диаграммы систем, интеграций, процессов и ролей. Это концепция будущих изменений, которую уточняют на следующих этапах.
Материал пригодится разработчикам, аналитикам, тимлидам и руководителям, которые присматриваются к роли архитектора решений. В нём разобраны необходимые знания, онбординг, первый год работы и собеседование с практическими задачами: кандидату нужно запросить недостающие данные, сравнить варианты и защитить решение.
❤13🔥9⚡3👍3🤔3🎉3👎1😱1🌚1😈1😭1
Кто должен решать, к данным какого клиента обращается ИИ-агент
Модель может составить безупречный вызов инструмента и запросить договор из чужого аккаунта. Схема верна, аргумент подходит, но договор принадлежит другому клиенту. Более строгий промпт снизит риск, однако границей авторизации не станет.
Автор собрал экспериментальную Rust-библиотеку TenantInvariant. Модель передаёт только идентификатор ресурса, сервер сам находит владельца в базе и сравнивает его с аккаунтом авторизованного пользователя. Если владельцы различаются или поиск ничего не вернул, вызов блокируется.
Код и сценарные тесты охватывают поддельный идентификатор клиента и пакет ресурсов от разных владельцев. При этом библиотека не заменяет проверку разрешений и запросы с ограничением по клиенту. Для SaaS здесь полезнее самой библиотеки порядок проверок: модель предлагает ресурс, а полномочия определяет сервер.
Модель может составить безупречный вызов инструмента и запросить договор из чужого аккаунта. Схема верна, аргумент подходит, но договор принадлежит другому клиенту. Более строгий промпт снизит риск, однако границей авторизации не станет.
Автор собрал экспериментальную Rust-библиотеку TenantInvariant. Модель передаёт только идентификатор ресурса, сервер сам находит владельца в базе и сравнивает его с аккаунтом авторизованного пользователя. Если владельцы различаются или поиск ничего не вернул, вызов блокируется.
Код и сценарные тесты охватывают поддельный идентификатор клиента и пакет ресурсов от разных владельцев. При этом библиотека не заменяет проверку разрешений и запросы с ограничением по клиенту. Для SaaS здесь полезнее самой библиотеки порядок проверок: модель предлагает ресурс, а полномочия определяет сервер.
👏9❤7🤝4😢3👎2💯2😴2🎃2🎅2🆒2😘1
Forwarded from Веб-страница
Как читать HTML-реликты из эпохи браузерных войн
В старом
Другие теги защищали страницу от вмешательства сторонних программ. Skype Toolbar превращал номера телефонов в кнопки и мог ломать вёрстку, поэтому сайт отключал его отдельным метатегом. Baidu пропускала мобильные страницы через свой сервис, перестраивала макет, удаляла стили и подменяла рекламу; от этой обработки тоже можно было отказаться в разметке.
Разбор Antiquated HTML Snippets and Artefacts пригодится при ревизии унаследованных шаблонов: сначала выясните, какую интеграцию обслуживала незнакомая строка и существует ли её цель, а затем решайте, удалять ли её.
В старом
head можно встретить строки, смысл которых уже не восстановить по имени. Например, X-UA-Compatible заставлял Internet Explorer выбирать самый новый доступный режим документа, а условные комментарии показывали разную разметку отдельным версиям браузера.Другие теги защищали страницу от вмешательства сторонних программ. Skype Toolbar превращал номера телефонов в кнопки и мог ломать вёрстку, поэтому сайт отключал его отдельным метатегом. Baidu пропускала мобильные страницы через свой сервис, перестраивала макет, удаляла стили и подменяла рекламу; от этой обработки тоже можно было отказаться в разметке.
Разбор Antiquated HTML Snippets and Artefacts пригодится при ревизии унаследованных шаблонов: сначала выясните, какую интеграцию обслуживала незнакомая строка и существует ли её цель, а затем решайте, удалять ли её.
🤔7👀4🔥3🍾3👍2👌2👾2☃1❤1🍓1😘1
Как GitHub перенёс движок Copilot на Rust силами Copilot
GitHub переписал общий движок Copilot с TypeScript на Rust: вышло более 800 тысяч строк производственного кода. Большую часть написали ИИ-агенты, а 128 пул-реквестов вливали в основную ветку и выпускали постепенно.
Раньше каждое приложение через SDK запускало отдельный процесс с Node.js и V8. Это означало минимум около 100 МБ памяти и обмен данными между процессами. Версию на Rust можно встраивать в приложение.
Для больших переписываний интересна стратегия: каждый пул-реквест заменял реализацию одного компонента и оставлял прослойку, которая передавала вызовы Rust-коду. Основная ветка оставалась готовой к выпуску. В материале разобраны причины выбора Rust, компромиссы и регрессии постепенного переноса.
GitHub переписал общий движок Copilot с TypeScript на Rust: вышло более 800 тысяч строк производственного кода. Большую часть написали ИИ-агенты, а 128 пул-реквестов вливали в основную ветку и выпускали постепенно.
Раньше каждое приложение через SDK запускало отдельный процесс с Node.js и V8. Это означало минимум около 100 МБ памяти и обмен данными между процессами. Версию на Rust можно встраивать в приложение.
Для больших переписываний интересна стратегия: каждый пул-реквест заменял реализацию одного компонента и оставлял прослойку, которая передавала вызовы Rust-коду. Основная ветка оставалась готовой к выпуску. В материале разобраны причины выбора Rust, компромиссы и регрессии постепенного переноса.
🤔6🤗5✍3👎3🍾3😴3🙏2🕊2👀2🦄2😎2
Как передавать Minecraft-сервер между компьютерами игроков
Экзамены одного игрока выключили Minecraft-сервер для всей компании на неделю: мир работал только на его компьютере. В ответ появился Nomad, который позволяет запускать тот же мир у любого участника.
Проект выбирает хоста через файл
В разборе Nomad есть жизненный цикл хоста, схема защиты от одновременного запуска и ссылка на код проекта.
Экзамены одного игрока выключили Minecraft-сервер для всей компании на неделю: мир работал только на его компьютере. В ответ появился Nomad, который позволяет запускать тот же мир у любого участника.
Проект выбирает хоста через файл
lease.json в общем хранилище. Если два игрока запускают сервер одновременно, условная запись разрешает это только одному. Хост подтверждает работу каждые 20 секунд, а после сбоя право запуска переходит другому игроку, когда истекают пять минут аренды. Перед передачей Nomad загружает сохранение мира в Cloudflare R2, Git или совместимое с S3 хранилище.В разборе Nomad есть жизненный цикл хоста, схема защиты от одновременного запуска и ссылка на код проекта.
❤14👏7👍5🤷♂4🎉4🙈2💊2⚡1🫡1🦄1😘1
Почему JOIN с блокировкой строки может вернуть пустоту в PostgreSQL
Строка есть, внешний ключ заполнен, но INNER JOIN ничего не возвращает. Это возможно, когда две транзакции одновременно меняют связанную запись.
В Read Committed PostgreSQL после снятия блокировки перепроверяет условие JOIN по новой версии строки, но связанную запись не загружает заново. Условие больше не совпадает: INNER JOIN отбрасывает строку, а LEFT JOIN вернёт пустые поля.
В подробном разборе автор воспроизводит гонку и проверяет способы защиты.
Строка есть, внешний ключ заполнен, но INNER JOIN ничего не возвращает. Это возможно, когда две транзакции одновременно меняют связанную запись.
В Read Committed PostgreSQL после снятия блокировки перепроверяет условие JOIN по новой версии строки, но связанную запись не загружает заново. Условие больше не совпадает: INNER JOIN отбрасывает строку, а LEFT JOIN вернёт пустые поля.
В подробном разборе автор воспроизводит гонку и проверяет способы защиты.
🤯16❤7👌5🤔3😭3⚡2🔥2🎉2😇2☃1🕊1
Как научить небольшую языковую модель соблюдать структуру ответа
Модель на 350 млн параметров дообучили всего за 100 шагов и подняли результат в IFStruct с 22,6% до 29,7%. Этот тест проверяет, выдаёт ли модель корректный JSON или YAML по заданной схеме, а не просто правдоподобный текст.
Для обучения взяли около 500 примеров и метод группового сравнения ответов GRPO. Модель получала награду за три вещи: ответ можно разобрать программно, число полей совпадает с заданием, а результат проходит проверку по JSON Schema. В итоге даже такой короткий прогон заметно сократил разрыв с более крупными моделями.
В разборе Hugging Face есть открытый ноутбук, настройки LoRA и весь пайплайн. Обучение помещается на бесплатный GPU в Colab или Kaggle, поэтому эксперимент можно воспроизвести без собственной фермы ускорителей.
Модель на 350 млн параметров дообучили всего за 100 шагов и подняли результат в IFStruct с 22,6% до 29,7%. Этот тест проверяет, выдаёт ли модель корректный JSON или YAML по заданной схеме, а не просто правдоподобный текст.
Для обучения взяли около 500 примеров и метод группового сравнения ответов GRPO. Модель получала награду за три вещи: ответ можно разобрать программно, число полей совпадает с заданием, а результат проходит проверку по JSON Schema. В итоге даже такой короткий прогон заметно сократил разрыв с более крупными моделями.
В разборе Hugging Face есть открытый ноутбук, настройки LoRA и весь пайплайн. Обучение помещается на бесплатный GPU в Colab или Kaggle, поэтому эксперимент можно воспроизвести без собственной фермы ускорителей.
❤8🤔7🤷♀4⚡2☃2🥰2🏆1😈1😴1👻1🙉1
Как Bitwarden шифрует хранилище и при чём здесь пароль
Парольная фраза не шифрует ваши данные напрямую. Клиент получает из неё ключ и расшифровывает им случайный 64-байтный мастер-ключ. Уже тот открывает логины, пароли, URL, заметки и даже названия записей. Сервер хранит только зашифрованные данные.
Мастер-ключ делится пополам: первые 32 байта служат ключом шифрования AES, вторые создают HMAC-подпись для проверки целостности. Если подпись не совпала, запись считают повреждённой или изменённой и не расшифровывают. Чтобы заблокировать хранилище, клиент удаляет расшифрованный мастер-ключ.
Держите разбор How Bitwarden Encrypts and Decrypts Secrets: автор восстановил детали по исходному коду Bitwarden и Vaultwarden и приложил рабочий скрипт на Python. Он пригодится, если нужно читать резервную копию базы Vaultwarden или собирать собственный клиент.
Парольная фраза не шифрует ваши данные напрямую. Клиент получает из неё ключ и расшифровывает им случайный 64-байтный мастер-ключ. Уже тот открывает логины, пароли, URL, заметки и даже названия записей. Сервер хранит только зашифрованные данные.
Мастер-ключ делится пополам: первые 32 байта служат ключом шифрования AES, вторые создают HMAC-подпись для проверки целостности. Если подпись не совпала, запись считают повреждённой или изменённой и не расшифровывают. Чтобы заблокировать хранилище, клиент удаляет расшифрованный мастер-ключ.
Держите разбор How Bitwarden Encrypts and Decrypts Secrets: автор восстановил детали по исходному коду Bitwarden и Vaultwarden и приложил рабочий скрипт на Python. Он пригодится, если нужно читать резервную копию базы Vaultwarden или собирать собственный клиент.
👍16🤷♀4🤩3🎄3😢2🏆2💔2😴2😭2😇1💊1
Сколько стоит превратить enum в строку через рефлексию C++26
Чистый код без макросов оказался не бесплатным: в GCC 16 подключение
Предкомпилированный заголовок сократил время до 81 мс, а модули GCC подняли его до 403 мс.
В разборе cost of enum-to-string есть код и замеры для enum от 4 до 1024 значений. Цифры относятся к текущей реализации GCC 16 на одном компьютере: для экспериментов с рефлексией сначала подключите предкомпилированный заголовок, а модули проверьте отдельным замером.
Чистый код без макросов оказался не бесплатным: в GCC 16 подключение
<meta> заняло около 181 мс на единицу трансляции. Для enum из четырёх значений компиляция заняла 187 мс против 27 мс у X-macro с const char*.Предкомпилированный заголовок сократил время до 81 мс, а модули GCC подняли его до 403 мс.
В разборе cost of enum-to-string есть код и замеры для enum от 4 до 1024 значений. Цифры относятся к текущей реализации GCC 16 на одном компьютере: для экспериментов с рефлексией сначала подключите предкомпилированный заголовок, а модули проверьте отдельным замером.
👍8❤6🤣6🏆6🤪3👎2🙈2🍌1😐1😘1🤷1
Зачем Cloudflare Workers переписали реестр модулей под правила Node.js
Старый реестр разбирал импорты как пути в файловой системе и заранее компилировал всю сборку для каждой изолированной копии Worker в V8. Поэтому
Новый реестр считает спецификаторы настоящими URL и компилирует модуль только при первом импорте. Есть занятное следствие:
Механику уже можно проверить с флагом
Старый реестр разбирал импорты как пути в файловой системе и заранее компилировал всю сборку для каждой изолированной копии Worker в V8. Поэтому
import.meta.resolve() не работал, а один и тот же исходный код мог компилироваться несколько раз и храниться в памяти в нескольких копиях.Новый реестр считает спецификаторы настоящими URL и компилирует модуль только при первом импорте. Есть занятное следствие:
counter.js?a и counter.js?b получат отдельное состояние, хотя загрузят один исходный файл. Встроенный модуль Node.js, напротив, останется одним экземпляром независимо от способа обращения к нему.Механику уже можно проверить с флагом
new_module_registry. В инженерном разборе Cloudflare показаны правила для ESM, CommonJS, WebAssembly, атрибутов импорта и API import.meta.❤7💔4🙉4🏆3🌚2🍾2🙏1👌1🤣1👻1🤪1
Как фиксированный объём работы помогает пережить пиковую нагрузку
Память ещё есть, значит можно принять ещё одну биржевую заявку? Такой подход способен закончиться тем, что ядро завершит весь движок вместе с уже принятыми заявками.
Автор предлагает при запуске выделить массив под заданный максимум, а всё сверх лимита отклонять. Свободные позиции обрабатываются как нейтральные заявки: вычислений всегда одинаково много, а последовательный обход проще оптимизировать.
В разборе статического выделения памяти показаны и границы подхода.
Память ещё есть, значит можно принять ещё одну биржевую заявку? Такой подход способен закончиться тем, что ядро завершит весь движок вместе с уже принятыми заявками.
Автор предлагает при запуске выделить массив под заданный максимум, а всё сверх лимита отклонять. Свободные позиции обрабатываются как нейтральные заявки: вычислений всегда одинаково много, а последовательный обход проще оптимизировать.
В разборе статического выделения памяти показаны и границы подхода.
matklad.github.io
Static Allocation, Constant Work
In reply to this email:
🎉4🤣3❤1👍1👎1🔥1🤩1😈1😴1🤓1😘1
Нетипичные оптимизации PostgreSQL для отчётов и индексов
Обычный индекс по
Другой приём пригодится для аналитических запросов. Условие
В разборе нетипичных оптимизаций PostgreSQL есть SQL-запросы, планы выполнения и границы применимости каждого приёма.
Обычный индекс по
sold_at ускорил отчёт с 627 до 187 мс, но занял 214 МБ. При этом ежедневному отчёту не нужна точность времени до миллисекунд. Автор проиндексировал только дату и получил индекс на 66 МБ: повторяющихся значений стало больше, поэтому PostgreSQL смог сжать их дедупликацией.Другой приём пригодится для аналитических запросов. Условие
plan = 'Pro' против ограничения с вариантами free и pro заставило базу проверить 100 тысяч строк. После включения constraint_exclusion PostgreSQL сопоставил условие с ограничением и вовсе пропустил сканирование. Для простых запросов режим добавляет расходы на планирование, поэтому автор предлагает включать его точечно в системах отчётности.В разборе нетипичных оптимизаций PostgreSQL есть SQL-запросы, планы выполнения и границы применимости каждого приёма.
👍5❤2😁2😢2✍1❤🔥1🤩1😇1🤝1🎄1🙊1