菜单

性能 vs 可伸缩性

相关源文件

本页面探讨了系统设计中性能和可伸缩性之间的根本区别。理解这些概念对于设计能够处理增长同时保持响应性的系统至关重要。有关延迟和吞吐量的相关主题,请参阅延迟与吞吐量

定义与核心概念

性能和可伸缩性虽然相关,但它们解决了系统高效处理工作的不同方面。

如果一个服务能够随着资源的增加而按比例提升性能,那么它就是可伸缩的。通常,提升性能意味着处理更多的工作单元,但也可以是处理更大的工作单元,例如当数据集增长时。

性能问题与可伸缩性问题的明确区分

  • 性能问题:您的系统对于单个用户来说很慢
  • 可伸缩性问题:您的系统对于单个用户来说很快,但在高负载下变慢

来源:README.md413-420

衡量性能与可伸缩性

性能指标

  • 响应时间:处理单个请求所需的时间
  • 延迟:请求从发出到产生结果之间的时间延迟
  • 资源利用率:单个操作的 CPU、内存、磁盘 I/O、网络使用情况
  • 错误率:导致错误的请求百分比

可伸缩性指标

  • 吞吐量:每单位时间处理的请求数量(请求数/秒)
  • 并发用户/连接数:系统可以处理的并发用户数量
  • 性能下降点:性能开始下降时的负载水平
  • 每请求成本:随着负载增加,系统利用资源的效率

来源:README.md413-420

伸缩策略

垂直伸缩(纵向扩展)

垂直伸缩涉及向现有机器添加更多计算能力。虽然概念上简单,但这种方法有其局限性。

水平伸缩(横向扩展)

水平伸缩将负载分布到多台机器上,实现了几乎无限的增长潜力,但需要架构上的改变。

来源:README.md703-713

常见瓶颈及解决方案

在设计性能和可伸缩性时,您必须识别并解决潜在的瓶颈

组件性能瓶颈可伸缩性瓶颈解决方案方法
应用程序低效算法、阻塞操作线程争用、并发性不足优化代码、使用异步处理
数据库慢查询、索引不佳锁竞争、连接限制索引、查询优化、连接池
存储I/O 密集型操作磁盘容量、IOPS 限制缓存、CDN、SSD、分片
网络延迟、带宽连接限制、饱和压缩、协议优化、CDN
内存内存不足、垃圾回收高单请求内存使用内存优化、缓存策略

来源:README.md703-713 README.md1083-1273

垂直伸缩与水平伸缩对比

在解决可伸缩性挑战时,选择垂直伸缩还是水平伸缩取决于您的具体需求

方面垂直伸缩水平伸缩
实现向现有服务器添加更多资源(CPU、RAM、磁盘)添加更多服务器来分担负载
复杂性较低,实现更简单较高,需要架构调整
成本初始成本较高,高端硬件昂贵单位成本较低,使用通用硬件
限制硬件限制,单点故障理论上无限,网络可能成为瓶颈
停机时间通常需要停机才能升级无需停机即可完成
用例用户群有限、有特殊硬件需求的应用程序Web 服务、分布式应用程序、可变工作负载
状态管理更简单的状态管理(所有内容都在一台机器上)需要分布式状态管理、会话共享

来源:README.md703-713

兼顾性能与可伸缩性的应用程序设计

设计能够同时处理性能和可伸缩性问题的应用程序需要平衡多个因素

来源:README.md413-420 README.md703-713

性能测试与可伸缩性测试

性能测试与可伸缩性测试不同

性能测试可伸缩性测试
侧重于响应时间和资源使用情况侧重于负载增加时的行为
使用一致的、受控的负载逐渐增加负载直到系统崩溃
指标:响应时间、延迟、错误率指标:吞吐量、性能下降点
工具:性能分析器、APM 工具工具:负载生成器、分布式测试框架
示例:“我们能否在 100 毫秒内处理此事务?”示例:“我们可以支持多少并发用户?”

来源:README.md941-951

性能与可伸缩性之间的权衡

在设计系统时,您通常需要在优化单用户性能与多用户可伸缩性之间进行权衡

来源:README.md439-465

最佳实践

为实现良好的性能和可伸缩性

  1. 从一开始就以可伸缩性为念进行设计 - 事后添加可伸缩性会更困难
  2. 识别并优化瓶颈 - 使用性能分析来发现真正的限制
  3. 策略性地实施缓存 - 在多个层面进行缓存(客户端、CDN、应用程序、数据库)
  4. 设计为无状态 - 无状态组件更容易进行水平伸缩
  5. 应用异步处理 - 将耗时操作与请求-响应周期解耦
  6. 实现高效的数据访问模式 - 优化查询、索引和数据结构
  7. 持续监控和测量 - 不测量就无法改进
  8. 选择合适的伸缩策略 - 根据需求选择垂直、水平或混合伸缩
  9. 设计应对故障 - 系统在极端负载下应能优雅降级
  10. 持续重构和改进 - 可伸缩性是一个持续的过程,而非一次性修复

来源:README.md413-420 README.md703-713 README.md941-951

结论

理解性能和可伸缩性之间的区别是有效系统设计的基础。性能问题导致系统对单个用户来说很慢,而可伸缩性问题则在高负载下显现。理想情况下,系统应通过仔细的架构设计、测试和持续改进来有效处理这两个方面。

请记住,一切都是权衡。通常,过度优化单用户性能可能会使伸缩变得更加困难,而高度分布式的可伸缩系统可能会引入影响基线性能的开销。