Rails bundle exec 执行 tasks 非常占用 CPU 啊~

moliliang · 2015年10月15日 · 最后由 moliliang 回复于 2015年10月28日 · 3079 次阅读

网站最近性能时差时好(同一个页面),找来找去,发现 cpu 涨幅很有规律。

后来发现是 crontab 中的定时任务导致(手动单独执行任务,cpu 马上飙升)。

每次 crontab 中执行 bundle exec 某个 task 的时候,cpu 就飙升,然后接着网站变慢(单核 cpu)。

因为有多个定时任务,尝试错开他们的执行时间,似乎缓解了一点,但是任然不能忍受啊~~

为什么 bundle exec 这么占 cpu 啊。。即便 task 里面什么代码也没有,是因为每次都加载 rails 的原因吗?

= =!

看 newrelic 的图表。。错开执行时间。。。速度稳定多了~~~

还是不给力,感觉要改成定时 wget 了。。。。

改用 sidetiq 来定时跑,几乎没有太多性能损耗~~ 赞一下

  1. bundle exec 只是负责加载 Gemfile.lock 中的 gem,把他们加到 $LOAD_PATH 中,然后 require.

  2. 你最好把 cron job 放到单独的机器上去执行。

  3. 你该买机器了。。。

每次 bundle exec 都会重新加载应用的整个执行环境,这确实是个耗 cpu 的过程,sidetiq 是用 sidekiq 跑,环境只加载了一次

#4 楼 @xiaoronglv 除了 crontab 的时候,其他的 cpu 占用是非常低的,速度也在基本上在 50ms-100ms 左右。如果为了 crontab 升级机器,感觉太不划算了~ 现在改用 sidetiq 来跑,cpu 很低,除了 https://github.com/tobiassvn/sidetiq/wiki/Known-Issues 这个坑~~~

#5 楼 @markgeek 是的,所以这玩意不适合用来做 crontab 定时任务,或者只适合跑夜间没人访问时候的任务。跑没几分钟跑一次的任务,在普通机器上行简直作死啊~

单核。。。费那么大劲去搞 sidetiq 干什么,升级到双核就完事了啊,一个月贵几十块钱

#8 楼 @ywencn 我买的那个一个月可是贵 100 多块哦~ 嘿嘿,香港的。其实也蛮简单的。花了个把小时搞定。比一个月多 100 多划算啊~~ 😄

rake task 本身并不慢,但如果在 task 中加载了 rails 环境那就会很慢,不过大部分 task 都需要加载 rails 环境。 可以考虑用 sidekiq。

#10 楼 @ery 项目有在用 sidekiq 跑队列啊。现在用的 sidetiq 就是依赖 sidekiq 的。一个跑定时任务,一个跑队列。~

现在改成什么方式了?

#12 楼 @tsinghan 用 sidetiq 他依赖 sidekiq。。这俩玩意看着像,其实不一样

需要 登录 后方可回复, 如果你还没有账号请 注册新账号