在将近六个月的时间里,一切似乎都运行良好。那漫长的平静是危险的部分。
一个 Web 应用程序使用亚马逊弹性文件系统 (EFS) 作为共享存储。多个应用程序实例可以访问相同的文件,部署非常简单,而且没有明显的理由质疑架构。
然后,看似没有警告,该网站变得极其缓慢,最终似乎完全停止运行。服务器负载异常高,请求超时,应用程序进程开始堆积。
乍一看,它看起来像是一个计算问题。不是。真正的原因是EFS爆发信贷余额的耗尽。
为什么故障看起来像 CPU 问题
误导性症状之一是 Linux 平均负载过高。高平均负载不一定意味着 CPU 得到充分利用。它还包括以不间断状态等待的进程,这种情况通常发生在存储 I/O 时进程被阻塞时。
应用程序工作人员正在等待 EFS 操作完成。新的请求不断到来,更多的工作人员被封锁,请求队列也越来越多:
- EFS 吞吐量受到限制。
- 文件操作花费了更长的时间。
- 应用程序工作人员仍忙着等待 I/O。
- 累积了传入的请求。
- 系统负载增加。
- 该网站最终几乎不可用。
增加 CPU 容量并不能解决潜在的问题。
为什么花了六个月才失败
EFS 文件系统已配置为使用 突增吞吐量 模式。在此模式下,可持续的基准吞吐量与 EFS 标准存储类中存储的数据量有关。当工作负载保持在该基准以下时,文件系统会累积突发积分。当吞吐量超过基准时,这些积分将被消耗。
这会为相对较小的文件系统带来潜在的欺骗性情况:
- 存储的数据量导致可持续的基线吞吐量低。
- 现有的积分余额暂时允许更高的吞吐量。
- 即使应用程序的长期工作量超过可持续基准,该应用程序仍能正常运行。
- 在积分可用时,不平衡仍然隐藏。
- 当余额达到零时,性能会急剧下降。
在这种情况下,累积的积分持续了大约六个月。从吞吐量的角度来看,该架构的规模已经不大,但是积分余额掩盖了这个问题。这是一个缓慢移动的容量问题——一个持续了六个月的定时炸弹。
决不能将临时突发性能误认为是可持续的吞吐量。
选择适当的 EFS 吞吐量模式
突增吞吐量
当吞吐量随存储数据量的增加而自然增长,并且活动频繁之后是较为平静的时段时,突增吞吐量是合适的。这需要仔细监测。信贷余额的持续下降表明,在这种模式下,工作量是不可持续的。
弹性吞吐量
弹性吞吐量通常更适合不可预测或波动剧烈的工作负载。吞吐量会自动随需求扩展,因此应用程序不依赖有限的突发积分余额。这提高了运营弹性,尽管应针对持续高吞吐量的工作负载评估其基于使用量的成本。
预置吞吐量
当所需的吞吐量已知且高于存储数据量原本可以支持的吞吐量时,预置吞吐量很有用。它提供不受文件系统大小影响的可预测容量,但必须根据需求的变化审查配置级别。
同样重要的是不要混淆 EFS 吞吐量模式 用它的 性能模式。吞吐量模式决定如何提供吞吐容量;性能模式涉及延迟和并行度等特征。
本应到位的监测
对于使用突增吞吐量的 EFS 文件系统,最重要的 CloudWatch 指标是 BurstCreditBalance。有用的监测基准还应包括:
BurstCreditBalance检测持续的信贷枯竭PercentIOLimit确定文件系统何时接近其 I/O 限制PermittedThroughput了解当前的可用吞吐量MeteredIOBytes和TotalIOBytes观察 I/O 消耗- 应用程序延迟、请求持续时间、超时和错误率
- 等待 I/O 的进程,与负载和实际 CPU 利用率相关
仅监控 CPU、内存和 HTTP 状态代码是不够的。共享存储是一种关键的应用程序依赖关系,必须作为服务的一部分进行监控,而不仅仅是基础架构组件。
警报应该在积分余额达到零之前就触发。更重要的是,必须对趋势进行评估。几周内持续下降的余额已经表明了结构性吞吐量赤字,尽管绝对平衡看起来仍然令人满意。
我会做些什么不同的事情
- 估算设计阶段的可持续吞吐量。
- 根据实际访问模式选择吞吐量模式。
- 将爆发积分视为临时余量,而不是普通容量。
- 针对积分余额和 I/O 限额创建 CloudWatch 警报。
- 监控积分的消耗率。
- 在负载测试中包括 EFS 吞吐量和延迟。
- 将 Linux 负载与 CPU 利用率和 I/O 等待相关联。
- 查看经常访问的文件是否真的需要共享网络存储。
- 在存储限制和延迟增加的情况下测试应用程序的行为。
- 记录更改吞吐量模式的操作程序。
最后的外卖
EFS 可以是出色的共享存储解决方案,但其行为在很大程度上取决于所选的吞吐量模式和工作负载概况。
这起事件的危险之处不仅仅是性能下降。危险之处在于,该系统在降解之前运行了六个月。突发信贷余额将明显的失败推迟了足够长的时间,足以让人们对不可持续的架构产生信心。
最好的防御措施不是增加信用余额。它正在选择正确的吞吐量模式,了解可持续的吞吐量,并在用户注意到之前监控显示出日益加剧的不平衡的指标。
BERND KUHLEN所有笔记 ↗