Перейти к содержанию

OpenAI

Новый бэкенд Git в OpenAI ускорил пуши почти в 5 раз

8 мин чтения

Наш ИИ-аналитик сам проверил эту историю: запускал, считал, сверял с оригиналами. Что мы проверили

Текст написан ИИ-моделью по источникам, на которые ведут ссылки, и сверен с ними второй моделью. Как мы работаем

Всё о теме: Агенты для программирования →
Изображение: openai.com

OpenAI перевела всю разработку в своём монорепозитории на Pando, собственный бэкенд для Git, и медианная задержка пуша после переезда сократилась почти в 5 раз, говорится в посте в блоге OpenAI от 2 ноября. Сам Pando остаётся внутренним, а исправления клиента Git для загрузки пакетов, которые под него понадобились, уже есть в обычном Git 2.56.0 от 27 сентября. Параллельная загрузка пакетов и функция explicit haves пока работают только в сборке Git от OpenAI.

Пост написали Аарон Фрил, Тейлор Блау и Тед Найман. С конца 2025 года старая система не успевала за нагрузкой: fetch и push шли медленно, слияния срывались, надёжность временами падала ниже 90%. Авторы спрашивали себя: «Упёрлись ли мы в предел самого Git или в то, как мы обслуживаем монорепозиторий?» Нагрузку создаёт Codex: у одного инженера сразу несколько изменений ждут CI, и каждый пуш запускает несколько задач, которые скачивают один и тот же коммит. Как пишет The New Stack, в OpenAI ожидают, что к концу года квартальное число коммитов в монорепозиторий вырастет более чем на 2 400% против первого квартала 2024 года.

Что можно взять снаружи

Открывать Pando OpenAI не собирается: компания только изучает, как поделиться технологией со своими пользователями, и присматривается к внутренним задачам, где с одним Git-репозиторием работает много агентов. Снаружи доступны доработки клиента. Часть из них уже в основном Git, остальные лежат в публичной сборке OpenAI, которую компания раздаёт на машины разработчиков и встраивает в десктопное приложение ChatGPT. Ход работы OpenAI ведёт в публичном трекере патчей.

В основной Git ушли исправления, без которых Pando не работал бы надёжно: одновременные загрузки пакетов, очистка после прерванной передачи, повторная загрузка уже скачанного пакета, проверки при приёме готового пакета на fetch. Туда же попала трассировка загрузок по packfile-uri и счётчик байтов при сборке пакета, по ним видно, на что уходит время медленного fetch: на генерацию пакетов или на передачу.

Только в сборке OpenAI клиент качает и индексирует независимые пакеты параллельно. Там же живёт explicit haves: сервер объявляет текущую вершину ветки отдельно от истории, которую пушащий клиент может не класть в пакет. На Pando с этим работает --force-with-lease: клиент проверяет, что feature-ветка не сдвинулась, и собирает пакет только относительно trunk.

Где пуши ждали друг друга

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

Pando координирует каждую ветку отдельно. Спорят клиенты только за указатель ветки, его защищает атомарная операция в духе compare-and-swap, и конфликт возникает, лишь когда двое одновременно пушат в одну ветку. Входящий пакет сервер проверяет на лету, пока стримит его в объектное хранилище, ничего не распаковывая в локальный репозиторий. В хранилище метаданных он записывает новую вершину ветки, ссылку на пакет и его зависимости, и на пуш любого размера уходит постоянное число операций с метаданными.

Платят за это согласованностью. Читатель ветки получает историю того, кто её записал, но клиент, который читает несколько веток, не может считать, что видит их в один момент времени: в примере OpenAI два клиента во время полного клона видят ветки foo и bar в противоположных версиях. В компании уверены, что пользователям и агентам глобальный порядок обновлений не нужен, они опираются на порядок изменений одной ветки.

Обычный Git-сервер на каждый fetch собирает отдельный packfile (формат, в котором Git пакует сжатые объекты) под конкретного клиента. Pando раздаёт пакеты, полученные при пушах: по тому, что у клиента есть и что он хочет, сервер подбирает нужные и отдаёт ссылки на них через packfile-uri, функцию протокола Git для загрузки пакетов отдельно от ответа. Клиент при этом может скачать часть объектов, которые у него уже есть, зато сервер почти ничего не вычисляет. Пакеты раздаёт сервис Express с региональными кэшами, попаданий в кэш больше 99%, и на стандартных облачных виртуальных машинах clone и fetch упираются в канал 10 Гбит/с.

Функция packfile-uri не новая: мы нашли в рассылке Git первую серию патчей Джонатана Тана из Google, jt/fetch-cdn-offload, от 12 марта 2019 года, а дизайн-документ влит в основную ветку 25 июня 2020 года.

Чтобы пакет годился другим клиентам, при пуше новой feature-ветки Pando по умолчанию показывает клиенту только trunk. Полный список веток при их миллионах сам по себе может весить больше 100 МиБ. Цена выбора в том, что при повторных пушах в одну ветку или при ветке поверх другой ветки клиент заново шлёт всё, чего нет в trunk. В монорепозитории OpenAI медианный такой пакет меньше 20 КиБ, 99-й перцентиль меньше 3 МиБ.

Без уплотнения клиенту пришлось бы каждый день качать десятки тысяч мелких пакетов, чтобы догнать trunk. Фоновые воркеры склеивают их в уровни покрупнее, по образцу LSM-деревьев, сейчас до L4. Уровни заодно служат индексом, и набор пакетов для клиента подбирается за логарифмическое время. Удаления нет ни на одном уровне, раздаются пакеты со всех.

Петабайт в сутки

Все показатели в посте - замеры самой OpenAI. В конце поста ускорение медианного пуша дано как снижение задержки почти на 80%, что совпадает с «почти в 5 раз». Почти петабайт данных Git в сутки Pando, по словам компании, отдаёт на горстке процессорных ядер, а за один час выдал больше 57 ТБ пакетов, из них больше 99% байтов из локального дискового кэша. По нашему расчёту, такой час соответствует устойчивым 126,7 Гбит/с, а за целые сутки в таком темпе вышло бы 1,37 ПБ: 57 ТБ описывают пик, примерно в 1,4 раза выше заявленного среднего.

Сравнение с трёхфазным коммитом и журналом сделано на симуляции OpenAI: 1 000 клиентов, каждый пушит в свою ветку, железо от массового до премиального, причём для трёхфазного коммита согласованность на уровне всего репозитория в ней ослаблена. У трёхфазного коммита под нагрузкой там растёт задержка записи, у журнала - задержка чтения. Pando, утверждает компания, и в симуляции, и на реальном монорепозитории держит многие тысячи одновременно пушащих клиентов без потери производительности.

Написан Pando на Rust за 10 недель от старта до продакшена: ядро спроектировал один инженер, реализовывали команды агентов Codex, развёртывали несколько человек. Продакшен-трафик он обслуживает с апреля. Агенты на GPT-6 Astra формализовали на Lean и TLA+ «теорию Pando», по которой искали и исправляли ошибки реализации. Сначала Pando встал прокси на чтение и запись перед старой системой, трафик на него переводили без простоя, а клиентов переключали поэтапно через внутреннюю обёртку вокруг Git CLI.

Похожие проблемы, по оценке The New Stack, сейчас у многих компаний и Git-хостингов. GitHub посвятил большую часть недавнего кейноута Universe скорости и надёжности инфраструктуры, стартап Entire бывшего CEO GitHub Томаса Домке и проект Origin от Cursor строятся на Git, а Anthropic начала с нуля, с новым клиентом и архитектурой. Свой Scion, напоминает издание, Anthropic тоже выпускать не планирует.

Авторский разбор

Что мы проверили

3 ноября мы сверили доработки из поста с историей основного репозитория Git, архивом его рассылки, публичной сборкой OpenAI и её трекером патчей.

Как мы проверяем истории

Слова OpenAI о том, что часть исправлений уже в upstream, подтвердились: исправления загрузки по packfile-uri вышли в обычном релизе Git. Двух функций сборки, параллельной загрузки пакетов и explicit haves, в основном Git нет: первая зависит от изменения протокола, снятого с рассмотрения, вторую в рассылку проекта не отправляли. Сейчас их даёт только сборка OpenAI.

  • Исправления загрузки, среди них защита от одновременной дозаписи в частично скачанный пакет, приём HTTP 416 для уже докачанных пакетов и трассировка загрузок по packfile-uri, вошли в Git 2.56.0 от 27 сентября. Семь из восьми коммитов написал Тед Найман 26 июля, счётчик байтов - Аарон Фрил 19 августа.
  • Параллельная загрузка в сборке OpenAI задаётся настройкой fetch.packfileUriJobs: по умолчанию 1, а значения больше работают, только если сервер объявляет обещание no-ref-delta и клиент его запрашивает. Серия tb/send-pack-no-ref-delta в начале августа лежала на ревью в ветке seen, но в августовском выпуске What's cooking помечена «Retracted for now», и трекер OpenAI пишет «retracted upstream». По нашей оценке, параллельная загрузка не попадёт в основной Git, пока это изменение не предложат заново.
  • Ветка codex несёт 92 коммита поверх upstream, столько же показывает трекер; 69 из них написал Тейлор Блау, 12 Фрил. Основа сборки - снимок основной ветки Git от 7 сентября, ещё до 2.56, примерно на два месяца старше master на 1 ноября. Совпадения с upstream мы искали по заголовкам коммитов, переименованные патчи так можно пропустить.
  • explicit haves в сборке - два коммита, Блау от 14 сентября и Фрила от 17 сентября. Поиск по архиву рассылки Git на lore.kernel.org на 3 ноября не дал результатов, а в трекере функция числится только в разделе «In our build», вне списка из 50 патчей для upstream.

Anthropic

Рост выручки Anthropic замедлился с 144% до 47% за квартал

Anthropic снова ушла в операционный убыток: 567 миллионов долларов в третьем квартале после прибыли 974 миллиона кварталом раньше. Главную причину проспект называет прямо, это мощности по краткосрочным контрактам, которые стоят значительно дороже многолетних. Облачные мощности вы берёте по требованию или бронируете надолго?

Пока никто не написал. Будьте первым.

Присоединяйтесь к разговору

Войдите, чтобы оставить комментарий. Он появится после модерации.