部署 rails 的确不是虚拟主机玩的, 我的 vps 内存耗尽死机了!

tank · 2013年02月02日 · 最后由 luikore 回复于 2013年02月03日 · 8526 次阅读

vps 用的是 512M 的内存,服务器系统用 ubuntu, 除了装 ruby ,rails, mysql, nginx 等必要的软件,其余什么都没装。就运行一个网站 上午用户反应打不开,在后台 ssh 登录要 2 分钟,询问 vps 供应商,说内存报警!然后好不容易进入命令重启 nginx, 再用 free 命令查询一下。的确是内存不够! 剩下 86M, 访问量大一点,内存就不够了。 以前用 php 写程序 512M 的服务器跑的飞快. 这到底怎么回事啊? 是 rails 耗内存,还是 ubuntu 的问题啊,就运行一个网站。日志我都切断的。今天先删除日志试试。大家有什么优化经验么?

听 javaeye 创始人说,php 是每次请求都能释放内存的。rails 是一次加载不释放的,不知道是不是真的。

在怀疑 Rails 占内存之前,先好好检查下自己的代码。

和服务器有关吗?楼主用什么 server?我们的应用没什么访问量,thin 的内存占用非常非常小…

蓝底白字的终端挺好看的。。。

先开 htop 看看,确定是 rails 占用了内存,然后再 profile(比如用 https://github.com/noahd1/oink

在这之前先不要下“rails 的确不是虚拟主机玩的”这种结论

#2 楼 @kungs #3 楼 @keating #5 楼 @reus

部署用 passenger+nginx, ubuntu 服务器系统 用 htop 命令检查了 代码检查了。这代码不是今天上线的,已经 1 年了。还是查到点问题,由于 faye 的服务器 thin 老死机,thin 没开启,不断访问 faye.js 请求不成功,但是这个请求不可能消耗这么多。 检查了 linux 进程,没多余的东西开启。 重新清理了 logs 下面的日志文件. 清理了 nginx 下面的日志文件 再重启 nginx, htop 看一下。free 的内存还有 150mb 左右。

还是挺耗的。我觉得四个原因. 1.与 rails 启动后加载框架,然后每次请求没有释放资源有关系。这是最耗的. 2.日志文件切割可以再小点,每次请求往 100Mb 的文件里面写数据肯定耗. 3.nginx 的 timeout 设置可以再大点,避免返回 502 代码 4.服务器供应商的 512mb 事实上不可能有这么多,可能他们按 1000 进制算,跟买移动硬盘老是少空间一样。

  1. 与没有用缓存有关系。

打算下次迁移到阿里云,用 1G 内存。在别的 vps 上加内存不方便。

我的 512 linode 上 放了三个 Rails 站 ...

#6 楼 @tank 这年头内存真是白菜价,但是在 vps 上还是很金贵,不过这也有好处——可以强迫程序员对运行环境投入更多关注。 楼主要是有钱耗硬件的话就当我没说,其他人如果想提高自己的手艺,还是建议多登到 vps 上看看细节,比如启动完整的应用需要多少内存,cpu、内存和网络主要消耗在哪个环节等等,有时间也可以多更换几个部署方案比较比较,学到的知识会很有用,前人说“艺多不压身”

#8 楼 @fsword 没错,本本上内存便宜,内存在 vps 还是很金贵,我本地开发用的是 8G 内存,同时打开一个 vmware 虚拟 windows, 基本上是 mac 里面开发,同时在 win 虚拟机里面测试 ie6, ie8, firefox,chrome, firefox, 也只有 1G 内存多余的。

服务器内存使用和访问量也有关系,与网站上图片上多少也有关系,与 mysql 频繁访问也有关系,我看到有几十个 mysqld 进程。如果网站没人访问,开 5 个网站 512 内存也没什么问题。

每天的访问量是多少?

这样看不出来的楼主,linux 系统不管运行什么都是这样,这是 linux 的内存机制就是这样,实际上你的剩余内存是 158MB 建议楼主 google 下linux free

以下内容摘自网络: 在 Linux 中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是 Linux 内存管理的一个优秀特性,在这方 面,区别于 Windows 的内存管理。主要特点是,无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高 Linux 系统的数据访问性能。而 Windows 是只在需要内存时,才为应用程序分配内存,并不能充分利用大容量的内存空间。换句话说,每增加一些物理内存,Linux 都将能充分利用起来,发挥了硬件投资带来的好处,而 Windows 只将其做为摆设,即使增加 8GB 甚至更大。

Linux 的这一特性,主要是利用空闲的物理内存,划分出一部份空间,做为 cache 和 buffers,以此提高数据访问性能。

页高速缓存 (cache) 是 Linux 内核实现的一种主要磁盘缓存。它主要用来减少对磁盘的 I/O 操作。具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理 内存的访问。

磁盘高速缓存的价值在于两个方面:第一,访问磁盘的速度要远远低于访问内存的速度,因此,从内存访问数据比从磁盘访问速度更快。第二,数据一旦被访 问,就很有可能在短期内再次被访问到。

-/+ buffers/cache的意思相当于: -buffers/cache 的内存数:2461788 (等于第 1 行的 used - buffers - cached),实际上是应用程序所使用的内存。 +buffers/cache 的内存数:1576328 (等于第 1 行的 free + buffers + cached),是对应用程序来说还剩余的内存。

可见-buffers/cache 反映的是被程序实实在在吃掉的内存,而+buffers/cache 反映的是可以挪用的内存总数。 对操作系统来讲 buffers/cached 都是属于被使用,所以它认为 free 只有 27824. 对应用程序来讲是 (-/+ buffers/cach).buffers/cached 是等同可用的,因为 buffer/cached 是为了提高程序执行的性能,当程序使用内存时,buffer/cached 会很快地被使用。

linode 512 内存 centos 6.3+nginx+mysql+ruby 1.9.3+unicorn 方案,拖 redmine+gitlab+testing branch 完全无问题

一个 256M 内存的 xen VPS,跑了一个 mysql,一个 rails 应用 (单个 ruby 进程),一个 php 应用 (三个 php-cgi 进程),一个 nginx 工作进程,没听见 VPS 商发邮件说内存报警

你得先确认是不是你的 VPS 问题

试用过一次 vps,耗内存,没时间定位,直接换自己机器做服务器了

@qinix 对 Linux 内存使用方式的解释不错。另外,如果你的 App 的数据能够全部放入内存中,又干嘛担心 Rails 占用内存不释放呢?

写日志几乎没内存影响的...

最好检查一下报警的时候 nginx 的请求日志和对应的机器状态,说不定能找到代码中的问题

你是多线程还是多进程部署? Ruby 版本是 1.9.2 以下或者比较早的 1.9.3 的话,unicorn 在 GC 后反而会吃更多内存... 最好更新到最新的 1.9.3

另外还可以查查 mysql 的连接数

还有个可能是提供商在你的 vps 所在的机器跑了什么吃内存的程序...

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