Rails 部署程序如何能达到一定并发量?

love323 · 2018年09月02日 · 最后由 love323 回复于 2018年11月14日 · 2401 次阅读

目前情况是这样的:centos7 阿里云,1 核 cpu,1g 内存,1m 带宽,用的 mysql8.0,占了 300m 内存,大概剩 700m 内存空间,然后使用的 nginx 和 puma 做后台服务器?如何能把并发最大化?比如 100 并发。有没有大神从 rails 角度,nginx 角度,puma 角度和数据库优化角度详细讲讲,小弟真的搞了好久,都没弄好,比如缓存啥的,数据库优化啥的,Linux 配置啥的,nginx 配置啥的?不准备再投钱了,毕竟穷学生一枚。有哪位大神给讲讲,真心谢谢了!!!!!

虽然可以讲一本书... 不过有几个情况你先介绍下更好:

Rails 是用 production 模式开的吗? 你知道慢在哪里了吗? 有没有测过?

内存太小, 缓存基本作用不大...

现在启用的是 production 模式,但是想用缓存技术,现在真心不知道慢在哪里,用腾讯云测试是 application.scss 每次加载几乎为零

先加内存吧

有性能瓶颈吗

测试过 aws 40 core 120g ram 开 40 个 docker 大概能达到 1w rpm

空谈误国。搞起来,压测...

luikore 回复

求出书

压测做了没,现在能到多少?

没有场景谈优化都是散吹,按你目前的机器,不换语言的情况下,干掉 Rails 只用 Rack 应该还能提升一些,but 你愿意么

nouse 回复

99 美刀啊,可以考虑,你看过吗?

adamshen 回复

我看过作者的一些 tweet 和演讲,内容质量很高,书还没有看过

查询缓存,跟页面可以做起来。

舍命陪大腿了,这是我在腾讯云上测试的结果,跪求大腿给讲讲,让我这等菜鸡学习学习,到底哪里是瓶颈

接入 https://newrelic.com/ 再跑压测,看 NewRelic 分析。

adamshen 回复

我开好头了,你们继续讲一本书……

love323 回复

从图上看来,你的 css 文件响应很慢,可能:

  • 没走 nginx,得把你的 nginx 配置发出来看看
  • 或者这个文件非常大,吃满了带宽
  • Rails 进程开太多了, 挤满内存导致整个系统都响应缓慢

这个机器配置, puma 单进程, 几个线程就足够了。

application.js 的平均响应时间 4s 最高 9s, 你直接把 js 请求交给 Rails 处理了么?

生产环境要 assets:precompile 预编译,然后用 nginx 托管静态文件

昨天比较忙,忘记看了,我把 nginx 的配置、puma 的配置、还有 production 的配置给大家看一看,可能配置的有错误的地方,感谢大家帮忙

还差了一个

IChou 回复

我预编译了,应该托管给了 nginx

luikore 回复

我也很纳闷,为什么响应这么慢,都让我怀疑人生了

luikore 回复

这个是 application.js 和 application.scss 的大小,感觉是有点大,但是不是因为包含了 jQuery 和 bootstrap?

你 nginx 代理静态资源写的是这个:

location ~*^/app/assets/{

}

有这个路径吗?换下下面这个试试:

location ^~ /assets/{

}

顺便建议在 config/environments/production.rb 加上:

config.serve_static_files = false # 不让后端处理静态资源请求,可以检测你nginx是否真的代理的静态资源

怎么感觉只是 fonts.googleapi.com 慢,删掉试试

nty 回复

怎么会 压测显示 fonts.googleapi.com 明明很快的很稳定呀

@early 已经给出正确答案了

另外在补充一下,Rails 编译静态资源的时候,默认就生成了 gzip(.gz)格式的文件,所以对 assets 下的资源 Nginx 可以启用

gzip_static     on;

另外你的 puma 配置里面,你只有一个核,开 3 个 worker 也没什么用,线程锁定 6 个也没什么意义,平时访问量很低的话 1, 6 应该会更合理

吐个槽:问题可以改成 Rails 应用如何正确的部署 production,并发量问题对它而言太笼统了

IChou 回复

开 3 个 worker 没用? 为啥?

IChou 回复

不知道你想说什么...

xiaox 回复
# How many worker processes to run.  Typically this is set to
# to the number of available cores.
#
# The default is "0".
#
# workers 2

puma 自己对 worker 这个参数的解释,你每 new 一个 Rails 项目都能看到这段话

IChou 回复

请教一下,puma worker 的数量 等于 cpu 的核的数量? 这样理解?

xiaox 回复

好的,以后提问题尽量说的明白清楚一点,我试一下

early 回复

好点,我试一下

early 回复

按照你说的,界面确实变乱了,jquery 也没有了,但是能找到 html,代表后台处理静态资源?那应该在 nginx 加什么实现 nginx 代理静态资源,感谢大佬了

IChou 回复

按照你改了一下 nginx,nginx 报错 nginx 版本 1.13 好像

early 回复

nginx 那个改成我自己的就正确了, 使用 config.serve_static_files = false 也加载资源了,所以应该 nginx 代处理静态资源,配的应该正确

Repeat after me: I will not optimize anything in my application until my metrics tell me so.

nginx 的 root 目录应该指向 public 而不是根目录

原则上 app 目录下的资源是不允许直接被 nginx 访问的,不需要 assets pipeline 管理的静态文件应该直接放到 public 目录下面去

IChou 回复

了解

adamshen 回复

收到

IChou 回复

吐个槽:问题可以改成 Rails 应用如何正确的部署 production,并发量问题对它而言太笼统了

这让我想到一个问题, 会不会是 Ruby Rails 部署太过复杂? ( 我知道你会说 Heroku....但真的太昂贵了 )

ksec 回复

passenger 挺方便的

ksec 回复

这不只是 Rails 的问题吧,现在的『全栈框架』部署起来差不多都这个样子,毕竟涉及的东西就有这么多

其实也没有多复杂,只是楼主可能没有仔细去看 Rails 部署相关的文章,走了很多弯路

社区缺一篇相关的 Wiki 倒是真的

等你访问量上去以后,你会发现……

1m 带宽才是最大的瓶颈。

100QPS 动态页面通常需要远远不止 1m 的带宽。

行,谢谢大家指点了,我自己再搞一搞

欢迎大家关注我的公众号 “资源和福利”,里面有你需要的 ruby 资料

love323 关闭了讨论 11月14日 13:39
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册