大家好,最近部署了服务在 Linode 上(1G RAM,8 CPU (1x priority)),前端是 Android,后端是 Rails+Grape 做 API 服务器,基本服务器架构是 Nginx+Passenger+ROR+Memcache+MySQL。
启了 4 个 Nginx,6 个 ruby 进程;从 newrelic 监控的数据来看,CPU 占用率不到 1%, IO 也不到 1%,内存占用 70% 左右
Processes
User Count CPU Memory
ruby magic 6 0.5% 572 MB
mysqld mysql 1 0.0% 36.7 MB
nginx nobody 4 0.0% 12 MB
memcached magic 1 0.0% 10.2 MB
从上面的数据来看,主要是 ruby 进程占用了大部分内存;目前应用特点是 PV 比较高,业务比较简单;由于之前没太多处理高并发的部署经验,如何在有限的内存的情况下处理更多的并发量?大家有什么好的建议和意见?急求 ing~ @lgn21st @Rei @hooopo @poshboytl @fredwu @yedingding @robbin
把内存升级到 4G,然后继续观察,等 4G 内存不够,继续升级内存到 8G,等 8G 不够的时候在考虑进一步优化代码,缓存和架构。这里有个 RailsCast-China 的视频,关于暴走漫画的性能调优方面的,可以借鉴 http://railscasts-china.com/episodes/baozoumanhua-jiagou
楼主的应用都用了哪些 gem 呢?空跑 rails 单进程项目都要将近 50m 6 个就是 300m 或者楼主把 6 个 ruby 进程各自是什么贴出来?现在这样子不好识别...
6 个 ruby 而且还用了 Rails 的进程才 572 MB,这真的算很省了 ...
同样的逻辑用其他 Ruby 框架实现,估计内存能省大约一半 再改用 PHP 实现,内存还能再省至少 3/4。
所以,还是改用最最先进的 PHP 语言吧。
额,换到 Digital Ocean 然后你就发现同样的价格内存翻番,CPU 只剩双核,正好适合楼主的情况。 2GB 内存不够了就砸 40 刀每月,内存再翻番。 4GB 内存还是不够,就找个比较便宜的 Dedicated Server , 60 刀左右能租到 24GB - 32GB 的,自己注意一下备份和 failover ...
#26 楼 @blacktulip 我们每小时一次,从国内和国外各个点监控,2 台 DigitalOcean 的 VPS,每周至少抽风 5 次以上。 我是说相比 20 美元均价的主流 VPS。如果跟其他 5-7 美元的低价 VPS 相比,他家的抽风算平均水平。
我说的抽风是:国内一线城市的电信联通过去 500ms,或者美国当地的节点 MTR 过去有 10% 以上的丢包。 考虑到机房网络平均情况,海外对海外有 10% 以上的丢包是很高很高了。 上上周我们给 DogitalOcean 反应了 sfo1 机房严重丢包的问题(20-30%),他们说已经知晓并在处理了,但之后断断续续好几个小时差几个小时,大概 5 天后才完全恢复。
恩,可以设定一个大约的阀值。可能只是这几天量高,需要加内存,或者其他的。等一段之后,就不需要了呢。paas 可以弹性的调整。heroku 如果不翻墙的话,也许很好把
#31 楼 @ShiningRay CPU 1% 支持 100W 日 PV,本身的技术就值得获得投资,可以授权给 Intel 改进指令预测,授权给微软和 Redhat 改进操作系统。
昨天升级 Linode 配置到 2G 内存,通过 newrelic 数据看到,内存在 30% 左右(600M),现在访问是平均 200rpm,请求相应平均 150ms;按照这个计算,每秒可以处理 6(1000ms/150ms)* 6(ruby 进程数) = 36 个请求,每天 100W 请求应该没问题。
你的问题不在于单个 ruby 进程占用多少内存,而在于应该尽量少开进程的情况下,尽可能多的提高系统并发性能。
在 8 CPU (1x priority) 的服务器上,你开太多进程对提高并发性能没有多少帮助,建议如下:
1、nginx 开 1 个 worker 就行了,开 4 个没必要 2、既然是 API Server,就扔掉 Rails,直接用 Passenger/Unicorn/Rainbows 跑 grape,进程内存会节省很多,我估计能从 100MB 下降到 60MB 左右。 3、少开点进程,最多开 4 个 ruby 进程,观察一下请求的 IO 并发状况,如果并发不高,用 unicron 即可,如果并发高,可以改用 rainbows 跑多线程 4、如果你需要更高的 IO 并发,可以改用 goliath 跑 grape,内存不会更节省,但是并发性能会进一步提高 5、如果你不怕麻烦,可以把操作系统换成 32bit 的,能很大程度上节省内存 (缺点就是内存不能超过 4G)