В этом материале
Утечку ищут по невосстанавливающемуся состоянию после повторных циклов, отделяя её от прогрева, пулов соединений и кеша.
Сформулировать проверяемую гипотезу
Отмена streaming-запроса может завершить чтение клиента раньше, чем движок освободит работу. Если этот путь содержит ошибку, после повторных отмен остаются активные запросы, соединения или накопленные данные. Soak-тест проверяет конкретную гипотезу о таком остаточном состоянии, а не пытается бесконечно перегружать сервер. Перед опытом фиксируют версии, модель, ограничения вывода и известные фоновые задачи. Нужен спокойный базовый интервал после прогрева: загрузка весов и первоначальное создание пулов памяти сами по себе не являются утечкой. Также записывают, какие ресурсы должны вернуться к исходному уровню, а какие могут законно сохраняться в кеше.
Чередовать завершение и отмену
Корпус содержит короткие успешно завершённые генерации и отмены в определённых фазах: до первого содержимого и после его появления. AbortController позволяет отменять fetch и потребление тела ответа, однако это не гарантирует немедленную остановку удалённого inference. Для каждой попытки сохраняют фазу отмены, подтверждённые серверные события и итоговое состояние. Циклы ограничивают общим числом запросов, временем и объёмом вывода. Не следует отправлять новый цикл, пока предыдущий уже нарушил установленный порог активной работы. Иначе диагностическая проверка превращается в неконтролируемый источник очереди и затрудняет объяснение первоначального дефекта.
Измерять восстановление после паузы
После каждой группы запросов вводят одинаковое окно наблюдения без новой работы. Сравнивают in-flight, длину очереди, открытые соединения, память процесса и доступные метрики движка. Документация метрик vLLM помогает выбрать наблюдения, но конкретные имена необходимо сверить с установленной версией. График должен показывать границы циклов и пауз. Стабильная высокая память не равна утечке: allocator может удерживать выделенные блоки. Более сильный сигнал — монотонный остаточный рост вместе с невозвращающимся числом запросов или объектов после сопоставимых фаз восстановления. Даже этот сигнал сначала требует исключить постороннюю нагрузку и ожидаемые изменения кеша.
Разделить клиент и сервер
Рост памяти клиента может происходить из-за невычитанных chunks или накопленного диагностического журнала, а не внутри движка. Концепции Streams API объясняют очереди и backpressure; тестовый читатель должен явно завершать или отменять потребление. Сопоставляют клиентские дескрипторы с серверными записями, не предполагая, что их количество обязано совпадать из-за pooling. Практики Prometheus помогают наблюдать работу и завершения отдельно. Диагностическая развилка проста: если сервер восстановился, а тестовый процесс продолжает расти, исследуют обвязку. Если активная серверная работа остаётся после подтверждённой отмены, проверяют цепочку передачи cancellation и освобождения ресурсов.
Сохранить границы результата
Отчёт содержит число выполненных циклов, точки отмены, интервалы восстановления, остановки и графики ресурсов с базовым уровнем. Полезны карта мониторинга GPU и планирование inference capacity. Отсутствие роста в ограниченном опыте подтверждает только исследованные пути и продолжительность. Оно не исключает редкую гонку, утечку другого endpoint или накопление при иной длине контекста. Подозрение проверяют повторным контролируемым запуском и профилированием, а не бесконечным продлением теста. Обязательный предел эксперимента сохраняет воспроизводимость и позволяет объяснить, почему работа остановлена именно в выбранной точке.