0

ピアツーピア アプリケーションを開発するための .NET フレームワークを開発しています。以前のバージョンでは、APM パターン (BeginXXX/EndXXX) を使用して実行したところ、完全に機能しました。つまり、私は VS プロファイラーで測定しましたが、結果は予想どおりであり、驚くことではありませんでした。

現在、.NET 3.5 で導入された高パフォーマンスの改善を使用するように更新しています。それは XXXAsync です。フレームワークは問題なく動作しますが、プロファイラーの結果 (メモリ使用量について) を見ると、Socket コンストラクタは「ほとんどのメモリを割り当てている関数」のトップ 1 です!

補足的なコメント: 2 番目の ConnectionIoActor は、新しい bytes[1<<16] (64Kb) を作成するため、一番上になると予想していました。
ここに画像の説明を入力

リスナーと着信接続の 2 つのソケットのみでテストしましたが、リファクタリング前にソケット コンストラクターがそのリストの先頭になかったと確信しています。私には意味がありません。コンストラクターは単に同じものです!

とにかく、それがあなたにとっても意味をなさない場合、ソケットコンストラクターがそのメモリを割り当てているのはなぜですか?

更新 1:

接続は期待されるものです: ここに画像の説明を入力

更新 2:

問題のあるソケットは、接続をリッスンしているようです。

ここに画像の説明を入力 ここに画像の説明を入力

更新 3:

このコードを使用すると、それを再現できます。Main メソッドでは、100kb の配列を割り当てて、表示内容に問題がないことを確認します。

using System.Net;
using System.Net.Sockets;

namespace SocketMemeoryTest
{
    class Listener
    {
        static void Main()
        {
            var forComparison = new byte[100*1024];
            new Listener(3453).Start();
        }

        private readonly IPEndPoint _endpoint;
        private readonly Socket _listener;

        public Listener(int port)
        {
            _endpoint = new IPEndPoint(IPAddress.Any, port);
            _listener = new Socket(_endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        }

        public void Start()
        {
            _listener.SetIPProtectionLevel(IPProtectionLevel.Unrestricted);
            _listener.Bind(_endpoint);
            _listener.Listen(4);
            var saea = new SocketAsyncEventArgs();
            var async = _listener.AcceptAsync(saea);
        }
    }
}

見てください、リスナー ソケットは他のどのソケットよりも多くのメモリを使用しています (何が問題なのかわかりません)。

これは私が見るものです:

ここに画像の説明を入力

おそらく私は何かを誤解していますが、とにかく、ほぼ150kbです。これでいいのかな?注: 実際のプロジェクトでは、接続後、リスナー ソケットには 200Kb 以上が必要です。

4

1 に答える 1