Рост памяти во время длительного теста не означает автоматически утечку. Сопоставьте график памяти процесса с объёмом живых объектов, очередью работы и поведением после снижения нагрузки. Первое полезное действие — собрать эти наблюдения на одной временной шкале, не перезапуская процесс сразу после теста.
Длительный запуск проводите только на согласованном стенде с ограничениями по нагрузке, памяти и времени. Исключите реальные платежи, рассылки и клиентские данные. Если процесс приближается к согласованной границе ресурсов или сервис теряет работоспособность, остановите генератор по заранее утверждённому правилу; не доводите систему до отказа ради красивого графика.
Одна линия памяти скрывает разные ситуации
| Наблюдение | Возможное объяснение | Что сравнить |
|---|---|---|
| Рост в начале, затем плато | Прогрев или ограниченный кэш | Повтор при тех же условиях |
| Рост вместе с очередью | Работа приходит быстрее обработки | Число заданий и скорость завершения |
| Рост живых объектов после циклов | Удержание ненужных данных | Профили объектов и связи |
| Память процесса не снижается | Резервирование среды выполнения | Живые объекты отдельно от процесса |
Это гипотезы, а не готовые выводы. Название метрики должно объяснять, что измерено: весь процесс, контейнер или куча среды выполнения. Разные инструменты могут показывать разные части потребления. Даже после освобождения объектов процесс не обязан немедленно вернуть весь резерв операционной системе. Не сравнивайте несовместимые метрики как одну величину.
Длительность нужна для наблюдения тренда
В документации Grafana k6 soak-тест описан как длительная проверка при устойчивой нагрузке, полезная для обнаружения постепенного ухудшения и проблем памяти. Источник проверен 11 октября 2026 года. Длительность и интенсивность для конкретного проекта определяют по его рабочему профилю, а не копируют из чужого примера.
Условная запись наблюдений:
time | process_memory | live_objects | queue_depth
разогрев | <значение> | <значение> | <значение>
плато нагрузки | <значение> | <значение> | <значение>
после остановки | <значение> | <значение> | <значение>Сохраните версию приложения, профиль запросов, набор данных и параметры процесса. Разделите разогрев и стабильный участок. Если каждый запрос добавляет новый уникальный ключ кэша, тест исследует и рост кардинальности, а не только число пользователей. Если нагрузочный генератор сам упирается в ресурсы, график приложения больше не соответствует задуманному потоку.
Ищем объекты, которые пережили свою работу
- Выбрать повторяющееся действие на искусственных данных.
- Снять согласованные диагностические наблюдения до серии.
- Повторить действие при контролируемом потоке.
- Дать работе завершиться и сравнить состав удерживаемых объектов.
- Проверить гипотезу на отдельном повторном запуске.
Профиль памяти может содержать фрагменты запросов и персональные сведения, а его сбор — замедлить процесс. Используйте инструменты, подходящие вашей среде выполнения, сначала на стенде. Не публикуйте необработанный дамп. Исследуйте, кто держит ссылку на объекты, а не только какой тип занимает больше байтов: большой полезный кэш и забытая коллекция требуют разных решений.
Исправление проверяем тем же профилем
Если причина в очереди, смотрите баланс поступления и обработки, ограничения и возврат к нормальному размеру. Если в кэше — его границы и политику удаления. Если в удержании объектов — освобождение владельца ссылки. Увеличение памяти может отсрочить отказ, но само по себе не подтверждает устранение причины. В отчёте отдельно укажите наблюдение, гипотезу и проверенное изменение.
- Сравниваем одинаковые версии метрик и сходные наборы данных.
- После нагрузки наблюдение продолжается до согласованной границы.
- Остановка теста не уничтожает нужные свидетельства.
- Итог описывает тренд, а не один максимальный пик.
Для разбора подготовьте временную шкалу с тремя-четырьмя связанными метриками и безопасным профилем проблемного участка. Решение должно объяснять, какие данные больше не накапливаются и почему. Так можно отличить исправленную причину от временного запаса ресурсов.