【问题标题】:Socket : measure data transfer rate (in bytes / second) between 2 applications套接字:测量 2 个应用程序之间的数据传输速率(以字节/秒为单位)
【发布时间】:2012-03-18 00:03:47
【问题描述】:

我有一个应用程序使用 TCP 套接字不断向第二个应用程序(消费者应用程序)发送数据。如何计算从第一个应用程序发送数据到第二个应用程序接收到数据所需的总时间?这两个应用程序都是使用 C/C++ 编码的。 我目前的方法如下(伪代码):

struct packet{
   long sent_time;  
   char* data;  
}

第一个应用(发射器):

packet p = new packet();
p.data = initialize data (either from file or hard coded)
p.sent_time = get current time (using gettimeofday function)

//send the packet struct (containing sent time and packet data)
send (sockfd, p, ...); 

第二个应用程序(消费者)

packet p = new packet();
nbytes = recv (sockfd, p, .....); // get the packet struct (which contains the sent time and data)
receive_time = get current time
data transfer time = receive time - p.senttime (assume I have converted this to second)
data transfer rate = nbytes / data transfer time; // in bytes per second

但是,这样做的问题是 2 个应用程序(发射器和消费者)之间的本地时钟时间不相同,因为它们都在不同的计算机上运行,​​导致这个结果完全无用。 有没有其他更好的方法可以以适当的方式(以编程方式)执行此操作,并获得尽可能准确的数据传输率?

【问题讨论】:

  • 没有同步的时基,你会遇到麻烦。
  • 那么客户端和服务器应用程序都在不同的计算机上运行,​​因此时钟时间不会以任何方式同步。
  • "这两个应用程序都是使用 C/C++ 编码的" 您应该选择两者之一...
  • 您可以尊重当地人并编写一个接口来计算根据当地人的差异。

标签: c performance sockets


【解决方案1】:

如果您的协议允许,您可以从服务器发回收到的数据包的确认。如果您想确保服务器接收/处理了数据,这也是必须的。

如果有,您可以简单地在客户端计算费率。只需从发送+ACK 间隔的长度中减去 RTT,您将获得非常准确的测量结果。

您也可以使用 NTP 等时间同步工具来同步两台服务器上的时钟。

【讨论】:

    【解决方案2】:

    首先:即使您的时间同步,您也会计算延迟,而不是吞吐量。在每个网络连接上,在给定的时间点都有多个数据包在传输中,从而使您的单数据包方法无法用于吞吐量测量。

    例如比较从您的手机到 HTTP 服务器的 ping 时间与最大下载速度 - ping 时间将是数十毫秒,数据包大小将是 ca。 1.5KByte,这将导致下载时的最大吞吐量比观察到的低得多。

    如果您想测量实际吞吐量,请在发送方使用阻塞套接字并发送例如系统允许的 100 万个数据包,在接收端测量第一个数据包到达和最后一个数据包到达之间的时间。

    如果您想要准确测量 OTOH 延迟,请使用

    struct packet{
       long sent_time;  
       long reflect_time;  
       char* data;  
    }
    

    并让服务器反映数据包。在客户端检查所有三个时间戳,然后反转角色以控制不对称延迟。

    编辑:我的意思是:反射时间将是“其他”时钟,因此在来回运行测试时,您将能够过滤掉偏移量。

    【讨论】:

    • 您要做的更像是确定可用带宽。为此,有iperf。您通过发送大量数据来影响结果。如果客户端发送短消息,那么您想查看这些短消息的比特率。衡量真实的场景,而不是理论限制。注意:“数据包”是指时钟+数据,而不是单个 TCP 数据包。
    • 这就是我写的:OP 正在测量延迟。这可能是有原因的(例如必须确认的短消息),但也可能没有 - 在这种情况下,传输速率是真实的:iperf 和我的方法都是这样做的。
    • 我说他实际上是在测量吞吐量(每个客户端)。使用您的 HTTP 示例,如果您的服务器包含大量小文件(例如:html、css、js、缩略图),那么使用 100M 电影进行测试将是作弊,从而产生误导性结果。但是让我们在这里停止争论,让我们看看他如何回应;)
    • HTTP 服务器上的许多小文件将是观察到的吞吐量远高于延迟可以解释的教科书示例:浏览器中的并行连接将确保在线路上有多个数据包 -这就是为什么使用它们,以使用所有可能的吞吐量(或至少更多)而不是延迟绑定的单个请求所允许的。
    • 好吧(只是为了反映他的原始场景)你怎么知道他的客户维护多个并行连接甚至能够做到这一点?对于 HTTP 服务器示例:您的客户端通常只下载几个小文件(在遍历站点时),因此您的测量仍然存在严重偏差。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多