Hohe Speichernutzung in der .NET 6-Anwendung mit großen Zeichenfolgen, die im Speicher verbleibenC#

Ein Treffpunkt für C#-Programmierer
Guest
 Hohe Speichernutzung in der .NET 6-Anwendung mit großen Zeichenfolgen, die im Speicher verbleiben

Post by Guest »

Ich erlebe eine ungewöhnlich hohe Speicherauslastung (2 GIB für 4 Instanzen von System.String) in meiner .NET 6-Anwendung, die in der Produktion ausgeführt wird. Ich habe die Speicherauszüge mit dotnet-dump mit dotnet-dumpanalysieren und gcroot analysiert und Folgendes gefunden:
dumpheap -stat zeigt Folgendes:
7f6f4964f8f0 18,152 1,466,966,959 System.Byte[]
7f6f48fad2e0 51,915 1,981,308,612 System.String

gcroot mit der Adresse einer der Zeichenfolgen habe ich Folgendes gefunden:
  • 86 eindeutige Wurzeln
    Sie sind ähnlich, aber nicht genau diese sind einige Beispiele
7f65298bf530 7f6f4facc029 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
r15:
-> 7f6547f46900 System.Threading.Thread+StartHelper
-> 7f66486d8ab8 System.Threading.ExecutionContext
-> 7f664863e128 System.Threading.AsyncLocalValueMap+MultiElementAsyncLocalValueMap
-> 7f664863e140 System.Collections.Generic.KeyValuePair[]
-> 7f66484d1b68 System.Collections.Generic.KeyValuePair[]
-> 7f66484cfe18 Sentry.Scope
-> 7f6647cdb6c0 Sentry.AspNetCore.SentryAspNetCoreOptions
-> 7f6647f9ae08 Sentry.Internal.Http.HttpTransport
-> 7f6647f92a50 System.Net.Http.HttpClient
-> 7f6647f92a20 Sentry.Internal.Http.RetryAfterHandler
-> 7f6647f929d0 Sentry.Internal.Http.GzipBufferedRequestBodyHandler
-> 7f6647f91da8 System.Net.Http.HttpClientHandler
-> 7f6647f92188 System.Net.Http.SocketsHttpHandler
-> 7f66483de670 System.Net.Http.DecompressionHandler
-> 7f66483de648 System.Net.Http.RedirectHandler
-> 7f66483de5b8 System.Net.Http.DiagnosticsHandler
-> 7f66483de4c0 System.Net.Http.HttpConnectionHandler
-> 7f66483ddeb0 System.Net.Http.HttpConnectionPoolManager
-> 7f66483de1d8 System.Threading.Timer
-> 7f66483de250 System.Threading.TimerHolder
-> 7f66483de1f0 System.Threading.TimerQueueTimer
-> 7f6647c8d908 System.Threading.TimerQueue
-> 7f65480e5990 System.Threading.TimerQueueTimer
-> 7f654811fb40 System.Threading.ExecutionContext
-> 7f654811fac0 System.Threading.AsyncLocalValueMap+MultiElementAsyncLocalValueMap
-> 7f654811fad8 System.Collections.Generic.KeyValuePair[]
-> 7f654811f9c8 System.Diagnostics.Activity
-> 7f654811de30 System.Diagnostics.Activity
-> 7f66487bb6d0 System.Diagnostics.Activity
-> 7f66487bb870 System.Diagnostics.Activity+TagsLinkedList
-> 7f66487bb898 System.Diagnostics.DiagNode
-> 7f66487bb920 System.Diagnostics.DiagNode
-> 7f65480e3ad0 System.Diagnostics.DiagNode
-> 7f695b756528 System.String

rbp-20: 00007f65298bf550
-> 7f6547f468b8 System.Threading.Thread
-> 7f66486d8ab8 System.Threading.ExecutionContext
-> 7f664863e128 System.Threading.AsyncLocalValueMap+MultiElementAsyncLocalValueMap
-> 7f664863e140 System.Collections.Generic.KeyValuePair[]
-> 7f66484d1b68 System.Collections.Generic.KeyValuePair[]
-> 7f66484cfe18 Sentry.Scope
-> 7f6647cdb6c0 Sentry.AspNetCore.SentryAspNetCoreOptions
-> 7f6647f9ae08 Sentry.Internal.Http.HttpTransport
-> 7f6647f92a50 System.Net.Http.HttpClient
-> 7f6647f92a20 Sentry.Internal.Http.RetryAfterHandler
-> 7f6647f929d0 Sentry.Internal.Http.GzipBufferedRequestBodyHandler
-> 7f6647f91da8 System.Net.Http.HttpClientHandler
-> 7f6647f92188 System.Net.Http.SocketsHttpHandler
-> 7f66483de670 System.Net.Http.DecompressionHandler
-> 7f66483de648 System.Net.Http.RedirectHandler
-> 7f66483de5b8 System.Net.Http.DiagnosticsHandler
-> 7f66483de4c0 System.Net.Http.HttpConnectionHandler
-> 7f66483ddeb0 System.Net.Http.HttpConnectionPoolManager
-> 7f66483de1d8 System.Threading.Timer
-> 7f66483de250 System.Threading.TimerHolder
-> 7f66483de1f0 System.Threading.TimerQueueTimer
-> 7f6647c8d908 System.Threading.TimerQueue
-> 7f65480e5990 System.Threading.TimerQueueTimer
-> 7f654811fb40 System.Threading.ExecutionContext
-> 7f654811fac0 System.Threading.AsyncLocalValueMap+MultiElementAsyncLocalValueMap
-> 7f654811fad8 System.Collections.Generic.KeyValuePair[]
-> 7f654811f9c8 System.Diagnostics.Activity
-> 7f654811de30 System.Diagnostics.Activity
-> 7f66487bb6d0 System.Diagnostics.Activity
-> 7f66487bb870 System.Diagnostics.Activity+TagsLinkedList
-> 7f66487bb898 System.Diagnostics.DiagNode
-> 7f66487bb920 System.Diagnostics.DiagNode
-> 7f65480e3ad0 System.Diagnostics.DiagNode
-> 7f695b756528 System.String

Durch die Verwendung von dc in dotnet-dumpanalysieren konnte die riesige String-Instanz gelesen werden. Es war überraschend, dass der Inhalt mit Metadaten über die Klasse, den Methodenaufruf und jedes noch so kleine Detail gefüllt war Prozesse hier sind einige Beispiele:
{"Target":{"handler":{"Target":{"4__this":{},"act":{"Transfer":null,"TraceId":">>>>>aaa-432-
","TransferId":"15","SeqNum":"08","TriggeredBy":2,"TriggeredAt":"2024-12-․19T12:30:08.9597687Z"},"transfer":null,"blacklisted":[56]},"Method":{"Name":"g__Handler|0","DeclaringType":"ServiceName.Infrastructure.modules.ServiceOutgoing.Actions.ServiceActionAction+
c__DisplayClass10_0, ServiceName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","ReflectedType":"ServiceName.Infrastructure.modul
es.ServiceOutgoing.Actions.ServiceActionAction+c__DisplayClass10_0, ServiceName, Version=1.0.0.0, Culture=neutral,Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","ServiceName.Infrastructure.Services.ServiceName+
c__DisplayClass102_0, ServiceName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","ServiceName.Infrastructure.Services.ServiceName+c__DisplayClass74_0, ServiceName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","ServiceName.Infrastructure.Services.ServiceName+c__DisplayClass78_0, ServiceName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","ServiceName.Infrastructure.Services.ServiceName+
c__DisplayClass81_0, ServiceName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","ServiceName.Infrastructure.Services.ServiceName+c__DisplayClass87_0, ServiceName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","ServiceName.Infrastructure.Services.ServiceName+c__DisplayClass93_0, ServiceName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","ServiceName.Infrastructure.Services.ServiceName+o__107, ServiceName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","ServiceName.Infrastructure.Services.ServiceName+o__72, ServiceName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","ServiceName.Infrastructure.Services.ServiceName+o__74, ServiceName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","ServiceName.Infrastructure.Services.ServiceName+o__78, ServiceName, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null","ServiceName.Infrastructure.Services.ServiceName+o__81, ServiceName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","ServiceName.Infrastructure.Services.ServiceName+
o__94, ServiceName, Version=1.0.0.0, Culture=neutral,

Die Zeichenfolge ist mit Müll wie diesem gefüllt.
Ich habe zuvor Sentry zur Fehlerüberwachung verwendet, aber nachdem ich es entfernt habe, besteht das Problem weiterhin.
Dann habe ich jegliche Protokollierung aus dem Dienst entfernt, aber das Problem besteht weiterhin.
Die Konfiguration ist größtenteils für alle Mikrodienste gleich
Ich habe die gesamte Registrierung der Dienste noch einmal überprüft, bis nein verfügbar.
Was könnte dazu führen, dass so große Zeichenfolgen im Speicher verbleiben?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post