Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Von Tom Dykstra
Dieser Artikel enthält Anleitungen zum Verwalten des Speichers in Kestrel, einschließlich der automatischen Entfernung von Speicherpools und der Verwendung von Speicherpoolmetriken.
Automatische Entfernung aus dem Speicherpool
Die von Kestrel, IIS und HTTP.sys verwendeten Speicherpools werden automatisch entfernt, wenn die Anwendung im Leerlauf oder unter niedriger Auslastung liegt. Das Feature wird automatisch ausgeführt und muss nicht manuell aktiviert oder konfiguriert werden.
Diese automatische Entfernungsfunktion reduziert die gesamte Speicherauslastung und hilft Anwendungen, unter unterschiedlichen Workloads reaktionsfähig zu bleiben. In Versionen von .NET vor 10 blieb der vom Pool zugewiesene Speicher reserviert, auch wenn er nicht verwendet wird.
Verwenden von Arbeitsspeicherpoolmetriken
Der vom ASP.NET Core-Serverimplementierung verwendete Standardspeicherpool enthält Metriken, die zum Überwachen und Analysieren von Speicherauslastungsmustern verwendet werden können. Die Metriken befinden sich unter dem Namen "Microsoft.AspNetCore.MemoryPool".
Informationen zu Metriken und deren Verwendung finden Sie unter ASP.NET Core-Metriken.
Verwalten von Speicherpools
Neben der effizienten Verwendung von Speicherpools durch das Löschen nicht benötigter Speicherblöcke stellt ASP.NET Core eine integrierte IMemoryPoolFactory-Schnittstelle und die Standardimplementierung bereit, die über die Abhängigkeitseinfügung verfügbar sind.
Das folgende Codebeispiel zeigt einen einfachen Hintergrunddienst, der die integrierte Speicherpool-Factoryimplementierung zum Erstellen von Speicherpools verwendet. Diese Pools profitieren von der automatischen Entfernungsfunktion:
public class MyBackgroundService : BackgroundService
{
private readonly MemoryPool<byte> _memoryPool;
public MyBackgroundService(IMemoryPoolFactory<byte> factory)
{
_memoryPool = factory.Create();
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
await Task.Delay(20, stoppingToken);
// do work that needs memory
// consider checking _memoryPool.MaxBufferSize
var rented = _memoryPool.Rent(100);
rented.Dispose();
}
catch (OperationCanceledException)
{
return;
}
}
}
}
Um eine benutzerdefinierte Speicherpool-Factory zu verwenden, erstellen Sie eine Klasse, die IMemoryPoolFactory implementiert und mithilfe der Abhängigkeitsinjektion registriert wird, wie im folgenden Beispiel gezeigt. Speicherpools, die auf diese Weise erstellt wurden, profitieren auch von der automatischen Entfernungsfunktion:
services.AddSingleton<IMemoryPoolFactory<byte>,
CustomMemoryPoolFactory>();
public class CustomMemoryPoolFactory : IMemoryPoolFactory<byte>
{
public MemoryPool<byte> Create()
{
// Return a custom MemoryPool implementation
// or the default, as is shown here.
return MemoryPool<byte>.Shared;
}
}
Wenn Sie einen Speicherpool verwenden, beachten Sie die Pools MaxBufferSize.