0

我正在开发一个 .NET 框架来开发对等应用程序。在之前的版本中,我使用 APM 模式 (BeginXXX/EndXXX) 完成了它,并且效果很好。我的意思是,我使用 VS 分析器进行了测量,结果是预期的结果,不足为奇。

目前我正在更新它以使用 .NET 3.5 中引入的高性能改进,它是 XXXAsync。该框架工作正常,但是,当我看到分析器的结果(关于内存使用)时,Socket 构造函数是“分配最多内存的函数”中的前 1 个!

只是一个旁注:我预计第二个 ConnectionIoActor 会是最重要的,因为它创建了一个新的 bytes[1<<16] (64Kb)。
在此处输入图像描述

我只用两个套接字对其进行了测试:侦听器和一个传入连接,并且确信在重构之前套接字构造函数不在该列表的顶部。这对我来说没有任何意义,构造函数就是同一个!

无论如何,如果这对您也没有意义,为什么套接字构造函数分配该内存?

更新 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。这可以吗?注意:在实际项目中,连接后监听socket需要200Kb以上。

4

1 回答 1

0

内存分配是由 System.Net.Socket 构造函数使用的 System.Net.Logging 引起的。禁用 System.Net 日志记录可能会有所帮助。IMO 没有什么可担心的。

于 2013-08-15T14:26:12.897 回答