NeuroAgent

Why dotMemory doesn't save snapshot in Docker

Solution for dotMemory hanging after 'SNAPSHOT #1 READY' message in Docker containers. Learn the causes and ways to fix snapshot saving issues.

Why isn’t the snapshot being saved in JetBrains dotMemory?

Hello. I have an application with a clear memory leak on .NET 8. I’m trying to take a snapshot through JetBrains dotMemory, but after displaying the message “[PID:1] SNAPSHOT #1 READY.”, the tool seems to hang and doesn’t save the file. I’m using the following command:

docker exec -it app /dotMemory/dotmemory get-snapshot 1 --save-to-dir=/dotMemory/snapshots

Here’s the command output:

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.

Why doesn’t dotMemory save the snapshot after the ready message, and how can I fix this?

NeuroAgent

The main problem with dotMemory hanging after the “SNAPSHOT #1 READY” message is usually related to Docker limitations, I/O timeouts, or insufficient resources to complete the snapshot saving process. This often occurs with large memory volumes or due to container security settings blocking the completion of the operation.

Table of Contents

Causes of the dotMemory hanging problem

The dotMemory hanging after the “SNAPSHOT #1 READY” message can be caused by several factors related to Docker limitations and the snapshot saving process.

Docker resource limitations
Docker containers have limitations on memory volume, CPU time, and I/O operations. When dotMemory tries to save a large snapshot (~11.86 M objects, as in your case), these limitations can cause timeouts. This often happens when the container reaches memory limits or when I/O operations are blocked.

As noted in research, timeout issues are often related to commands taking longer than the established timeout periods. In your case, the Host Bus Adapter (HBA) driver may interrupt the command due to exceeding the 5-second timeout.

Access permission issues
When saving a snapshot to the specified directory /dotMemory/snapshots, there may be access permission issues, especially when working with Docker containers. If the directory doesn’t exist or the container doesn’t have write permissions, the process may “hang” while waiting for permission to complete the operation.

Main factors affecting snapshot saving

Snapshot size and performance
In your case, the snapshot contains approximately 11.86 million objects, which is a significant volume of data. Large snapshots require more time for serialization and saving to disk. When working in a Docker environment, this can be exacerbated by file system limitations.

Network limitations
If the Docker host has limitations on network operations or a slow file system, this can slow down the saving process. In some cases, containers may “hang” during I/O operations, especially when working with network storage.

Process conflicts
Inside the container, conflicts may occur between the dotMemory process and other processes competing for resources. This can lead to the snapshot saving process not receiving sufficient CPU time to complete.

Solutions and fixes

Increasing Docker timeouts
Try increasing the timeouts for the Docker container by adding flags when starting it:

bash
docker run --memory=4g --memory-swap=4g --oom-kill-disable=false

This will allocate more memory and prevent the process from being interrupted due to resource shortages.

Checking directory access permissions
Make sure the directory for saving snapshots exists and has the correct access permissions:

bash
docker exec -it app mkdir -p /dotMemory/snapshots
docker exec -it app chmod 777 /dotMemory/snapshots

Using alternative commands
Try using a simpler command without flags to check if the basic functionality works:

bash
docker exec app /dotMemory/dotmemory collect 1 --save-to=/dotMemory/snapshots/snapshot1.dmp

Mounting a host directory
Try mounting a directory from the host machine to avoid access permission issues:

bash
docker run -v /host/snapshots:/dotMemory/snapshots [other_params]

Manually terminating the process
If the process is hanging, try to force terminate it and restart it:

bash
docker exec -it app pkill dotmemory
docker exec -it app /dotMemory/dotmemory get-snapshot 1 --save-to-dir=/dotMemory/snapshots

Alternative memory analysis approaches

Using built-in .NET tools
Instead of dotMemory, you can use built-in .NET tools for memory analysis:

bash
docker exec app dotnet-dump collect -p 1 -o /dotMemory/snapshots/dump.dmp

This method is often more reliable in a Docker environment and doesn’t require additional dependencies.

Analyzing application logs
Check the application logs for memory error messages that may provide additional information about the problem:

bash
docker logs app --tail 100

Using other profiling tools
Consider using other profiling tools such as:

  • dotTrace from JetBrains for performance analysis
  • ANTS Performance Profiler for .NET applications
  • Visual Studio Diagnostic Tools when running in a development environment

Prevention

Optimizing memory usage
Regularly optimize memory usage in your .NET 8 application:

  • Use a memory profiler to identify leaks
  • Implement object pooling for frequently created objects
  • Avoid storing large volumes of data in memory

Configuring Docker resources
Properly configure Docker container resources:

  • Allocate sufficient memory
  • Configure CPU time limits
  • Use effective memory cleanup strategies

Automating memory analysis
Set up automatic monitoring and memory analysis using:

  • Scripts for periodic snapshot creation
  • Integration with CI/CD pipelines
  • Real-time monitoring systems

As noted in research, JVM Flag for Auto-Dumping can be useful for automatically creating snapshots when memory errors occur. Although this relates to Java, a similar approach can be applied to .NET applications.

Sources

  1. Broadcom Knowledge Base - Snapshot taken with memory for a VM fails
  2. Future - Java OutOfMemoryError: Causes, Prevention, and Solutions
  3. Cro-RO - Updating Docker Container: A Beginner’s Guide

Conclusion

The problem with dotMemory hanging after the “SNAPSHOT #1 READY” message is usually resolved by adjusting Docker container settings, checking access permissions, and using alternative snapshot saving methods. The main steps to fix the issue include increasing allocated memory, checking write permissions to the save directory, and using built-in .NET tools. To prevent similar problems in the future, it’s recommended to regularly optimize memory usage and set up automatic monitoring of the application’s status in the Docker environment.