DeFi

Как мы обнаружили и решили проблему с памятью в Go 1.24: подробный разбор

DeFi
How we tracked down a Go 1.24 memory regression

Подробный рассказ о процессе выявления и устранения регрессии в управлении памятью в Go 1. 24.

В начале 2025 года команда Datadog приступила к внедрению новой версии языка программирования Go 1.24. Главной анонсированной инновацией стало внедрение Swiss Tables — новых высокоэффективных хеш-таблиц, способных снизить нагрузку на процессор и объем потребляемой памяти. Ожидания оправдывались техническим прогрессом и улучшенной производительностью, но вскоре после начала развертывания обновления в крупных службах обработки данных команды столкнулись с неожиданной проблемой — резким увеличением использования оперативной памяти примерно на 20%. Эта ситуация стала поводом для детального расследования причин и поиска решения, ибо Go должен был, наоборот, улучшить ситуацию с расходами ресурсов.

Начало поисков причины регрессии памяти связано с тщательным анализом изменений в Go 1.24. Первым шагом стало исключение возможности влияния основных новых функций, таких как Swiss Tables и обновленного механизма работы с мьютексами (spin bit mutex). Для этого исследователи собрали специальные сборки с отключенными экспериментальными функциями. Однако эти эксперименты не привели к снижению потребления памяти, что указывало на то, что корень проблемы лежит в другом месте.

Следующий этап включал глубокий анализ метрик Go runtime — инструментов, предоставляющих данные о состоянии управления памятью интерпретируемого процесса: распределение кучи, сборка мусора и другие параметры. Здесь обнаружилось парадоксальное несоответствие — внутренняя статистика Go показывала стабильное использование памяти, тогда как системные метрики, особенно измеряющие RSS (Resident Set Size, объем памяти, реально находящейся в физической оперативной памяти), фиксировали существенный рост. RSS отражает реальную загруженность RAM, в отличие от виртуальной адресной памяти, количество которой сложнее измерить и которая включает неиспользуемые или отложенные к выделению страницы. Чтобы понять природу расхождения, инженеры перешли к исследованию через инструменты Linux, такие как /proc/[pid]/smaps, которые предоставляют детальную разбивку по виртуальным и реальным страницам памяти для каждого процесса. Здесь было выявлено, что именно область кучи Go, ответственной за размещение динамических объектов, стала причиной аномального роста использования физической памяти.

Сравнение данных между Go 1.23 и Go 1.24 показало, что в новой версии почти вся выделенная виртуальная память кучи оказалась закоммиченной (помещённой в оперативную память), в то время как в предыдущей версии существенная часть виртуальной памяти оставалась отложенной и не занимала реальной RAM. Это наблюдение указывало, что изменился механизм управления или инициализации выделенной памяти. Изучая changelog Go 1.

24, специалисты обратили внимание на крупный рефакторинг функции mallocgc — ключевого аллокатора памяти в runtime Go. Эта функция отвечает за выделение, инициализацию и подготовку памяти для использования программой, что напрямую влияет на производительность и расход ресурсов. Чтобы подтвердить догадки, команда Datadog обратилась к сообществу Go, используя каналы коммуникации разработчиков и экспертов, таких как Gophers Slack. Один из ведущих специалистов по сбору мусора и менеджменту памяти в Go, PJ Malloy (thepudds), помог провести более детальный анализ с применением heapbench — инструмента для проведения бенчмарков и тестирования поведения выделения памяти. Анализ heap profiles выявил, что основная часть памяти уходит на буферизованные каналы и карты (maps), причем ухудшение влияло особенно на большие аллокации свыше 32 Кбайт, содержащие указатели на другие объекты.

В результате экспериментов было зафиксировано, что именно такие крупные блоки памяти в Go 1.24 проявляют двукратно увеличенный RSS, тогда как более мелкие или не содержащие указатели блоки поведенчески сохранялись без изменений. С помощью git bisect удалось локализовать конкретный коммит, в котором в рамках рефакторинга mallocgc была случайно потеряна оптимизация, позволявшая не затирать память нулями в случаях, когда ОС уже предоставляет гарантию нулевой инициализации страниц. Это привело к избыточной инициализации больших объектов с указателями, из-за чего страницы виртуальной памяти вынужденно коммитились в реальную RAM, что объясняло рост RSS без изменений в логировании на уровне Go runtime. Исправление этой ошибки вернуло прежнее поведение, сохранив при этом гарантии безопасности при сборке мусора.

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

В средах с низкой нагрузкой использование памяти после обновления стабилизировалось и стало соответствовать внутренним метрикам Go. Интересным наблюдением оказалось иное поведение в высоконагруженных окружениях, где обе метрики — виртуальная и резидентная память — значительно снизились, что связано с оптимизацией Swiss Tables для больших объемов данных в памяти. Этот опыт стал ярким примером важности комплексного мониторинга, тесного взаимодействия с сообществом разработчиков и внимательного анализа поведения системных и прикладных инструментов. Разработка и отладка таких технологий, как Go, которые лежат в основе множества современных сервисов, часто требует умения выявлять тонкие технические детали и нетривиальные взаимодействия между уровнем языка, системой и оборудованием. Благодаря открытому сотрудничеству и совместному поиску решений удается не только обеспечивать высокую производительность ПО, но и поддерживать устойчивость инфраструктуры, обеспечивая пользователям и бизнесу надежность и эффективное использование ресурсов.

Предстоящие публикации продолжат рассказывать, как Swiss Tables в конечном итоге помогли сэкономить сотни гигабайт памяти за счет оптимизации структуры данных и внутренних алгоритмов, приводя к заметным улучшениям скорости и масштаба работы сервисов Datadog.

Автоматическая торговля на криптовалютных биржах Покупайте и продавайте криптовалюты по лучшим курсам Privatejetfinder.com (RU)

Далее
Ad Blockers for Real Life Are Now a Thing, Thanks to AR Glasses
Понедельник, 27 Октябрь 2025 Блокировщики рекламы в реальной жизни: новый уровень комфорта с AR-очками

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

Tech Promised Everything. Did it deliver? [video]
Понедельник, 27 Октябрь 2025 Технологии и обещанное будущее: оправдались ли ожидания?

Разбор влияния современных технологий на нашу жизнь и анализ того, насколько технологические новшества изменили мир в соответствии с первоначальными обещаниями разработчиков и общественных ожиданий.

Google Is Back at It
Понедельник, 27 Октябрь 2025 Google Возвращается в Игра: Как Технологический Гигант Продолжает Влиять на Цифровой Мир

Обзор стратегий и нововведений Google, которые подтверждают лидерство компании на рынке технологий и цифровых сервисов. Анализ ключевых направлений развития, влияние на пользователей и бизнес, а также перспективы будущих инноваций.

Achieving SOTA LongMemEval scores (80%) with RAG alone
Понедельник, 27 Октябрь 2025 Достижение рекордных результатов на LongMemEval: как RAG обеспечивает 80% точности в долгосрочной памяти агентов

Оригинальный опыт компании Mastra в изучении и совершенствовании системы долговременной памяти агентов с помощью Retrieval-Augmented Generation (RAG) и как правильные настройки и инновационные решения помогли достичь 80% точности на сложном бенчмарке LongMemEval.

Ask HN: Local Speech Transcription SwiftUI?
Понедельник, 27 Октябрь 2025 Локальная транскрипция речи в SwiftUI: эффективные решения и практические рекомендации

Погружение в возможности и методы локальной транскрипции речи с использованием SwiftUI, включая обзор популярных инструментов и советы по улучшению качества распознавания на устройствах Apple.

Lizard: An Efficient Linearization Framework for Large Language Models
Понедельник, 27 Октябрь 2025 Lizard: Эффективный Фреймворк Линеаризации для Больших Языковых М моделей

Обзор инновационной технологии Lizard, которая решает проблему вычислительных ограничений в больших языковых моделях, значительно ускоряя обработку и снижая требования к памяти при сохранении качества моделей.

Ask HN: What Pocket alternatives did you move in to?
Понедельник, 27 Октябрь 2025 Лучшие альтернативы Pocket после его закрытия: опыт пользователей и перспективы развития

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