He estado luchando tratando de identificar por qué uno de mis servicios ocupa espacio en la memoria crece con el tiempo. Al tratar de identificar la fuga de memoria, configuré un entorno de prueba y comenté el código, una llamada a la vez para tratar de aislar al culpable. Para mi sorpresa, me quedé con un programa simple que abrió una conexión a una base de datos de Sql Server y la cerró sin enviar ningún comando, pero aún tenía la pérdida de memoria. El programa completo de .NET 4.8 se encuentra a continuación.
static void Main(string[] args) { var Logger = new LoggerConfiguration() .WriteTo.File(LogFilePath, rollingInterval: RollingInterval.Day) .CreateLogger(); while (true) { PollDB(); Logger.Information($"Memory in use after processing: {Process.GetCurrentProcess().PrivateMemorySize64.ToString("N0")}B"); Thread.Sleep(new TimeSpan(4, 0, 0)); } } static private void PollDB() { string cstring = ConfigurationManager.ConnectionStrings["AdminDB"].ConnectionString; using (var conn = new SqlConnection(cstring)) { conn.Open(); conn.Close(); } }Aquí está la salida del registro:
2022-01-25 14:12:10.641 -05:00 [INF] Memory in use after processing: 15,056,896B 2022-01-25 18:12:10.796 -05:00 [INF] Memory in use after processing: 24,465,408B 2022-01-25 22:12:11.230 -05:00 [INF] Memory in use after processing: 32,997,376B 2022-01-26 02:12:11.384 -05:00 [INF] Memory in use after processing: 41,586,688B 2022-01-26 06:12:11.824 -05:00 [INF] Memory in use after processing: 49,975,296B 2022-01-26 10:12:11.947 -05:00 [INF] Memory in use after processing: 58,253,312B 2022-01-26 14:12:12.420 -05:00 [INF] Memory in use after processing: 66,899,968B 2022-01-26 18:12:12.543 -05:00 [INF] Memory in use after processing: 75,354,112B 2022-01-26 22:12:12.773 -05:00 [INF] Memory in use after processing: 83,755,008B 2022-01-27 02:12:13.162 -05:00 [INF] Memory in use after processing: 92,155,904B 2022-01-27 06:12:13.274 -05:00 [INF] Memory in use after processing: 100,581,376B 2022-01-27 10:12:13.716 -05:00 [INF] Memory in use after processing: 109,121,536BAparte del código de serilog, el único código que podría estar acaparando memoria es la conexión sql. Y estoy bastante seguro de que el código de serilog no tiene la culpa porque si comento la llamada PollDB(), no hay pérdida de memoria.
Otra cosa a destacar. Puedo tomar el mismo programa y cambiar el tiempo entre las encuestas de la base de datos a 12 horas y el uso de la memoria crecerá al mismo ritmo. En otras palabras, el uso de la memoria depende del tiempo que se ejecuta el programa, no del número de conexiones sql realizadas.
He usado un generador de perfiles de memoria y es la memoria no administrada la que crece con el tiempo.
¿Alguien ha experimentado esto antes? ¿Hay algún parámetro de cadena de conexión que pueda resolver este problema? ¿Una revisión del sistema operativo?