環境
- 運用中の 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);
}
}
}
}