5

私は常にゆっくりとメモリを使い果たしています。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);

ソケット インバウンド (ソケット) およびアウトバウンド (Azure サービス バス) 通信が多数あります。このようなメモリの断片化を回避するにはどうすればよいですか?

4

1 に答える 1

0

それらの場所を確認する必要があると思います:

私は現在、同様の問題に取り組んでいます: 私のサーバーは非同期ソケットで多数のクライアント要求を受け取りますが、多くの理由でクライアントは通信を適切に終了しません (ほとんどの場合、頻繁な IP 変更が原因です - クライアントは GPRS/3G でモバイルです)。これにより、コールバックが永久に待機し、ソケットの EndReceive が呼び出されなくなり、オーバーラップされたオブジェクト (AsyncPinned) がメモリ内で永久にぶら下がり、メモリの使用率が高くなり、断片化が発生します。したがって、同時接続の数を制限し、期限切れの接続が手動で閉じられることを自分で保証するという考えです。

于 2013-10-24T17:37:15.283 に答える