2

在我开始之前......这不是为了生产;这个问题实际上只是在制作测试应用程序时出现的。我自己和另一位开发人员正在四处寻找 .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 Ultimate、8 GB 内存、I7、SSD 等

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

谢谢!

更新 1

在几乎没有任何 CPU/内存的 Raspberry Pi 设备上对其进行了测试,它几乎是即时的。其他人在评论中说这是即时的……有人说他们看到了同样的事情。我也在另一台电脑上测试过,同样的问题。禁用防火墙、AV 等。我真的很好奇为什么会这样。

4

0 回答 0