神话般的 I/O 绑定 Rails 应用程序

主要观点:

  • 讨论 Rails 应用性能,指出数据库常是瓶颈但不意味着应用大部分时间在等 IO,多数性能问题是数据库相关问题。
  • YJIT 能降低应用延迟,说明多数 Rails 应用并非 IO 绑定,很多人因 CPU 饥饿误判应用 IO 情况。
  • 背景作业队列(如 Sidekiq)更 IO 密集,用户易过度设置并发导致 IO 变慢。
  • 了解 Rails 应用等待 IO 的时间比例对选择部署执行模型很重要,如 IO 绑定用异步,较 IO 重用线程,不超半时间用纯进程。Rails 也因该原因将 Puma 配置线程数从 5 改为 3。

关键信息:

  • Rails 多数为无状态,可水平扩展,数据库垂直扩展,数据库瓶颈指服务使用增加时需重点关注的部分。
  • 多数 Rails 性能问题如缺失索引等是可修复的 bug,索引良好且数据库不超载时查询快。
  • YJIT 使多个应用延迟降低,证明多数应用非 IO 绑定。
  • CPU 饥饿易致误判 IO 情况,共享主机平台更易出现,Ruby 有 GVL 使该问题更明显,CPU 和 IO 工作负载不宜混合。
  • 背景作业队列更 IO 密集,易因并发过高致 IO 变慢。

重要细节:

  • 数据库默认水平扩展难,需实现数据分片,垂直扩展成本非线性。
  • YJIT 在无 IO 基准测试中使 Ruby 提速 2 - 3 倍,实际应用中约 1.7 倍。
  • 可通过特定方式判断应用是否存在 CPU 饥饿。
  • Ruby 社区不应忽视 Ruby 性能,很多 Rails 和常用 gem 可优化但因公共 API 受限。
阅读 10
0 条评论