Heroku dynos何时使用交换空间内存?

10
我正在使用免费dyno在Rails 4.1.4项目中托管2个独角兽进程作为我的开发服务器。应用程序运行一段时间后,有时会感到变慢。我添加了New Relic、Logentries,并启用了log-runtime-metrics。然后我查看了New Relic和Logentries。
» heroku web.1  - - source=web.1 dyno=heroku.21274089.82eb32b4-c547-4041-b452-d3fedae05ee9 sample#load_avg_1m=0.00 sample#load_avg_5m=0.00 sample#load_avg_15m=0.01
» heroku web.1  - - source=web.1 dyno=heroku.21274089.82eb32b4-c547-4041-b452-d3fedae05ee9 sample#memory_total=393.41MB sample#memory_rss=368.38MB sample#memory_cache=4.47MB sample#memory_swap=20.56MB sample#memory_pgpgin=121244pages sample#memory_pgpgout=25796pages

我不明白的是,我的Dyno内存仅为 sample#memory_rss=368.38MB,但为什么它已经使用了交换内存 sample#memory_swap=20.56MB?因为根据我从Heroku文章 https://devcenter.heroku.com/articles/dynos#memory-behavior 中得出的结论,如果它达到了免费Dyno的512 Mb内存限制,则应切换到交换内存。请注意,本文中的HTML标记已保留。
1个回答

16

我的应用程序即使只使用了可用RAM的50%,也出现了显着的交换,所以我询问了一下。这是他们支持团队的一句话:

我们在PX动态实例中将Ubuntu的swappiness保留为默认值60。

值为60确保您的应用程序在达到最大内存之前就开始进行交换。Linux内核参数vm.swappiness的范围从0到100,其中0表示无交换,100表示始终交换。

因此,当在Heroku上运行时,即使您的应用程序占用的空间远小于dyno宣传的RAM,您也应该预期应用程序会进行交换。


那么你如何决定修复它?因为使用交换空间会降低应用程序的性能。 - Samnang
1
@Samnang,用户无法进行任何修复。这需要由Heroku进行修复。 - Brian P O'Rourke
1
根据Heroku的说法,这不应该影响应用程序的性能。 "30-50MB的交换空间,只要您的应用程序仍有可用内存,就不会影响性能。这些内存被Linux放入交换空间是未使用的内存。系统将其移动到那里,因为它已经有一段时间没有被使用,并允许释放一些RAM内存。" - Lev
@Lev,你的回复有点轻视。这对于接近最大内存的任何人来说都是一个潜在的性能问题,即使是偶尔。你引用的回复可以重新表述为“只要不接近RAM限制,性能就很好”。60个交换设置意味着应用程序最好使用交换,但对于注重性能的系统来说,这很少是情况。 - Brian P O'Rourke
@BrianPO'Rourke 有什么建议或想法吗? - Lev
如果您不介意支付更多的费用,购买更大的Dyno或在Dyno内使用较少的Web进程可能会起作用。此外,请注意Gems的内存使用情况,并查看是否可以使用更简单的解决方案替换一些重型Gems,例如Devise。 - aaandre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接