Rails Nginx + Unicorn 部署重启的性能问题

kafka0102 · 2016年04月17日 · 最后由 kafka0102 回复于 2016年05月12日 · 2835 次阅读

配置是8G内存+2核CPU的云主机,12个nginx进程,unicorn的worker是20个。

发布新版本时先

rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile

然后 rake stop 大概需要10几秒钟,之后 rake start 又是10几秒。

问题似乎在并发多时(低峰期也有每秒10多个请求),rake start 后cpu就满了,看rails log是有处理请求的,但nginx基本就是499和502之类的响应。

尝试的解决方法是,kill掉nginx进程,重新start unicorn再start nginx后恢复正常了。而且,看rails log有时会有missing views文件的信息(这个很让人费解,因为文件是存在的)。如果部署时并发不多就不会出现这种问题。个人猜测,因为请求比较多,unicorn启动后20个worker进程同时处理请求,但因为加载rails环境什么的都在占用资源,结果是很多worker都没有起来(log里有killed的日志)。我在想,配置再升级到4核CPU是否能好些?但平时CPU利用率只是30%左右的。现在每次部署都很闹心啊,该如何能只几十秒停服务的部署啊?

共收到 13 条回复

这一大段的... 就不能换行么!

首先你的部署有问题, Unicorn 官方的建议是多少个 CPU 核部署多少个进程 + 1,你的机器 2 核,合理的数量应该是 3 - 4 个 worker。

Nginx 的 worker 也是一样的概念

本来 Rails 第一次启动的时候就是挺慢的,这个很正常,它需要预加载 N 多的库,计算 Assets 的 Digest 信息等。

此外 Unicorn 重启的机制是 Copy 一份新的进程列表出来,你 20 个,它重启的时候会变成 40 个,内存随着也增加了,如果你内存不足,那重启的过程必然缓慢,Unicorn 一直到新的 20 个进程完全启动成功以后,才会杀掉 Old 的 20 个进程。

以楼主的场景来看,我认为问题就在于 worker 太多了,重启的时候内存不够用,所以启动缓慢。

解决方案:

  1. 换机器,成 4 核 4 G 或更大;
  2. 合理设定 Unicorn Worker 数量;
  3. 合理设定 Nginx worker 数量;

2核CPU,woker20个,nginx和unicorn 的woker数都是和cpu数直接相关的,核心数 + 1就行了,多了多占用内存也调度不到,https://www.digitalocean.com/community/tutorials/how-to-optimize-unicorn-workers-in-a-ruby-on-rails-app ,用unicorn的话最好也加上unicorn-worker-killer这个gem,控制每个worker的内存占用。

#3楼 @huacnlee #4楼 @zhang_soledad

多谢回复。 内存是够用的,每个worker是占了200M左右的内存。之前是12个woker,4G的内存,后来内存升级了。worker加多也是不得已的事情,因为像搜索等请求耗时就是长,统计到每天是有不少响应时间超过1秒的请求,然而又不好优化。后续会尝试加CPU看看效果。

6楼 已删除

nginx进程过多了,试试2个

以前遇到过 worker 过多导致load 极高的情况,worker不是越多越好,nginx如果参数优化好本身没问题的,瓶颈在于硬件和后端的软件。

#10楼 @netqyq worker数量平时运行是没问题的,现在就是部署时启动太慢,打算周末稍微减少下worker数量,再提高下cpu看下效果。也打算测试下puma。因为下午高峰期并发有些多时,之前worker少时nginx log里不少请求响应时间有些长。那个nginx worker数量确实没必要那么多,瓶颈不在那里。

nginx 这么多workers一般就是和内核数量相同

#12楼 @zouyu nginx的workers因为历史原因没改(后来改掉了),主要还是rails的worker数太多。现在换成4核的CPU后,重启顺爽多了。

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