1

環境

  • 運用中の OS: Windows XP SP3
  • IDE: Microsoft Visual Studio 2013 アルティメット エディション
  • 対象フレームワーク: .NET Framework 3.5
  • NetMQ: 3.3.1
  • 非同期IO: 0.1.18
  • 言語: C#

Windows XP SP3 で単純な REQ REP ソケットを使用して NetMQ アプリケーションを実行する必要があります。問題 #412 から、Windows XP で実行する場合、AsyncIO.ForceDotNet.Force(); を呼び出す必要があることがわかりました。NetMQ を使用する前に。

アプリケーションの実行を開始してからしばらく (約 3 分間) すると、1 秒間に大量のメッセージ (5 ミリ秒あたり 1 メッセージまたは 1 秒あたり 12,000 メッセージ) を送信するため、~ の割合でメモリ リークが発生することがわかります。 3MB/秒 運用マシンには 1 GB の RAM しかなく、すぐにアプリケーションがクラッシュします。

以下のコードは、リークを非常によく再現しています。リークを確認するには、任意の Windows OS (7、8、または 10) で実行できます。Windows XP SP3 は必要ありません (ただし、AsyncIO.ForceDotNet.Force() がないと、Windows XP SP3 で NetMQ を実行できません)。

クライアント コード (アプリケーションを本番環境にデプロイするのを妨げる問題のあるコード)

class Client
{
    static void Main(string[] args)
    {
        AsyncIO.ForceDotNet.Force();
        while (true)
        {
            using (RequestSocket request = new RequestSocket())
            {
                request.Connect("tcp://127.0.0.1:5555");
                request.SendFrame("Hello");
                byte[] recData;
                bool result = request.TryReceiveFrameBytes(TimeSpan.FromSeconds(1), out recData);
                if (result)
                    Console.WriteLine(string.Format("Reply From Server:{0}", System.Text.Encoding.Default.GetString(recData)));
                System.Threading.Thread.Sleep(5);
            }
        }
    }
}

対応するサーバー コード (同様にリーク)

class Server
{
    static void Main(string[] args)
    {
        AsyncIO.ForceDotNet.Force();
        using (ResponseSocket response = new ResponseSocket())
        {
            response.Bind("tcp://127.0.0.1:5555");                
            while (true)
            {
                byte[] recData = response.ReceiveFrameBytes();
                Console.WriteLine(string.Format("Reply From Server:{0}", System.Text.Encoding.Default.GetString(recData)));
                response.SendFrame("World");
                System.Threading.Thread.Sleep(1);
            }                
        } 
    }
}

クライアント アプリケーションのメモリ プロファイル

4

1 に答える 1

1

Just pushed following commit to AsyncIO, check it out, if it solve your problem I will release a new version to nuget.

https://github.com/somdoron/AsyncIO/commit/b7100a54ec55d3b3fdb9334d1f46a2ec5a070c0a

于 2016-06-26T14:13:30.213 に答える