【发布时间】:2015-10-28 15:18:47
【问题描述】:
我写了一个server in c,它从端口X 中的客户端接收UDP 数据。我使用Epoll(non block) 套接字进行UDP 监听,并且只有一个线程作为工作线程。伪代码如下:
on_data_receive(socket){
process(); //take 2-4 millisecond
send_response(socket);
}
但是当我发送5000 concurrent(使用线程)请求服务器错过5-10%请求。 on_data_receive() 从未要求 5-10% 的请求。我正在本地网络中进行测试,因此您可以假设没有丢包。我的问题是为什么 on_data_receive 没有要求一些请求?套接字的连接限制是多少?随着并发请求的增加,丢包率也随之增加。
注意:在将请求发送到服务器之前,我使用了长达 200 毫秒的随机睡眠。
【问题讨论】:
-
你永远不能假设 UDP 没有丢包,即使在本地网络上也是如此。
-
cat /proc/sys/fs/file-max的输出是什么? 5000 个线程和 5000 个连接可能会耗尽内存? -
调用系统函数的第二个参数是什么:
listen()?通常(嵌入式Linux实际上对UDP数据包进行排队)如果接收者在下一个数据包到达之前还没有准备好读取UDP数据包,则第一个数据包会丢失/被下一个UDP数据包覆盖。代码实际上是否为每个数据包创建一个新连接?如果是这样,那将大大减少可用的吞吐量 -
请发布实际代码。现代计算机应该能够跟上数据包之间平均 100 毫秒的 UDP 连接
-
没有UDP连接这样的东西。