使用System.Threading.OverlappedData(async await)会导致内存严重碎片化。

6

我经常遇到内存不足的问题。我使用WinDbg查看了内存转储文件,以下是它的内容:

000007f975ee0630   557377     41027736 System.Object[]
000007f975f004d0    18781     47746604 System.Byte[]
000007f975efc358   561433     54013658 System.String
000000000137b170     7616   1322123700      Free

Total 7627101 objects
Fragmented blocks larger than 0.5 MB:
        Addr     Size      Followed by        
000000004a9f62b0   18.2MB 000000004bc28050 System.Threading.OverlappedData
000000004dc2ce68   16.1MB 000000004ec522e8 System.Threading.OverlappedData
0000000050adaec0   10.3MB 0000000051525620 System.Threading.OverlappedData
000000005d47fd98   10.2MB 000000005deab618 System.Threading.OverlappedData
0000000071718ab8   23.0MB 0000000072e13a80 System.Threading.OverlappedData
0000000072e13e50   11.8MB 00000000739e4898 System.ServiceModel.Channels.SocketConnection
00000000801a7830   29.7MB 0000000081f5dd60 System.Threading.OverlappedData
000000008264ab58   14.0MB 000000008344bac0 System.Threading.OverlappedData
000000008344bb30   11.6MB 0000000083fecf80 System.Threading.OverlappedData
0000000083fecff0   13.6MB 0000000084d8dae8 System.Threading.OverlappedData
0000000084d8db58  148.3MB 000000008e1d65f8 System.Threading.OverlappedData
0000000093db04e0   19.4MB 00000000951158b8 System.Threading.OverlappedData
0000000095115928   33.9MB 00000000972f2620 System.Threading.OverlappedData
00000000abaa6738   71.9MB 00000000b0285cb0 System.Byte[]

请注意,碎片堆中有许多更多的项目,我只粘贴了超过10MB的项目。您可以看出主要问题是System.Threading.OverlappedData。
最近我重构了所有代码,使用async和await来实现以下内容:
await Task.Factory.FromAsync<string, MessageSender>(
                                  this.MessageFactory.BeginCreateMessageSender, 
                                  this.MessageFactory.EndCreateMessageSender, 
                                  this.Topic.Path,
                                  null)
      .ConfigureAwait(false);

有很多socket入站(socket)和出站(azure service bus)通信。如何避免这种内存碎片化?


你确定你正在处理所有需要处理的东西吗? - Stephen Cleary
1
是的,这是 .NET 对异步网络请求的“处理”。 - user1275154
1个回答

0

我认为你应该检查以下这些地方:

我正在解决一个类似的问题:我的服务器在异步套接字上接收大量客户端请求,但由于各种原因,客户端没有正确结束通信(最可能是由于频繁的IP更改 - 它们在GPRS / 3G上移动)。 这似乎使回调永远等待,并且套接字上的EndReceive从未被调用,这使得那些Overlapped对象(它们是AsyncPinned)永远悬挂在内存中,导致内存使用率和碎片化都很高。 因此,关于限制并发连接数并确保手动关闭过期连接的想法就产生了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接