https://www.datadoghq.com/blog/engineering/go-swiss-tables/
Nayef Ghattas из Datadog рассказывает про неожиданный сюрприз после обновления на Go 1.24. Это продолжение их истории про memory regression, но с хорошим концом.
TL;DR: после обновления на Go 1.24, словили баг с утечкой памяти, но при этом в высоконагруженных средах потребление памяти внезапно СОКРАТИЛОСЬ на сотни мегабайт. Виновник — новая реализация map через Swiss Tables.
Суть проблемы:
В Datadog используют огромную мапу
shardRoutingCache (3.5 миллиона элементов в высоконагруженных окружениях) для роутинга данных по шардам. После обновления на Go 1.24 эта мапа стала занимать ~500 MiB меньше в памяти.Старая реализация (Go 1.23):
- Hash table с бакетами, по 8 слотов в каждом
- Load factor максимум 13/16 (81.25%)
- При росте мапы старые бакеты висят в памяти, пока не скопируются инкрементально
- Overflow buckets — цепочки дополнительных бакетов при переполнении основных
Итог: 726 MiB для 3.5M элементов
Новая реализация (Go 1.24) — Swiss Tables:
- Данные хранятся в группах по 8 слотов с control word (8 байт)
- Control word — это 8 байт метаданных, каждый байт хранит последние 7 бит хеша ключа
- SIMD-оптимизация: сравнение хеша со всеми 8 слотами за одну CPU-инструкцию
- Load factor теперь 7/8 (87.5%) — меньше пустого места
- Нет overflow buckets — просто идём в следующую группу
- Extendible hashing: мапа делится на независимые таблицы по 128 групп максимум
Итог: 217 MiB для тех же 3.5M элементов
Математика:
Go 1.23: ~1.5M бакетов × 464 байта = 726 MiB
Go 1.24: ~3900 таблиц × 58 KiB = 217 MiB
Экономия: ~509 MiB live heap (≈1 GiB RSS с учётом GOGC)
Бонусный раунд оптимизации:
Авторы заметили, что в структуре Response хранятся неиспользуемые поля: пустая строка RoutingKey и nil-указатель LastModified. Плюс ShardType был int (8 байт) для enum из 3 значений.
Что сделали:
- ShardType: int → uint8 (1 байт вместо 8)
- Создали отдельный тип cachedResponse без лишних полей
- Key-value пара: 56 байт → 24 байта
Результат: ещё 250 MiB RSS экономии на под, 200 TiB памяти сэкономили по всему флоту.
————
Отличная статья, показывающая насколько важны детали в Go. Swiss Tables — это не просто "новая реализация map", это значимая экономия ресурсов в проде.
Из забавного: в low-traffic окружениях экономия была всего ~28 MiB, что не покрыло регрессию из mallocgc. Зато в high-traffic всё окупилось с лихвой.
P.S. SIMD для map пока только на amd64, для arm64 работа в процессе. Но даже без SIMD Swiss Tables экономят память за счёт более высокого load factor и отсутствия переполнения бакетов.
#article #go1_24 #performance #memory #english
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤15👍11🔥10🤔1
Бесплатные программы «Менеджер:101» и «Директор:101» от Стратоплана
Менеджер или директор — отдельные роли, которые предполагают соответствующие знания, навыки, привычки и образ мыслей. И мы хотим помочь вам сделать первый шаг в сторону транзишна к этим ролям, потому задумали наши проекты абсолютно бесплатными.
Если вы — менеджер, ключевой вызов — переключиться из майндсета исполнителя в майндсет руководителя. Для этого нужно понять, из чего на самом деле состоит роль управленца, каковы его фокусы и как действовать в непростых управленческих ситуациях.
Если вы становитесь директором, перед вами новая реальность: теперь никто не скажет, как правильно — решения принимаете вы. Вам нужно не просто реагировать на проблемы, а стратегически смотреть в будущее компании.
И совсем этим мы будем разбираться по ссылкам ниже:
Пройти регистрацию на Менеджер:101
Пройти регистрацию на Директор:101
🗓 Даты и время:
Менеджер:101— 17-18 ноября, с 16 по 19 GMT+3
Директор:101— 19-20 ноября, с 16 по 19 GMT+3
На выходе:
✔️ инструменты, которые можно забрать в работу завтра
✔️ сертификат, который можно добавить себе в Linkedin
✔️ материалы от лучшей Школы для руководителей в 2024 по результатам исследования Devcrowd
Присоединяйтесь к нашим открытым проектам, как это сделали уже 14843 человека с начала этого года!
#промо #текст_прислан
Менеджер или директор — отдельные роли, которые предполагают соответствующие знания, навыки, привычки и образ мыслей. И мы хотим помочь вам сделать первый шаг в сторону транзишна к этим ролям, потому задумали наши проекты абсолютно бесплатными.
Если вы — менеджер, ключевой вызов — переключиться из майндсета исполнителя в майндсет руководителя. Для этого нужно понять, из чего на самом деле состоит роль управленца, каковы его фокусы и как действовать в непростых управленческих ситуациях.
Если вы становитесь директором, перед вами новая реальность: теперь никто не скажет, как правильно — решения принимаете вы. Вам нужно не просто реагировать на проблемы, а стратегически смотреть в будущее компании.
И совсем этим мы будем разбираться по ссылкам ниже:
Пройти регистрацию на Менеджер:101
Пройти регистрацию на Директор:101
🗓 Даты и время:
Менеджер:101— 17-18 ноября, с 16 по 19 GMT+3
Директор:101— 19-20 ноября, с 16 по 19 GMT+3
На выходе:
✔️ инструменты, которые можно забрать в работу завтра
✔️ сертификат, который можно добавить себе в Linkedin
✔️ материалы от лучшей Школы для руководителей в 2024 по результатам исследования Devcrowd
Присоединяйтесь к нашим открытым проектам, как это сделали уже 14843 человека с начала этого года!
#промо #текст_прислан
👍15🔥9❤8🤔1