Azure应用服务高内存消耗净核心

问题描述 投票:0回答:1

伙计们!我是新手来管理在高负载下工作的服务器应用程序,并且面临一个问题。我的应用程序(.NET Core 2.1,使用MVC控制器)用作简单的REST服务(客户端从Sql Server DB获取和设置数据)。工作负载大约是每秒100个请求(我只使用一个实例)。问题是GC从未(实际上从未)发生,内存使用量攀升至2 GB左右,因此我的应用每30-60分钟重启一次。大多数时候重启是以静默方式进行的,但有时会记录以下OOM异常之一

Received an exception: [Exception of type 'System.OutOfMemoryException' was thrown.], [   at System.Collections.Generic.List`1.set_Capacity(Int32 value)
at System.Collections.Generic.List`1.EnsureCapacity(Int32 min)
   at System.Collections.Generic.List`1.AddWithResize(T item)
   at System.PinnableBufferCache.AgePendingBuffers()
   at System.PinnableBufferCache.Restock(Object& returnBuffer)
   at System.PinnableBufferCache.Allocate()
   at System.Threading.Overlapped..ctor()
   at System.Threading.PreAllocatedOverlapped..ctor(IOCompletionCallback callback, Object state, Object pinData)
   at System.Net.Sockets.SocketAsyncEventArgs.InitializeInternals()
   at System.Net.Sockets.SocketAsyncEventArgs..ctor(Boolean flowExecutionContext)
   at System.Net.Sockets.SocketAsyncEventArgs..ctor()
   at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal.SocketSender..ctor(Socket socket, PipeScheduler scheduler)
   at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal.SocketConnection..ctor(Socket socket, MemoryPool`1 memoryPool, PipeScheduler scheduler, ISocketsTrace trace)
   at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransport.RunAcceptLoopAsync()
   at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransport.UnbindAsync()
   at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.StopAsync(CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.StopAsync(CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.Dispose()
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.Dispose()
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.Dispose()
   at Microsoft.Extensions.DependencyInjection.ServiceProvider.Dispose()
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.Dispose()
   at Microsoft.AspNetCore.Hosting.WebHostExtensions.RunAsync(IWebHost host, CancellationToken token, String shutdownMessage)
   at Microsoft.AspNetCore.Hosting.WebHostExtensions.RunAsync(IWebHost host, CancellationToken token)
   at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host)
   at WillHeroServer.Program.Main(String[] args) in C:\Projects\MyApp\src\MyApp\Program.cs:line 17], System.Private.CoreLib

Received an exception: [Exception of type 'System.OutOfMemoryException' was thrown.], [   at System.Net.Sockets.Socket.GetOrCreateAcceptSocket(Socket acceptSocket, Boolean checkDisconnected, String propertyName, SafeCloseSocket& handle)
   at System.Net.Sockets.Socket.AcceptAsync(SocketAsyncEventArgs e)
   at System.Net.Sockets.Socket.AcceptAsync(Socket acceptSocket)
   at System.Net.Sockets.SocketTaskExtensions.AcceptAsync(Socket socket)
   at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransport.RunAcceptLoopAsync()
   at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransport.UnbindAsync()
   at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.StopAsync(CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.StopAsync(CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.Dispose()
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.Dispose()
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.Dispose()
   at Microsoft.Extensions.DependencyInjection.ServiceProvider.Dispose()
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.Dispose()
   at Microsoft.AspNetCore.Hosting.WebHostExtensions.RunAsync(IWebHost host, CancellationToken token, String shutdownMessage)
   at Microsoft.AspNetCore.Hosting.WebHostExtensions.RunAsync(IWebHost host, CancellationToken token)
   at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host)
   at WillHeroServer.Program.Main(String[] args) in C:\Projects\MyApp\src\MyApp\Program.cs:line 17], System.Net.Sockets

我以为我的内存泄漏导致了这种行为,但我没有。我甚至制作并部署了一个空的应用程序(没有路由,没有任何东西),并且用于处理那些请求和内存消耗的内存消耗BadRequest仍然将内存提升到先前的水平并重置应用程序(尽管,重置之间的延迟有点长)。应用服务计划设置为B2(2x内核,3.5 GB RAM)。我试图升级到B3,但它没有帮助我,所以我回滚了。

1)为什么空的应用程序永远不会释放内存?

2)Kestrel可以处理这些请求吗?

3)我是否错过了Azure中的一些设置,或者看起来很好,我应该制作几个应用实例?

azure memory-management .net-core out-of-memory
1个回答
0
投票

你有没有尝试过:

<PropertyGroup> 
   <ServerGarbageCollection>false</ServerGarbageCollection>
</PropertyGroup>

?

Reducing .NET Core Memory Usage

我有一个问题,这个似乎工作。您可以谷歌为不同的GC。

© www.soinside.com 2019 - 2024. All rights reserved.