随便谈谈网络通信延迟和应用

首先丢出2个简单定理。
 
定理1
任何所谓的软件编程本质上都是面向硬件编程
 
定理2
任何软件操做的根本延迟受制于硬件循环所须要的时间
 
计算机做为一个输入输出设备,本质上就是3个步骤,输入、处理、输出。计算机之间的通信媒介,无非有线无线,其实主要是取决于介质和通信方式。
 
若是是有无线的场合,包括WiFi或者是无线电RF仍是所谓的5G,都在这个范畴。WiFi存在Jitter,这个延迟必须考虑在内,通常会考虑多个WiFi的NIC提升带宽减少延迟。民用无线电技术现在能够作到40Gbps的带宽不是问题,延迟也较低,可是这个容易有干扰,还须要无线电执照许可,好比无人机都用WiFi的公共频段,因此机器在某个场合汇集就都废了,并且干扰技术也压根不存在问题。
 
有线,只要是基于电的,那都逃不过物理定律,非超导的常温状态下,联系到基本电磁干扰和信号衰减,距离作到百米级别,带宽作到10Gbps已是极限。须要好比10Gbps以上的带宽每每都是光纤接口。这个好处是简单粗暴,买硬件设备和电缆就行。
 
可是,有些场合是不须要考虑延迟的,而是须要可靠性的,好比HTTPS的响应。TCP加上TLS这一层,这个实际上是怎么都不会快的,对于一个看网页的用户来讲,100ms和200ms的响应,是没几我的会抱怨的,经过CDN等等能够优化吞吐到很理想的状态,也就是小于100ms,接近于本地的的速度。这个WiFi的好处就是随处可得,问题是搞延迟低吞吐。
 
现在的Web应用,从TCP/IP模型看,主要是第4层应用层的折腾,IP层都不会考虑,靠买设备解决。我称之为延迟在100ms如下的应用。这个每每都是经过CDN来,可是也不会小于15ms。本质上仍是堆设备以及在现有的TCP/IP的第3层上捣鼓,优化路由优化链接,以城市为单位部署更多的节点诸如此类。
 
可是要记得,15ms是一个很高的延迟。为何这么说,由于15ms几乎是现有互联网跨地域应用的一个极限,也就是不管是你玩游戏也好,所谓的低延迟视频的也好,所谓的低延迟实时数据分析也罢,这个延迟对于现有GPCPU(看清楚,不是GPCPU)来讲,都逃不过定理2——就是说,你怎么折腾,从NIC触发中断,而后Kernel再来折腾,而后再来通知Userspace的程序去处理,若是是转发的话这个再来一遍,这个过程已经消耗了许多CPU循环,并且许多操做跟数据处理自己并没有关联。固然能够打一下Realtime Linux内核补丁,可是从根本上来讲,这些步骤都须要进行,都是基于现有的硬件之上,因此本质上也没什么意义。看到搞什么Apache Spark+Kafka的就以为搞笑,就这些Java堆起来的大路货,最多作作Web应用,在核心关键场合,这些都通通得废。
 
当你在本地跑个NodeJS,本地发个HTTP请求,那个已经最少1ms,这个就是单个PC工做站能作到的极限——跑了一圈应用程序的Runtime,到OS API,外加TCP/IP Stack,而后返回结果再从新跑一轮。在异步编程还没流行的时代,服务器的表现其实也并无太差劲,并且同步网络编程好写逻辑。可是归根结底,不管同步和异步,都是仰仗硬件架构加上OS的核心API提供给上层。应用程序得益于多线程使得逻辑和网络发包线程能够分开,可是其实只是充分利用了系统的间歇性存在的资源,和本质上的提升并没有相关。也就是说给定输入输出设备,服务器跑个Linux,不管是用libuv(C)、libevent(C)、netty.io(Java)、asio(C++)、Erlang、Scala等等随便什么框架写的应用,处理效率只可能在某个极限戛然而止。固然这里存在许多迷信成分,就是好比优化内存分配,优化链接,最后都会落实成部署更多的节点。当今C和C++语言连带框架构造的网络服务系统,是当今现有计算机体系网络性能的极限,好比Netflix。你堆什么框架,都是同样,不可能解决根本延迟问题,改进的只是开发的时间、风格、成本问题等等其余方面。
 
顺便提个GPU。这NVIDIA原本就是靠卖硬件吃饭的公司,出货量就是一切。对于应用程序来讲,如何驱动GPU工做,那得再加一层驱动核心,上层怎么CUDA或OpenCL,最后都绕不过Driver那个地方。并且Driver还不是问题,Driver自己的职责是个复杂的调用,包括DMA和设备管理了。前者会连到坑爹的IO部分,后者各自厂商有各自的应用解释层,本质上也是用一套API操做GPU。因此对于低延迟和高IO访问、随机访问的程序,GPU是不多干的过CPU。惟一的可能就是当单个步骤的线性计算量很大,CPU不划算的时候,GPU才有用武之地。看,若是GPU性能真的有纸上那么强,现有的游戏帧速度应该早就突破成千上万,GPU计算延迟应该极地,可是其实最后并无,由于指标和执行是两个概念,参考定理2。可能有人会说AI\ML加速,看,若是真的GPU是终极解决方案,那Google就没有必要发展TPU了,由于不管如何,GPGPU的架构和执行模型不可能干的过独立的芯片。
 
还能够提一下FPGA+PC。这个架构目前云端已经有,号称提供低延迟,可是其实并无解决本质问题。设想,一台装在机房里的云端节点,插上了FPGA加速卡,而后就号称能作什么了,这个就和GPU同样,很差意思还得走PCI-E总线和MMU内存控制器,通常来讲仍是得有驱动那一层干这个,否则没法驱动FPGA卡进行工做。这个FPGA表现对比GPU是折中,就是说它的硬件循环延迟要低于CPU(看具体型号),远低于GPU,可是吞吐量是不如CPU和GPU的。FPGA的性能很好计算,看FPGA的频率,看吞吐计算量,固然还有处理逻辑。有些计算FPGA很是有优点,好比FFT,固然也有限制,好比一旦牵涉到了浮点计算这个效能会下降。
 
许多文章已经考虑过FPGA和GPU,好比这一篇《 GPU vs FPGA Performance Comparison》,列出了FPGA和GPU的优劣势对比图。
 
那么对于现在的AI来讲,GPU是足够用的,好比训练视频流数据,无非就是解码后丢给训练框架,这个地方吞吐不会巨大,通常民用的所谓视频AI分析并无低延迟的需求。譬如1920x1080@30fps,首先摄像头和编码理论上须要最少2*33=66ms,而后是网络传输的时间,假设为15ms,再加上进入主机程序丢给GPU解码,解码器最少须要1-2帧的延迟,而后是训练而后输出,那么假设咱们开始训练一个摄像头的数据,从摄像头接收可见光辐射,到人类坐在办公室里看到镜头,已经须要了最少100ms,再考虑一下实际运行环境以及客户端软件编写水平的差别,最好的结果每每是小于200ms。固然这个延迟对于现在的应用来讲可用,可是延迟依然是实在是过高了。这种乐高级别的系统作作某些CV应用仍是能够的,毕竟人类没见过几个在街头蒙上面具以奥运会百米冲刺的速度飞奔。
 
那么对于特种应用来讲,假设给定网络硬件部分、CPU和操做系统,对于简单计算来讲,FPGA是会比GPU效能更高的。由于首先哪怕是50Gbps的NIC,对于单个网络应用来讲,单个会话数据流也是吃不满的。那么就是变成了,每个业务循环输入输出真正完成的时间,才是系统的总延迟。上面的关于视频的问题,显然纯粹FPGA编解码是能够达到所谓的实时性能,也就是整个系统最少有2-3帧时间的延迟。我说的是直接摄像头捕获到输出端的显示,不是什么预录制的视频编解码,这种例子一点意义都没有。
 
许多特种应用,须要极低的延迟。这个时候根据考量,若是是距离在容许范围内,通常只考虑电磁传输,好比微波通讯在金融系统中的应用。作金融通信的能够不计成本的怼高技术和硬件,提升几个ms在交易上是能够有巨大优点的。现在华尔街都是应该目标瞄准纳秒级别的通信延迟了,豪秒已经没什么搞头了——毫秒是A股水平,上海的租用的机房可以提供大概<50ms的延迟,固然套利组合那边不要创造收益率负83%而后跳楼就行。纳秒级别的通信配上全球原子钟阵列,这个能够一战。
 
如今问题了,立足于ISA和逻辑门电路的这种体系,本质上是面向GPCPU的,也就是譬如x86这种,你的每个LEA,每个CALL,对于CPU来讲都是高层API,底层流水线那边都得跑一串。解决方案固然是买卡,买FPGA卡来作,把一部分逻辑丢在网卡上作完,进入PC的都是面向高层的应用,好比数据库IO、可视化监控等等,这些都是属于非延迟关键的场合。固然最后的关键是每每买卡也是搞不定的,由于卡的延迟也会出现,最后应用套利组合的现场会受制于当前的硬件架构,这个是最高的极限,不过通常能够接受。
 
末了,我理想中最佳的低延迟方案是,1)传输部分所有是微波或者光纤,2)高度优化的网络链接接口,3)计算部分直接在硬件层次上完成,理想是ASIC,最多用一下FPGA,4)若是须要外部数据,实现一套硬件Cache,并且编码上百分之百的针对硬件的行为进行优化。这么一套组合拳下来,这个特殊系统的低延迟仍是很容易办到的。
 
本文谢绝转载。欢迎行业公司和我的联系探讨。 
相关文章
相关标签/搜索