Из-за чего не сохраняется снапшот?

Ссылка скопирована
1 ответ

По вводным: есть приложение с явной утечкой памяти на.Net 8. Пытаюсь сделать снапшот через Jetbrains dotMemory.
Сейчас ситуация такая: после вывода [PID:1] SNAPSHOT #1 READY. Как будто бы dotMemory зависает и ни чего не сохраняет.

docker exec -it app /dotMemory/dotmemory get-snapshot 1 --save-to-dir=/dotMemory/snapshots Performs memory profiling of .NET applications Found 1 process(es): [1] app Attaching to [1] app runtime... Profiler connected. PID:1, Core CLR runtime v8.0.18.0 ATTACHED. Getting snapshot... [PID:1] Saving snapshot... ~11,86 M objects [PID:1] SNAPSHOT #1 SAVED. [PID:1] Processing snapshot #1... [PID:1] SNAPSHOT #1 READY.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Алексей Денисов Ответ

Если dotMemory в Docker пишет SNAPSHOT #1 READY, но файл не появляется, обычно проблема в одном из трёх мест: путь сохранения не существует или недоступен внутри контейнера, profiler не может корректно завершить сохранение снимка, либо контейнеру не хватает памяти/прав на запись. Сообщение READY означает, что снимок подготовлен, но не гарантирует, что он уже записан туда, куда вы ожидаете.

Проверьте каталог внутри контейнера:

docker exec -it app sh
ls -la /dotMemory
mkdir -p /dotMemory/snapshots
touch /dotMemory/snapshots/test.txt
ls -la /dotMemory/snapshots

docker exec -it app sh ls -la /dotMemory mkdir -p /dotMemory/snapshots touch /dotMemory/snapshots/test.txt ls -la /dotMemory/snapshots

Если каталог не примонтирован наружу, файл может сохраниться внутри контейнера и исчезнуть после пересоздания. Лучше явно примонтировать volume:

services:
  app:
    volumes:
      - ./snapshots:/dotMemory/snapshots

services: app: volumes: - ./snapshots:/dotMemory/snapshots

Проверьте, что команда запускается от пользователя, у которого есть права писать в этот каталог. Если приложение работает не от root, права могут мешать:

docker exec -it app id
docker exec -it app chmod -R 777 /dotMemory/snapshots

docker exec -it app id docker exec -it app chmod -R 777 /dotMemory/snapshots

Также dotMemory может долго сохранять большой snapshot. Посмотрите нагрузку, свободное место и логи контейнера:

docker logs app --tail=200
docker exec -it app df -h
docker stats app

docker logs app --tail=200 docker exec -it app df -h docker stats app

Для .NET 8 в контейнере важно, чтобы profiler и runtime были совместимы, а контейнер не был слишком урезан по capabilities. Если снапшот большой, увеличьте лимит памяти контейнера и временно отключите рестарты.

Итог: сначала убедитесь, что /dotMemory/snapshots существует, доступен на запись и примонтирован наружу. Потом проверьте свободное место, права пользователя и логи. Чаще всего файл “не сохраняется” именно потому, что сохраняется внутри контейнера не туда или процесс не имеет прав.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно