Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与Windows上用于本地主机IPC的命名管道相比,TCP套接字的速度有多慢?_Windows_Performance_Sockets_Named Pipes - Fatal编程技术网

与Windows上用于本地主机IPC的命名管道相比,TCP套接字的速度有多慢?

与Windows上用于本地主机IPC的命名管道相比,TCP套接字的速度有多慢?,windows,performance,sockets,named-pipes,Windows,Performance,Sockets,Named Pipes,我正在开发一个TCP代理,放在一个TCP服务前面,该服务应该处理来自Internet的500到1000个活动连接 代理与服务运行在同一台机器上,并且基本上是透明的。服务在很大程度上不知道代理,唯一的例外是通知客户端的实际远程IP地址 这意味着,对于每个入站开放TCP套接字,服务器上还有两个套接字:代理中的第二个套接字和代理后面的实际服务上的一个套接字 两个代理套接字上的发送和接收窗口大小设置为1024字节 这对性能有什么影响?这个配置有多慢?我是否应该努力将服务更改为使用命名管道(或其他IPC机

我正在开发一个TCP代理,放在一个TCP服务前面,该服务应该处理来自Internet的500到1000个活动连接

代理与服务运行在同一台机器上,并且基本上是透明的。服务在很大程度上不知道代理,唯一的例外是通知客户端的实际远程IP地址

这意味着,对于每个入站开放TCP套接字,服务器上还有两个套接字:代理中的第二个套接字和代理后面的实际服务上的一个套接字

两个代理套接字上的发送和接收窗口大小设置为1024字节

这对性能有什么影响?这个配置有多慢?我是否应该努力将服务更改为使用命名管道(或其他IPC机制),或者本地主机TCP套接字在很大程度上是一种高效的IPC

两个应用程序的合并不是一个选项。现在,我们只能使用两个进程的配置

编辑:在同一硬件上有两个独立进程的原因是100%的经济性。我们只有一台服务器,我们不打算得到更多(没有钱)

TCP服务是Visual Basic 6中的一个遗留软件,它的发展超出了我们的预期。代理是C++。我们没有时间、金钱和人力来重写VB6代码并将其迁移到现代编程环境中

代理是我们试图缓解服务上的一个特定性能问题的尝试,这是我们经常遇到的问题

代理是开源的。

让我给你总结一下。如果您担心性能,请使用TCP/IP。但是,如果您有一个非常快速的网络,并且您不担心性能,那么命名管道将是“整洁的”,因为它可能会为您节省一些代码

更不用说,如果您坚持使用TCP,那么您将拥有一些可以扩展的功能,甚至在时机成熟时实现负载平衡


干杯,

好奇的是,为什么在同一台机器上有一个代理

无论如何:


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连接也通过了安全措施