39

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

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

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

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

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

两个应用程序的合并不是一种选择。现在我们被两个进程配置困住了。

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

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

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

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

4

6 回答 6

34

它将是相同的(或至少没有明显不同)。Winsock 足够聪明,可以知道它是否正在与同一主机上的套接字通信,在这种情况下,它将使 IP 以下的几乎所有内容短路并直接将数据复制到缓冲区。在命名管道与套接字方面,如果您将来可能需要能够与不同的机器进行通信,请选择套接字。如果您知道您永远不需要这样做,请选择您的开发人员最熟悉或最熟悉的那个。

于 2012-06-04T01:03:39.353 回答
30

对于稍后阅读本文的任何人,我想添加一些回答原始问题的发现。

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

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

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

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

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

我意识到这只是一个系统(Windows 7)但我认为它是命名管道有多慢的一个很好的指标……而且似乎 TCP 是要走的路。

于 2012-06-27T15:33:18.120 回答
7

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

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

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

使用 localhost 上的 TCP(Windows 7,无快速路径),一次“对话”(请求+回复)大约需要 300-350 微秒。尤其是发送数据非常慢(通过 TCP 发送 26 个字节大约需要 200 微秒)。使用命名管道,一次对话平均需要大约 60 微秒 - 所以要快很多。

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

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

于 2018-03-30T17:07:47.777 回答
2

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

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

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

干杯,

于 2012-06-03T18:25:42.963 回答
1

在您描述的场景中,本地 TCP 连接不太可能成为瓶颈。当然,它会引入一些开销,但这应该可以忽略不计,除非你的 CPU 已经很热了。

猜测一下,如果您的服务器的 CPU 使用率通常低于 50% 左右(使用代理),则不必担心最小化与本地 TCP 连接相关的开销。

如果 CPU 使用率经常超过 80%,您可能应该进行一些分析。我将首先比较代理到位时的 CPU 负载(或者,如果可以有意义地测量它,性能更好)。除非代理正在执行一些复杂的处理,否则与额外 TCP 连接相关的开销可能是代理引入的总开销的很大一部分,因此这应该至少为您提供一个数量级的估计值d 通过使用更有效的 IPC 形式获得收益。

于 2012-06-04T00:48:31.507 回答
0

在同一台机器上有代理的原因是什么,只是好奇?

反正:

IPC有几种方法,TCP/IP,命名管道在速度和复杂度上是相当的。如果您真的想要可扩展且几乎没有开销的东西:使用共享内存。最好与无锁算法结合使用以推进指针(或为每个读取器(代理/服务)和写入器(服务/代理)使用一个缓冲区)。

于 2012-06-03T18:26:23.920 回答