Skip to Content
ДизайнПрофилировщик запуска сессии

Профилировщик запуска сессии

Краткое описание

Это изменение добавляет внутренний опциональный профилировщик для GeminiClient.startChat(), чтобы в рамках последующих работ по #6312 можно было выявить оставшиеся «узкие места» инициализации для каждой сессии перед выбором оптимизации.

Оно не изменяет поведение сессии, публичные поля протокола, поведение SDK, флаги CLI, схему конфигурации, схему телеметрии или семантику профилировщика запуска.

Формат измерений

Профилировщик включается только при установке QWEN_CODE_PROFILE_SESSION_START=1.

При включении ядро записывает JSONL-записи в директорию Storage.getRuntimeBaseDir()/session-start-perf/. Имена ежедневных JSONL-файлов формируются на основе UTC-даты из временной метки записи. Каждая запись включает временную метку, SessionStartSource, флаг успеха, общую длительность, длительности этапов с учетом лимитов и небольшие агрегированные счетчики, такие как длина истории и количество отрендеренных снимков.

Измеряемые этапы следуют существующей последовательности startChat(): прогрев реестра инструментов, сканирование раскрытия отложенных инструментов при возобновлении, настройка отложенных напоминаний, построение начальной истории чата, инициализация дедупликации напоминаний навыков, инициализация дедупликации напоминаний агента, формирование системной инструкции, создание GeminiChat, восстановление потерянных вызовов инструментов, хук SessionStart, опциональное применение контекста SessionStart и setTools().

Границы безопасности

Вывод намеренно исключает ID сессий, промпты, ответы модели, вывод хуков, имена инструментов, пути к файлам и рабочие директории. Имена этапов представляют собой статические строки, определенные в коде.

Все операции записи профилировщика выполняются по принципу “best-effort”. Ошибки файловой системы игнорируются, чтобы профилирование не могло прервать или замедлить сессию из-за обработки ошибок.

Модуль записи JSONL использует строгие права доступа и флаг O_NOFOLLOW для файла профиля. Замена родительской директории также выполняется по принципу “best-effort”, поскольку Node не предоставляет переносимого механизма добавления данных относительно файлового дескриптора; директория среды выполнения рассматривается как диагностическое хранилище в рамках одного пользователя, а не как граница защиты от локального злоумышленника с теми же правами.

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

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

Задачи вне скоупа

Это изменение не оптимизирует GeminiClient.initialize() или startChat().

Оно не реализует кеширование расширений (Часть B), ленивую загрузку тела навыков (Часть C), кеширование снимков команд или какие-либо изменения протокола демона.

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

Last updated on