• 分享一个网络latency的故事


    由于最新的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。

  • 相关阅读:
    解决chrome console打印的信息一闪而过
    Docker 构建自定义镜像
    Docker 镜像、容器、仓库
    Docker 简介、下载安装
    执行yum list installed | grep xxx 命令时报错:未提供依赖perl-DBD-SQLite、perl-DBI
    SpringBoot 配置多种运行环境
    SpringCloud Config 分布式配置管理
    SpringCloud Sleuth+Zipkin 分布式链路追踪
    Dubbo 配置中心、元数据中心
    dubbo admin的使用
  • 原文地址:https://www.cnblogs.com/zzSoftware/p/2934189.html
Copyright © 2020-2023  润新知