UdpSocket recv_from性能问题

时间:2015-08-28 11:35:29

标签: udp rust

我不确定这是否是特定于语言的问题,但我不妨试试。
对于我们公司的项目,我们试图通过UDP实现22MB大文件的数据传输协议。我们知道TCP更适合这种情况,但硬件开发决定它必须是UDP
我们得到的逻辑是客户端通过1500字节大小的包发送22MB文件。每个包的标题中都有一个唯一的ID。第一批这些~15000个软件包需要大约一秒的时间来传输,但由于使用了UDP,我们当然会损失大约2000个软件包。

每批包都以一个独特的“最终包”结束,告诉我们,来自客户端的传输已经完成,我们可以通过他们的唯一ID开始请求丢失的包。由于限制,我们一次只允许请求255个包,因此我们必须发送大量重发请求。由于最终封装,我们不必使用套接字超时,每个请求周期必须大约250ms才能有效地避免仍然需要传输的软件包,从而导致大量的时间浪费。 />
现在就实际问题:
虽然请求255个包并接收它们的第一个周期需要0.01秒,但每个周期后需要0.4秒。我已经将问题的根源追溯到“recv_from”函数。我确保它在每个循环中收到相同数量的软件包,然后在“end-package”结束,虽然它甚至可以达到完全相同的字节数,但它需要40倍的时间。 />

fn receive( socket: &UdpSocket, buf: &mut [u8;1600] ) -> Vec<Vec<u8>>{
    let mut res: Vec<Vec<u8>> = vec![];

    let mut x = Duration::seconds( 0 );
    loop{
        // time tracking
        let start = PreciseTime::now();
        let ( n, _ ) = socket.recv_from( buf ).unwrap();
        let end = PreciseTime::now();
        x = x + ( start.to( end ));

        // difference in time doesn't occur here
        let mut v = vec![];
        v.push_all( &buf[ 0..n ]);

        // this is an end-package
        if v[8] == 240 {
            break;
        }
        res.push( v );

    }
    // first call of this function with 255 received package takes 0.01s, each consecutive call takes 0.4s
    println!{ "NOTE: Total transmission time: {}s", x };

    // the higher this value, the less the difference in times between the first and the consecutive calls
    // at ~ 500ms it evens out at about 0.02s per call of 255 received packages
    sleep_ms( 100 );
 res
}    


对于巨大的文本墙感到抱歉,这个问题带来了很多背景;甚至不确定我是否提到了相关的一切。

0 个答案:

没有答案