博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分享一个网络latency的故事
阅读量:5796 次
发布时间:2019-06-18

本文共 1084 字,大约阅读时间需要 3 分钟。

由于最新的Windows 8对于WiFi 传输有Latency的要求,最近一直在忙这件事。

MS要求Peer到Peer之间的Lantency要小于几十个毫秒吧。这段时间可以划分为一下这几个部分:

APP-->Driver--(Air)-->Driver in Rx side-->APP in Rx side。

我发现在Receiver这一端,经常会发生Driver Indicate Packet给OS到APP收到这个包,有时候会有大的延时。

因为用的是UDP,理论上应该没有window,sequence number这种概念,OS只要收到一个数据包就应该通知APP。

 根据Driver的现状一开始以为可能跟下面这些因素有关:

1.Resource,因为Driver Pre-allocated的一些memory有可能会不够。

2.Disorder,Driver发送IP layer的数据包,有时候存在乱序。

但是Debug,fix了1,2这两个问题,latency还是很大,有几十ms.

终于在下班前想到一点,就是APP本身的问题,APP是一个同事写的,下面简单描述下Rx端的伪代码:

config socket... for(;;){WSARecvFrom(socket,...);...Do something....}

发现Latency其实就在于Do something花费了一段可观的时间。代码的逻辑导致APP需要逐个处理数据包,Do something需要花费大概2ms。也就是说1s最多能handle500个Packet,但是Driver有时在1s内会indicate将近800个Packet给OS。所以导致APP这边存在瓶颈,OS只有等APP处理玩当前数据包,才传下一个给APP。

To fix,就是要尽量缩短Do something暂用的时间。APP的架构需要变一下,用两个Thread,一个只管收,占用时间要短,另一个做Do something的处理。

BTW,介绍下Windows精确计时的方法:

UserMode: QueryPerformanceCounter()/QueryPerformanceFrequency();

KernelMode: KeQueryPerformanceCounter(&PerformanceFrequency);

用上面这几个函数就可以了,具体用法见MSDN。

转载于:https://www.cnblogs.com/zzSoftware/archive/2013/02/26/2934189.html

你可能感兴趣的文章
js 经过修改改良的全浏览器支持的软键盘,随机排列
查看>>
L104
查看>>
被遗忘的CSS
查看>>
做完小程序项目、老板给我加了6k薪资~
查看>>
脱离“体验”和“安全”谈盈利的游戏运营 都是耍流氓
查看>>
TortoiseSVN中图标的含义
查看>>
Python version 2.7 required, which was not foun...
查看>>
[BZOJ] 1012 [JSOI2008]最大数maxnumber
查看>>
根据毫秒数计算出当前的“年/月/日/时/分/秒/星期”并不是件容易的事
查看>>
Unity Shaders and Effects Cookbook (3-5) 金属软高光
查看>>
31-hadoop-hbase-mapreduce操作hbase
查看>>
NYOJ283对称排序
查看>>
C#反射实例应用--------获取程序集信息和通过类名创建类实例
查看>>
VC中实现文字竖排的简单方法
查看>>
程序员常用的六大技术博客类
查看>>
深入理解浏览器的缓存机制
查看>>
又拍云沈志华:如何打造一款安全的App
查看>>
dubbo源码分析-架构
查看>>
6套毕业设计PPT模板拯救你的毕业答辩
查看>>
Windows phone 8 学习笔记
查看>>