【问题标题】:Finding bottleneck in TCP connection查找 TCP 连接中的瓶颈
【发布时间】:2018-10-17 22:28:14
【问题描述】:

我正在开发一个项目,该项目有一个发布者和一个订阅者,通过常规 TCP 套接字连接进行连接。发布者以一定的速率生成消息,通过套接字发送它们,然后订阅者处理这些消息。没有消息队列,只有纯 TCP 套接字连接。

问题是发布者中的套接字“write”方法在调用时似乎需要很长时间,这降低了发布者发送数据的速率。

我一直在做一些关于套接字的阅读,并且可以想到两种可能导致这种情况的情况:

  1. 网络速度不够快,无法处理发送消息的发送速率。在这种情况下,我认为发布者上的套接字出站缓冲区应该被填满。

  2. 消费者处理消息的速度很慢,因此我希望消费者的入站缓冲区已满。这将(据我了解)导致套接字写入方法阻塞。

我还在学习套接字编程,我不确定我上面的分析是否有意义。如果是这样,确定它是哪种情况的好方法可能是什么?需要注意的一点是,消费者在 Linux 机器上,而发布者是 Windows 机器。任何帮助,将不胜感激!

【问题讨论】:

    标签: linux windows sockets networking tcp


    【解决方案1】:

    您可以测量接收方在read()recv() 方法中花费了多少时间,或者它调用的任何从网络中读取的时间。

    如果很少,总是有数据堆积,所以读取慢是接收器的错。

    如果读取阻塞的时间很长,那是网络慢的原因。

    【讨论】:

    • 这是我想到的,但是我在消费者 (q) 上使用的语言已经内置在通过 TCP 运行的 ipc 中,并且是基于事件的,这意味着我无法控制读取时间方法。话虽如此,我确实设法使用 netstat 命令查看了该进程的 Recv 队列,它始终显示为 0。我还对消费者处理函数进行了基准测试,这似乎表明它应该能够处理更多负载。这让我相信,很可能是发布者推送消息的速度不够快。
    • 嗯,这相当于同一件事。它的套接字接收缓冲区通常是空的。所以它不允许数据备份。所以它是网络或出版商。查看发布者发送缓冲区的状态。
    • 确实如此。我想弄清楚如何检查 Windows 中发送缓冲区的大小。
    • (Not downvoter) read 和 recv 的性能很可能不是这里的问题。我会看看交通。尝试捕获发送方和接收方的流量,并在wireshark 中查看它们。如果丢失很多,发送方的拥塞控制可能会限制吞吐量。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多