我的一个 Rails 应用程序遇到了问题,它运行在 365MB 的 VPS 上,这似乎不算多。当同时有超过 3-5 个用户时,它会耗尽内存并开始使用交换,这真是太慢了。
当我查看时top
,我可以看到有许多生成的 mysql 实例(比 Rails 进程多得多)。这是正常的吗?
你如何建议缩小适用于低内存环境的应用程序?
我正在使用 Ubuntu 9.04、带有 mod Passenger 的 Apache2.2、MySQL 5.075 和 Ruby 1.8.7
编辑:根据你的建议,我将 VPS 升级到 540MB,目前看来已经足够了。但是,我只是一个穷学生所以我不能把太多的钱投入到我主要为自己做的一些项目上,直到它开始至少带来一些回报。
答案1
将会有多个 mysql 线程,而不是进程。某些版本的“Top”和“ps”将线程显示为单独的进程。
MySQL 可以随心所欲地进行调整。调整它的最佳方法是为所有表使用一个引擎 - 如果您使用 InnoDB,则仅使用 InnoDB。
然后根据需要调整缓冲区 - 主要的是 MyISAM 密钥缓存和 innodb 缓冲池。如果您只使用 MyISAM,请使用 my.cnf 中的 skip-innodb 完全禁用 innodb 引擎。
就 Apache 而言,请运行尽可能最少数量的 MaxClients;要么禁用 keepalive,要么将超时时间设置得很低 - keepalive 连接仍然会占用 (繁重的) Apache 进程。
当然,做任何这些事情都可能对性能产生不利影响,因此如果您关心性能回归,请在非生产系统上进行测试。
购买更多内存可能比花时间调整这么小的机器更划算。我们公司每个开发人员都有一个 16G 内存的刀片,仅用于测试目的。这被认为是合理的,而且不太贵。
答案2
你将花费大量的时间(以及金钱)来调整参数可能节省少量内存。只需升级 VPS 上的 RAM,即可获得更大的收益。
答案3
你需要深入挖掘,找出到底是什么在使用你的内存,每个进程占用了多少内存,寻找潜在的泄漏等等。但我的建议与其他人的建议一致:还是换成更多的内存吧。365MB 根本不够,而且根本无法扩展。问题因你选择的框架而加剧——请阅读 Twitter 的经验这里。
精选片段:
Rails 的所有便捷方法和语法糖都让程序员乐在其中,但从性能角度来看,它们最终却非常糟糕。一旦流量达到一定阈值,您要么需要删除 Rails 为您做的所有成本高昂的巧妙工作(RJS、ActiveRecord、ActiveSupport 等),要么将应用程序中运行缓慢的部分移出 Rails,或者两者兼而有之。还值得一提的是,现在任何人都不应该怀疑 Ruby 本身运行缓慢。
答案4
lowendbox.com有一个与此问题(优化低内存服务器)相关的值得收藏的网站
下面的方法当然不符合您现有的设置,但请考虑切换到更轻量的 httpd,如 nginx 和 lighttpd。这两种方法都可以为您节省大量内存,至少每个静态 http 连接都是如此。Passenger 适用于 nginx。