Azure App Services高内存消耗网络核心

时间:2018-07-21 23:05:30

标签: azure memory-management .net-core out-of-memory

伙计们! 我是管理在高负载下工作并面临问题的服务器应用程序的新手。我的应用程序(使用MVC控制器的.NET Core 2.1)被用作简单的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(2个内核,3.5 GB RAM)。我试图升级到B3,但对情况没有帮助,所以我回滚了。

1)为什么在我的情况下,空的应用程序从不释放内存?

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

3)我是否错过了Azure中的某些设置,或者看起来还不错,而我应该制作几个应用程序实例?

2 个答案:

答案 0 :(得分:0)

您尝试过吗:

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

Reducing .NET Core Memory Usage

我遇到了一个问题,这个问题似乎奏效了。您可以通过Google搜索不同的GC。

答案 1 :(得分:0)

听起来您可能有内存泄漏。这就是内存泄漏的定义,当内存增长并且GC无法回收它时。

通常,这意味着您要加载到内存中的对象仍然具有引用,并且仍然是“根目录”(具有引用)。您需要确保已正确处置所有对象(IDisposable)。

此外,可行的是,您从网络中读取的内容都大于可用的内存。这种情况的可能性较小。

但是,将GC行为更改为单线程并不是解决问题的可行方法。