从堵车现象看计算机系统的吞吐量

160 阅读4分钟

每逢假期,堵车问题就会冲上头条,成为怨声载道的话题。为什么会堵车?你可能会说是车太多了,或者有车祸,这些回答都没错。但当你仔细分析、全面定义这个问题时,会发现它和计算机系统的流量调度问题十分相似。两者本质上面临的都是关于系统吞吐量的问题。

如果从整个高速网络来看,里面分布了多条错综复杂的从起点到终点的路段,为了简化问题,我们选取其中任一一对高速收费入口站点和出口站点作为研究对象,那么,这其中每一段路程可视为一个系统,整体高速网络就是由这多个系统组成的。

站在全局视角看,这个系统中的车辆流出流入情况,代表了这个系统的吞吐能力,单位时间内这个系统能通过的车量越多,吞吐能力就越强。那这个系统的吞吐量受什么影响呢?

首先,每量车的通过时间,直接影响了整个系统的吞吐量。在计算机系统中,它就对应着单个请求的处理时间。那这个处理时间受哪些因素影响?

  1. 首先,单量汽车的速度无疑是影响最大的。让我们来展开分析一下,车速受内部和外部因素影响。
  • 首先,内在因素是车辆自身可掌控的部分,包括驾驶员主观的行驶速度、车辆的时速上限;改变内部因素相对容易,杠杆率高,例如通过制定一些规范就可达到,如禁止高速龟速行驶、禁止非机动车上高速。对标计算机系统而言,就是通过一系列性能优化方法(缓存、异步等)和算法优化提升程序的内部运行效率;
  • 其次,外在因素是车辆自身无法控制的外部环境,包括不同车道的时速限制、以及路况。改变外部环境不容易,需要综合考虑很多因素,但它的收益是巨大的,例如:很多路段、隧道的限速是制约吞吐量的关键因素,对标计算机系统而言,就是服务器等硬件能力的提升、磁盘读写性能的加快;一辆车的突发情况,可能会导致影响整个车道、甚至整个路段,这就是典型的蝴蝶效应。例如很多时候的大范围堵车,是因为首车突然事故,或者突然降速,这会引发一系列的连锁反应,在车流量增大时引发系统雪崩。为什么会出现这个现象?本质原因是系统中的资源是有限的,单个点的异常情况,加剧了系统的资源稀缺,产生了放大效应。对标计算机系统而言,我们就理解了少量蜗牛接口的危害,理解内存溢出的恶劣影响,因为它们和交通事故一样,都是由于对系统资源造成了独占式的争抢,并在qps增大时对局部问题产生了放大效应。
  1. 其次,并发能力是影响系统吞吐量的重要因素。在高速网络中,车道的数量,决定了整个系统并发能力的上限。但是不是车道数量越多越好?答案是否定的。为什么?因为在系统中,往往会存在一些暂时无法解决的资源瓶颈,也是这些x因素,制约了系统吞吐量的提升。例如,在高速路上可以增加车道数量以提升系统吞吐量,但最终系统反馈的吞吐量增长和车道数量的增长是不成线性比例的,车辆在多个车道间频繁的切换车道超车、减速,会影响整体的效率,另外,系统的真正瓶颈在高速收费站或车辆汇入汇出的交口,因为大量的车需要在这些地方减速,排队出行。对标我们的计算型系统,我们当然可以增加cpu核数、增加线程池的最大线程数量,以此提升系统的吞吐量,但是最终系统整体能力增长和CPU核数、线程数量也不成线性比例,因为频繁切换线程会带来额外的开销,而且系统的IO是整个系统的真正瓶颈,大多数系统会涉及计算与IO交互,虽然计算资源可以并行,但在IO资源上确是跨不过去的槛。这也是redis可以高性能的原因,因为它避免了IO操作。