与Windows上用于本地主机IPC的命名管道相比,TCP套接字的速度有多慢?
我正在开发一个TCP代理,放在一个TCP服务前面,该服务应该处理来自Internet的500到1000个活动连接 代理与服务运行在同一台机器上,并且基本上是透明的。服务在很大程度上不知道代理,唯一的例外是通知客户端的实际远程IP地址 这意味着,对于每个入站开放TCP套接字,服务器上还有两个套接字:代理中的第二个套接字和代理后面的实际服务上的一个套接字 两个代理套接字上的发送和接收窗口大小设置为1024字节 这对性能有什么影响?这个配置有多慢?我是否应该努力将服务更改为使用命名管道(或其他IPC机制),或者本地主机TCP套接字在很大程度上是一种高效的IPC 两个应用程序的合并不是一个选项。现在,我们只能使用两个进程的配置 编辑:在同一硬件上有两个独立进程的原因是100%的经济性。我们只有一台服务器,我们不打算得到更多(没有钱) TCP服务是Visual Basic 6中的一个遗留软件,它的发展超出了我们的预期。代理是C++。我们没有时间、金钱和人力来重写VB6代码并将其迁移到现代编程环境中 代理是我们试图缓解服务上的一个特定性能问题的尝试,这是我们经常遇到的问题 代理是开源的。 让我给你总结一下。如果您担心性能,请使用TCP/IP。但是,如果您有一个非常快速的网络,并且您不担心性能,那么命名管道将是“整洁的”,因为它可能会为您节省一些代码 更不用说,如果您坚持使用TCP,那么您将拥有一些可以扩展的功能,甚至在时机成熟时实现负载平衡与Windows上用于本地主机IPC的命名管道相比,TCP套接字的速度有多慢?,windows,performance,sockets,named-pipes,Windows,Performance,Sockets,Named Pipes,我正在开发一个TCP代理,放在一个TCP服务前面,该服务应该处理来自Internet的500到1000个活动连接 代理与服务运行在同一台机器上,并且基本上是透明的。服务在很大程度上不知道代理,唯一的例外是通知客户端的实际远程IP地址 这意味着,对于每个入站开放TCP套接字,服务器上还有两个套接字:代理中的第二个套接字和代理后面的实际服务上的一个套接字 两个代理套接字上的发送和接收窗口大小设置为1024字节 这对性能有什么影响?这个配置有多慢?我是否应该努力将服务更改为使用命名管道(或其他IPC机
干杯,好奇的是,为什么在同一台机器上有一个代理 无论如何:
IPC、TCP/IP和命名管道有几种方法,它们在速度和复杂度上都相当。如果你真的想要一个伸缩性好并且几乎没有开销的东西:使用共享内存。最好与无锁算法结合使用以推进指针(或为每个读卡器(代理/服务)和写入器(服务/代理)使用一个缓冲区)。在您描述的场景中,本地TCP连接不太可能成为瓶颈。当然,这会带来一些开销,但这应该可以忽略不计,除非您的CPU已经处于热运行状态 猜测一下,如果服务器的CPU使用率通常低于50%左右(使用代理),那么就不必担心最小化与本地TCP连接相关的开销
如果CPU使用率经常超过80%,您可能应该进行一些分析。首先,我将比较代理安装到位和未安装到位时的CPU负载(或者更好的是,性能,如果可以有意义地衡量的话)。除非代理正在执行一些复杂的处理,否则与额外TCP连接相关的开销可能是代理引入的总开销的一个重要部分,因此,这至少可以为您提供一个数量级的估计,即使用更有效的IPC形式将获得多少收益。这将是相同的(或至少不存在可测量的差异).Winsock非常聪明,可以知道它是否正在与同一主机上的套接字通信,在这种情况下,它将短路IP下的几乎所有内容,并将数据直接复制到缓冲区。就命名管道与套接字而言,如果您将来需要能够与不同的计算机通信,请选择套接字。如果您现在,如果您不需要这样做,请选择您的开发人员最熟悉或最熟悉的一个。对于稍后阅读本文的任何人,我想补充一些回答原始问题的发现 对于我们正在开发的实用程序,我们有一个网络类,可以使用命名管道或TCP进行相同的调用 以下是我们测试系统上的典型回环文件传输: TCP/IP传输时间:2.5秒
命名管道传输时间:3.1秒 现在,如果您离开计算机并连接到网络上的远程计算机,则命名管道的性能要差得多: TCP/IP传输时间:12秒
命名管道传输时间:2.5分钟(是分钟!)
我意识到这只是一个系统(Windows 7),但我认为这是一个很好的指标,表明命名管道的速度有多慢……而且似乎TCP是一条发展之路。我知道这个主题非常古老,但它仍然与我相关,也许其他人将来也会关注它 我通过TCP连接和命名管道在同一台机器上的Excel(VBA)和另一个进程之间实现了IPC 在一个快速性能测试中,我从客户端(Excel)向服务器(不是Excel)提交了一条由26个字节组成的消息,并等待来自另一个进程(在本例中为12个字节)的回复消息。 我在一个循环中执行了很多次,并测量了平均执行时间 在本地主机上使用TCP(Windows 7,没有快速路径),一次“对话”(请求+回复)大约需要300-350微秒。尤其是发送数据非常慢(通过TCP发送26个字节大约需要200微秒)。 使用命名管道时,一次对话平均耗时约60微秒,因此速度要快得多 我不完全清楚为什么差异如此之大。我测试过的公司环境有严格的防火墙、包检查等等,所以我认为这可能是因为即使是基于本地主机的TCP连接也通过了安全措施