数百个端口打开后,TcpListener与Start()的性能问题

时间:2013-01-10 02:03:28

标签: .net sockets windows-7 network-programming tcplistener

在我开始之前......这不是为了生产;这个问题实际上只是在制作测试应用程序时才出现。我自己和另一位开发人员正在四处寻找.net以这种方式表现不佳的原因。它可能不是.net,它可能是操作系统,我希望有人可以对主题有所了解:

我的测试应用程序是为处理来自我们的生产应用程序的数百个连接创建的,这些连接仅通过TCP连接到数百个设备,因为它更容易模拟500-700台PC,然后在我的办公室中堆放500-700台物理机器运行一些端口软件。

如果您有兴趣找到解决方案,我创建了一个可以复制/粘贴到测试VS中的示例块。它非常简单,易于重现。

的问题:

  • 打开每个端口时,下一个端口打开需要更长时间。
  • 在创建数百个
  • 之后创建一个端口的CPU非常紧张

注意:

  • 线程数正常...非常低(任务管理器中有16个线程)
  • 处理计数也正常,因为它会添加每个插槽。
  • 内存使用情况也看似正常
  • 使用反射器查看.net库以查看Start()正在做什么,它看起来像普通的套接字调用。

示例代码:

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

namespace SocketPerformanceTest
{
    class Program
    {
        static void Main(string[] args)
        {
            const int socketToOpen = 500;
            const int socketStartingPoint = 45000;
            var sw = new Stopwatch();
            for (var i = 0; i < socketToOpen; i++)
            {
                var thisPort = socketStartingPoint + i;
                try
                {
                    var listener = new TcpListener(IPAddress.Any, thisPort);
                    sw.Restart();
                    listener.Start();
                    sw.Stop();
                    Console.WriteLine("Started Port {0} in {1}", thisPort, sw.Elapsed);
                }
                catch{}
            }
        }
    }
}

控制台输出:

当测试应用程序首次启动时,请注意每个端口在执行时间内缓慢上升。秒表包装了Start()方法:

Started Port 45000 in 00:00:00.0086440
Started Port 45001 in 00:00:00.0131427
Started Port 45002 in 00:00:00.0125916
Started Port 45003 in 00:00:00.0140987
Started Port 45004 in 00:00:00.0214274
Started Port 45005 in 00:00:00.0166746
Started Port 45006 in 00:00:00.0178583
Started Port 45007 in 00:00:00.0203611
Started Port 45008 in 00:00:00.0187707
Started Port 45009 in 00:00:00.0209386
Started Port 45010 in 00:00:00.0229595
Started Port 45011 in 00:00:00.0298687
Started Port 45012 in 00:00:00.0331132
Started Port 45013 in 00:00:00.0312815
Started Port 45014 in 00:00:00.0295004
Started Port 45015 in 00:00:00.0312391
Started Port 45016 in 00:00:00.0326538
Started Port 45017 in 00:00:00.0329316
Started Port 45018 in 00:00:00.0330471
Started Port 45019 in 00:00:00.0353324
Started Port 45020 in 00:00:00.0391780
Started Port 45021 in 00:00:00.0405106
Started Port 45022 in 00:00:00.0391909
Started Port 45023 in 00:00:00.0410726
Started Port 45024 in 00:00:00.0519416

打开大约400个端口后,请注意每个端口启动所需的时间。 1-2秒?此操作的CPU也很高:

Started Port 45399 in 00:00:01.3031324
Started Port 45400 in 00:00:01.2686192
Started Port 45401 in 00:00:01.2367192
Started Port 45402 in 00:00:01.3912566
Started Port 45403 in 00:00:01.2710675
Started Port 45404 in 00:00:01.2500153
Started Port 45405 in 00:00:01.2685378
Started Port 45406 in 00:00:01.3358896
Started Port 45407 in 00:00:01.2972177
Started Port 45408 in 00:00:01.3002466
Started Port 45409 in 00:00:01.4087936
Started Port 45410 in 00:00:01.5042491
Started Port 45411 in 00:00:01.2869177
Started Port 45412 in 00:00:01.3284299
Started Port 45413 in 00:00:01.3202311
Started Port 45414 in 00:00:01.4406063
Started Port 45415 in 00:00:01.3534663
Started Port 45416 in 00:00:01.7562387
Started Port 45417 in 00:00:01.5572173
Started Port 45418 in 00:00:01.4617214
Started Port 45419 in 00:00:02.1260768
Started Port 45420 in 00:00:01.6841706
Started Port 45421 in 00:00:01.7514512
Started Port 45422 in 00:00:01.5182234

问题:

  • 为什么每个端口需要更长时间才能打开?
  • 为什么CPU越来越高
  • 我做错了什么?有没有更有效的方法来打开套接字并监听连接?
  • 这是操作系统问题还是.net问题?我在Windows 7上对此进行了测试,如果我在服务器操作系统上测试它,您认为它会有所不同吗?我相信2008 R2和Win7 SP的内核是相同的,所以不确定这是否重要。

设备:

  • Win7 x64旗舰版,8 GB内存,I7,SSD等等

对我来说找到解决方案并不重要,但这会很好。我想让这个模拟器应用启动,并在合理的时间内收听500-700个独特的TCP端口。如果有更好的方法,请告诉我......我对正在发生的事情或其他选择非常感兴趣。

谢谢!

更新1

在几乎没有CPU /内存的Raspberry Pi设备上测试过,它几乎是即时的。其他人说在评论中它是即时的......一个人说他们看到了同样的事情。我也在不同的PC上测试过,我遇到了同样的问题。禁用防火墙,AV等我真的很好奇为什么会这样。

0 个答案:

没有答案