为什么 Grape/api/call 占用很多执行时间?

ruby
产品

#1

###分析
首先,慢的这个方法在 Grape 框架中的源码为:

  def call(env)
    LOCK.synchronize { compile } unless instance
    call!(env)
  end

这个 Compile 方法是初始化 Api 实例时用的,即如果未发生 API 调用的话,不会产生实例,第一次发生 API 调用时才会产生实例。而第一次初始化耗时是比较长的,
要初始化路由等等信息,而且如果稍有并发,都会阻塞在这里,等待产生 Grape::API 实例。

###结论
如果有过多的这样的慢事务出现在 OneAPM 的慢事务列表中,可能的原因是:

这个 Grape 进程是被重启后第一次被调用。
如果用 God 或者 Monit 类似的工具在监控 Grape Server(如 thin,goliath 等)的话,可以查看一下 log 是不是经常因为耗费了过多的 CPU 或者 Memory 而自动重启这个进程,如果有这样的情况,就会出现 Grape/Api/Call 占用时长比较多的问题。