我的一个 Rails 应用程序有问题,它在 365MB VPS 上运行,这似乎不是很多。当同时有超过 3-5 个用户时,它会耗尽内存并开始使用交换,这非常慢。
当我查看top
时,我可以看到有许多衍生的 mysql 实例(比 Rails 进程多得多)。这是正常的吗?
您如何建议为低内存环境缩减应用程序?
我正在使用 Ubuntu 9.04、Apache2.2 和 mod 乘客、MySQL 5.075 和 Ruby 1.8.7
编辑:根据您的建议,我将 VPS 升级到 540MB,目前看来已经足够了。然而,我只是一个穷学生,所以我不能在一些我主要为自己做的项目中投入太多资金,直到它开始至少有一些回报。
您将花费大量时间(并因此花费金钱)来调整参数,以可能会节省少量内存。只需升级 VPS 上的 RAM,您将获得更多收益。
将有几个mysql线程,而不是进程。某些版本的“Top”和“ps”将线程显示为好像它们是单独的进程。
MySQL 可以随心所欲地调整。调整它的最佳方法是对所有表只使用一个引擎 - 如果您使用 InnoDB,请仅使用 InnoDB。
然后根据需要调整缓冲区 - 主要是 MyISAM 密钥缓存和 innodb 缓冲池。如果您只使用 MyISAM,请在 my.cnf 中使用 skip-innodb 完全禁用 innodb 引擎。
就 Apache 而言,尽可能少地运行 MaxClients;要么禁用keepalive,要么将超时设置得非常低——keepalive 连接仍然会占用一个(庞大的)Apache 进程。
当然,做任何这些事情都可能对性能有害,因此如果您关心性能回归,请在非生产系统上进行测试。
购买更多的内存可能比花时间调整这么小的盒子更具成本效益。在我们的工作中,每个开发人员都有一个带有 16G ram 的刀片,仅用于测试目的。这被认为是合理的并且不是很昂贵。
您将需要深入挖掘并准确找出正在使用您的内存的内容,每个进程需要多少,寻找潜在的泄漏等等。但我的建议将与其他建议相呼应:改为获取更多 RAM。365MB 很小,根本无法扩展。问题因您选择的框架而变得更加复杂 - 在这里阅读 Twitter 体验。
选择的外卖:
lowendbox.com是一个与此问题相关的值得收藏的好网站(优化低内存服务器)
以下内容当然与您现有的设置不匹配,但请考虑切换到更轻的 httpd,例如 nginx och lighttpd。这两个中的任何一个都应该为您节省大量内存,至少每个静态 http 连接是这样。乘客可用于 nginx。