TCP套接字与Windows上用于localhost IPC的命名管道相比有多慢?

vz0*_*vz0 37 sockets windows performance named-pipes

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

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

这意味着,对于每个入站打开的TCP套接字,服务器上还有两个套接字:代理中的第二个套接字,以及代理后面的真实服务上的套接字.

两个代理套接字上的send和recv窗口大小设置为1024字节.

对此有何影响?这个配置有多慢?我是否应该努力改变服务以使用命名管道(或其他IPC机制),或者localhost TCP套接字在很大程度上是一个有效的IPC?

这两个应用程序的合并不是一种选择.现在我们坚持使用两个流程配置.

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

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

代理是我们尝试缓解服务的特定性能问题,这是我们不时会遇到的DDoS攻击.

代理是开源的,这是项目源代码.

Jef*_*ker 34

它将是相同的(或至少不可测量的不同).Winsock非常聪明,可以知道它是否与同一主机上的套接字进行通信,在这种情况下,它会使IP以下的所有内容短路,并将数据直接复制到缓冲区到缓冲区.就命名管道与套接字而言,如果您将来可能需要能够与不同的计算机进行通信,请选择套接字.如果你知道一个事实,你永远不需要这样做,那么选择你的开发人员最熟悉或最熟悉的那个.

  • 我对此的引用是我曾经在Windows网络上为Microsoft工作.即便如此,防火墙仍然在IP层及以上层面运行,而我所说的是,winsock正在将所有内容短路.没有理由你不能将防火墙规则应用于环回(除了显而易见的"为什么你会打扰?").环回的东西仍然通过网络堆栈,而不是整个网络堆栈,剩余的开销是如此微不足道,除非你同时进行数万次,否则它是微不足道的. (15认同)
  • 当然可以吗?你有什么参考吗?我想环回连接有望流经网络接口并通过网络堆栈.这样,它们就可以成为防火墙过滤规则的主题.即,"如果SYN数据包来自locahost到localhost到端口XYZ,则丢弃数据包".Windows确实有一些(隐藏的)防火墙. (4认同)
  • @ vz0:根据我的经验,Windows防火墙从不过滤到本地主机的数据包.例如,您可以运行Web服务器并在本地计算机上使用它,而无需更改防火墙规则. (3认同)
  • @JeffTucker你还觉得套接字是要走的路吗?我有一些问题,很感激你的想法.请参阅http://stackoverflow.com/questions/26653624/why-do-i-get-ipc-delays-on-20-busy-machine (2认同)

小智 27

对于后来阅读此内容的任何人,我想添加一些回答原始问题的发现.

对于我们正在开发的实用程序,我们有一个可以使用命名管道的网络类,或者具有相同调用的TCP.

以下是我们测试系统上的典型环回文件传输:

TCP/IP传输时间:2.5秒
命名管道传输时间:3.1秒

现在,如果你走出机器并连接到网络上的远程计算机,命名管道的性能会更差:

TCP/IP传输时间:12秒
命名管道传输时间:2.5分钟(是分钟!)

我意识到这只是一个系统(Windows 7)但是我认为这是一个很好的指标,表明命名管道的速度有多慢......而且似乎TCP就是这样.

  • 关于远程命名管道的评论是问题的红色鲱鱼,这是关于相同的机器场景.命名管道实际上是相同的机器对象,由内核通过共享内存实现.远程命名管道实际上是"真正的命名管道"+ SMB +用于通过SMB将通信映射到管道名称端点的专有协议.这些附加部分中可能会发生各种影响性能的事情,这与"真正的"命名管道性能无关. (15认同)
  • 高度事务性的数据交换呢,比如远程过程调用?管道有冲洗,而插座没有。所以我认为 NP 在本地机器上要好得多。 (2认同)

Bog*_*gey 7

我知道这个话题很古老,但它对我来说仍然很重要,也许其他人将来也会关注这个话题。

我通过 TCP 连接和命名管道在 Excel (VBA) 和同一台机器上的另一个进程之间实现了 IPC。

在快速性能测试中,我从客户端 (Excel) 向服务器(不是 Excel)提交了一条由 26 个字节组成的消息,并等待来自其他进程的回复消息(在示例中由 12 个字节组成)。我在一个循环中执行了很多次并测量了平均执行时间。

使用本地主机上的 TCP(Windows 7,没有快速路径),一次“对话”(请求+回复)大约需要 300-350 微秒。尤其是发送数据非常慢(通过 TCP 发送 26 字节大约需要 200 微秒)。使用 Named Pipes,一次对话平均需要大约 60 微秒 - 所以要快很多。

我不完全确定为什么差异如此之大。我测试的公司环境有严格的防火墙、包检查等等,所以我认为这可能是因为即使基于 localhost 的 TCP 连接通过了安全措施,显着减慢了它的速度,而命名管道的可能没有.

TL:DR:在我的例子中,命名管道比 TCP 快 5-6 倍,用于小包(还没有测试过更大的包)


Dan*_*Dan 2

http://msdn.microsoft.com/en-us/library/aa178138(v=sql.80).aspx

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

更不用说,如果您坚持使用 TCP,那么您将拥有可以扩展的东西,甚至在时机成熟时可以进行负载平衡。

干杯,