使用reactivesockets重复连接/断开连接时内存泄漏

本文关键字:连接 内存 泄漏 断开 使用 reactivesockets | 更新日期: 2023-09-27 18:27:05

我正在使用在GitHub中找到的reactivesockets库(https://github.com/clariuslabs/reactivesockets)我想知道是否有人在客户端连接和断开连接时遇到过内存泄漏。

我正在运行库中提供的ReactiveServer示例,它基本上包括:

static void Main(string[] args)
{
  var port = 1055;
  if (args.Length > 0)
    port = int.Parse(args[0]);
  var server = new ReactiveListener(port);
  server.Connections.Subscribe(socket =>
  {
    Console.WriteLine("New socket connected {0}", socket.GetHashCode());
    var protocol = new StringChannel(socket);
    // Here we hook the "echo" prototocol
    protocol.Receiver.Subscribe(
      s => { Console.Write(s); protocol.SendAsync(s).Wait(); }, 
      e => Console.WriteLine(e),
      () => Console.WriteLine("Socket receiver completed"));
    socket.Disconnected += (sender, e) => Console.WriteLine("Socket disconnected {0}", sender.GetHashCode());
    socket.Disposed += (sender, e) => Console.WriteLine("Socket disposed {0}", sender.GetHashCode());
  });
  server.Start();
  Console.WriteLine("Press Enter to exit");
  Console.ReadLine();
}

然后,我创建了一个带有循环的控制台应用程序,在这个循环中创建了ReactiveClient,然后连接到服务器,等待200毫秒,然后断开连接。客户端不向服务器发送任何数据。这是代码:

static void Main(string[] args) {
  var numberOfClients = 1000;
  for (var i = 0; i < numberOfClients; i++) {
    var controlClient = new ReactiveClient("127.0.0.1", 1055);
    controlClient.ConnectAsync().Wait();
    Console.WriteLine(@"Connect");
    Task.Delay(200).Wait();
    controlClient.Disconnect();
    Console.WriteLine(@"Disconnect");
  }
}

我在VisualStudio的内存探查器中看到,当我运行测试应用程序时,服务器的内存使用率呈线性增长。当测试应用程序停止时,服务器的内存使用率不会下降;它保持在它达到的任何水平。

当我在没有实例化StringChannel类并订阅Receiver的代码的情况下运行ReactiveServer示例时,内存泄漏似乎不会发生(或者至少不太清楚,内存使用量呈线性增长)。代码如下:

static void Main(string[] args) {
  var port = 1055;
  if (args.Length > 0)
      port = int.Parse(args[0]);
  var server = new ReactiveListener(port);
  server.Connections.Subscribe(socket =>
  {
      Console.WriteLine("New socket connected {0}", socket.GetHashCode());
  });
  server.Start();
  Console.WriteLine("Press Enter to exit");
  Console.ReadLine();
}

因此,我怀疑内存泄漏可能与以下事实有关:当客户端断开连接时,对协议接收器的订阅(在执行protocol.Receiver.Subscribe时)没有得到正确处理。通过阅读关于Rx.NET的更多详细信息,我了解到在正常情况下(如果可观察的序列完成),则订阅会被自动处理,但如果序列没有完成,则不会被处理。我怀疑当客户端断开连接,然后订阅没有被处理时,序列没有完成。我曾尝试在Disconnected事件处理程序中处理订阅,但没有看到任何明显的改进。

任何想法或建议都将不胜感激。

谢谢。

使用reactivesockets重复连接/断开连接时内存泄漏

断开连接后尝试添加controlClient.dispose();

这将释放该对象使用的任何操作资源。

为了让它读起来更好,我会尝试将controlClient封装在using块中。

static void Main(string[] args) {
  var numberOfClients = 1000;
  for (var i = 0; i < numberOfClients; i++) {
    using{var controlClient = new ReactiveClient("127.0.0.1", 1055)) 
    {
       controlClient.ConnectAsync().Wait();
       Console.WriteLine(@"Connect");
       Task.Delay(200).Wait();
       controlClient.Disconnect();
       Console.WriteLine(@"Disconnect");
    }
  }
}

我无法解决内存泄漏问题,所以我决定更换库。我现在正在使用SuperSocket,它运行得非常好。完全没有内存问题。