Incast 是指一种多对一的通信模式,常见于部署了大量的分布式存储或者计算服务(如Hadoop, MapReduce, HDFS, Cassandra等)的数据中心中。当然,Incast 也可以特指 TCP Incast,因为上述这些服务大部分都是基于 TCP 的。
Incast 发生在一个 client 同时向后端的多个 server 节点发起数据请求,在某些情况下,server 集群会同时响应这些请求,那么在某一段时间内会出大量的服务节点会向同一个机器发送数据的情况,从而在短时间内使得一个服务器接收的流量激增。由于应用类型的不同,Incast 模式中的数据流可能存在的时间会非常短,例如,client 向40个 server 节点各发送一个数据请求,假定每个请求会回应一个2KB的数据,那么每个节点实际上只回应了2个IP包。
TCP Incast 也用于描述由 Incast 通信模式导致的网络拥塞。短时内的流量激增会导致接收服务器的所对应的交换机的出口处发生拥塞,交换机的出端口的缓存溢出,使得部分数据包被丢弃,而发送服务器感知到丢包之后需要重传之前的数据包,最终导致单个 TCP 流的报文吞吐增长缓慢。另外,接收服务器上的应用可能需要等到接收完全部的数据,或者因为超时的原因只是返回部分数据,无论是以上何种方式,服务器的速度、质量以及稳定性都受到了影响。更加不幸的是由 Incast 引起的拥塞能很容易的被应用和使用这些应用的用户感知。
我们通常会认为应用的性能会随着集群节点数量的上升而上升,越大的集群提供的分布式处理能力能在同一时间内处理更多的任务请求,但是越大的集群也意味着越多的 Incast 流量,从而引发越来越多的网络拥塞以及由此导致的 TCP 性能下降。于是,我们需要面对两个基本问题:一,Incast 所造成的拥塞到底在多大程度上影响了应用服务的性能;二,降低 Incast 所带来的方法有哪些。