【问题标题】:how TCP can be tuned for high-performance one-way transmission?如何调整 TCP 以实现高性能单向传输?
【发布时间】:2011-07-06 03:04:48
【问题描述】:

我的(网络)客户端每 200 毫秒向我的服务器发送 50 到 100 KB 的数据包。有多达300个客户。服务器不向客户端发送任何内容。服务器(专用)和客户端位于 LAN 中。如何调整 TCP 配置以获得更好的性能? Windows Server 2003 或 2008 上的服务器,Windows 2000 及更高版本上的客户端。

例如TCP 窗口大小。更改此参数有帮助吗?还要别的吗?有什么特殊的套接字选项吗?

[编辑]:实际上在不同的模式下数据包可以达到 5MB

【问题讨论】:

  • 我没有看到任何与编程相关的内容。它可能属于服务器故障。
  • “套接字选项”听起来像是对我的 setsockopt() 的调用...
  • @David:我想可以从代码中配置一些选项
  • 通过代码配置的选项并不意味着编程,除非想法是以编程方式更改它们。

标签: windows performance networking tcp


【解决方案1】:

几年前,我使用 1700 个数据点对此进行了研究。结论是,你能做的最好的事情就是在接收器上配置一个巨大的套接字接收缓冲区(例如 512k)。对侦听套接字执行此操作,因此它将被接受的套接字继承,因此在它们握手时已经设置了它。这反过来又允许在握手期间协商 TCP 窗口缩放,这允许客户端知道窗口大小 > 64k。巨大的窗口大小基本上可以让客户端以最大可能的速率传输,只受拥塞避免而不是关闭接收窗口的影响。

【讨论】:

  • 很棒的答案。我希望我能为它 +5
【解决方案2】:

什么操作系统? IPv4 还是 v6? 为什么这么大的垃圾场;为什么不能分解?

假设一个稳定、稳定、低带宽:延迟产品,您可以调整飞行大小、初始窗口大小、mtu(取决于数据、IP 版本和模式[tcp/udp]。

您还可以循环或平衡输入,因此您可以减少 nic 的中断时间。绑定也是一种选择。

5MB /数据包/?这是一个非常糟糕的设计.. 我认为它会导致大量的段重新传输,并且在序列重建/重新传输中使用大量内核/堆栈内存(接受等待时间等)..

(这可能吗?)

【讨论】:

  • 我认为他的意思是每个发送调用而不是每个数据包 5MB。可能他所依赖的任何抽象都是以完全透明的方式将数据拆分为数据包。
  • winserver 2003/2008(服务器)和 windows 2000 及更高版本(客户端)。默认情况下为 IPv4。 IPv6 在这种情况下是否提供任何好处或只是不同的调整?对不起,我不明白你的一些想法。什么可以分解?顺便说一句,数据已经被压缩。您能否详细说明“循环或平衡输入”和“绑定”?在某些模式下可能有 5MB 块。这个事实如何描述设计质量? :) 我只是发送它们,然后 TCP 堆栈将它们拆分为数据包。这很糟糕吗?
【解决方案3】:

由于所有客户端都在 LAN 中,您可以尝试启用“巨型帧”(需要为此运行 netsh 命令,需要谷歌搜索精确的命令,但有很多方法)。

在应用层,您可以使用 TransmitFile,它是 Windows 的 sendfile 等价物,在 Windows Server 2003 下运行良好(在“非服务器”下它被人为地限速,但这不会成为问题)你)。请注意,如果您动态生成数据,则可以使用内存映射文件。

至于调优参数,增加发送缓冲区可能不会给您带来任何好处,尽管增加 receive 缓冲区在某些情况下可能会有所帮助,因为它可以减少接收应用程序丢弃数据包的可能性处理传入数据的速度不够快。更大的 TCP 窗口大小(注册表设置)可能会有所帮助,因为这允许发送方在必须阻塞直到 ACK 到达之前发送更多数据。

提高程序的工作集配额可能值得考虑,它不会花费您任何成本并且可能是一个优势,因为内核在发送页面时需要锁定页面。允许锁定更多页面可能会使事情变得更快(或者可能不会,但也不会受到伤害,无论如何默认值都低得离谱)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 2013-09-21
    • 1970-01-01
    • 2023-02-26
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多