Queueing Theory 推论集
直入正题. Little's law 推论1: 必须降低 queue depth 才能降低 latency. (注1: 如果队列不空一直有活干, throughput = workers / average latency) (注2: response time = service time + queuing delay, 降低 depth 之后显然) (注3: latency 和 throughput 互相影响, 不能同时测量. bufferbloat 可能是隐含排队过长的意思) Little's law 推论2: 处理能力不足则平均 latency 一定会上升, 另一种说法是处理能力足够则队列才有可能排空. 解决方案必然只有如下三种(可以组合使用): (1) 减少每次处理所需资源(优化或降级) (2) 追加资源 (故意保留部分资源仅供特定情况使用也是一种合理策略. 放出预留当然也是追加资源) (3) 控制访问量 (这属于另一种降级, 有些人无法获得服务了. 但是可以选择控制特定群体优先服务或者拒绝服务) 上面两个推论想想黄金周的景区门口或者是厕所就明白了. 重要结论: (0) 队列是有容量的, 填充队列或者防止队列为空即可提高利用率. 需要注意填充队列的代价(包括但不限于 queuing delay)或对其他条件的连带影响. (网络流的概念, 上面的推论1 和下面的结论(4)是约束) (1) "异步"就是引入队列的逻辑, "同步"可能表示隐含了一个容量更小的队列. (2) 在可行范围内拆成 slice (chunk, frame, packet 等同理), 具体粒度是另一个问题. (2.1) 能拆就很可能意味着能够分治(即避免串行, 不能拆的临界区应当考虑如何缩小), 并行后加速比用 Amdahl's law 计算, latency 则是 Gustafson's law. (2.2) 拆成 slice 之后, 哪怕是完全同样的负载, 由于队列的存在, 仍然会因为分布不均产生 tail latency. 需要用 backup request 等方法处理. (3) 请求分类, 这类似于"术业有专攻"的概念. 引入了分类之后应当直接想到优先级和多队列, 然后形成调度的理论. 含有某些特征的数据可以拒绝服务. (4) 流量与拥塞控制 (前馈和反馈要参考自动控制理论). bufferbloat 也是一个重要概念. 所谓 back-pressure 指的也是这件事. 由此可得若干状态变换: 轻负载态 - 平衡态 - 过饱和态(及过饱和排空态). 过饱和态时的测量数据不完全可信, 限制流量完成减压和传播操作(包括正传播和逆反馈)后确定真上限值再回到平衡态. (5) 系统维护操作会占用系统资源. 思考题: Brendan Gregg 提出的 The USE Method (Utilization Saturation and Errors) 应当怎样解释? (E 的部分这里可以忽略) 思考题2: 在高负载的时候很多情况下"关掉一部分机器"比添加处理能力更好, 为什么?