You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 5部署Heroku切换Puma后99分位出现随机超时求助

Hey there, let's dig into this Puma/Heroku timeout issue you're seeing with your 99th percentile requests. I've helped a few folks debug similar problems after switching from Unicorn, so here's what I'd check first:

排查Puma切换后99分位请求超时的核心思路
  • 匹配Puma配置与Heroku Dyno资源
    Unicorn是多进程单线程模型,而Puma默认是多线程+多进程的组合。如果直接照搬Unicorn的进程数,再叠加默认线程数,很容易导致CPU上下文切换过载或内存耗尽(Swap使用是性能杀手)。

    • 建议根据你的Dyno规格调整:比如Standard-1x Dyno推荐workers: 2 + threads: 1,6;
    • 一定要在Puma配置里加上preload_app!,避免每个worker重复加载应用代码;如果用了Redis/DB连接池,记得在on_worker_boot钩子中重新初始化连接,防止连接被多worker共享导致异常;
    • 用heroku ps:exec进入Dyno,通过htop观察CPU使用率是否偶尔飙高,或者free -m查看是否触发Swap。
  • 排查随机路由背后的共享资源瓶颈
    既然超时涉及随机路由,大概率不是路由本身的代码问题,而是它们依赖的共享资源出现了偶发阻塞:

    • 数据库:用PG查询查看长查询或锁等待:
      SELECT pid, query_start, query FROM pg_stat_activity 
      WHERE state = 'active' AND now() - query_start > interval '5 seconds';
      
      同时确保Puma总线程数(workers × max threads)不超过数据库连接池大小,否则会出现请求等待数据库连接的情况;
    • Redis:通过redis-cli info stats查看connected_clients和blocked_clients指标,是否有突然升高的情况,避免使用KEYS *这类慢命令;
    • 第三方API:如果请求涉及外部服务,一定要给调用加超时限制(比如用Faraday设置timeout(5)),或者把异步操作抽去Sidekiq,不要让主请求等待第三方响应。
  • Dyno冷启动/重启的影响
    Heroku Dyno会定期重启(每日一次或资源超限触发),冷启动时Puma需要加载整个应用,第一个请求会异常缓慢,刚好落在99分位里。

    • 查看Heroku日志中Starting process with command的时间点,是否和超时请求对应;
    • 开启Heroku Preboot功能,或者设置健康检查端点,让Heroku在Dyno完全就绪后再导流;
    • 引入rack-timeout中间件,设置比Heroku 30秒更短的超时(比如25秒),让应用主动返回错误而非被Heroku截断,方便日志排查。
  • 线程安全问题排查
    Puma的多线程模型对代码线程安全要求更高,如果应用存在非线程安全的代码(比如全局变量、未同步的共享对象、老旧非线程安全的Gem),偶尔会触发死锁或长时间阻塞。

    • Rails 4+默认开启线程安全,可以确认config/environments/production.rb中config.threadsafe!是否启用;
    • 用derailed_benchmarks工具扫描应用中的线程安全风险点。
  • 细化日志与监控
    现有日志可能不足以定位问题,建议:

    • 给每个请求添加UUID追踪,在日志中标记request_id,方便串联整个请求生命周期;
    • 开启Puma调试日志,在配置中加入stdout_redirect '/dev/stdout', '/dev/stderr', true,通过heroku logs --tail观察线程阻塞信息;
    • 结合Heroku Observability或第三方工具(如New Relic),查看超时请求在哪个环节耗时最长。

Start with checking your Puma resource configuration and shared dependencies first—those are the most common culprits when switching from Unicorn. Then work your way down to thread safety and dyno cold starts.

内容的提问来源于stack exchange,提问作者F4Ke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:27:32