我有一个在 Heroku 上运行的 Rails 4.2 应用程序,Ruby 版本是 2.2.4
当我重新启动应用程序时,使用 Heroku 的 log-runtime-metrics 应用程序会记录以下内容:
sample#memory_total=102.07MB
sample#memory_rss=102.06MB
sample#memory_cache=0.00MB
sample#memory_swap=0.00MB
sample#memory_pgpgin=29936pages
sample#memory_pgpgout=3807pages
sample#memory_quota=512.00MB
只需单击应用程序登陆中的不同页面即可报告以下详细信息:
sample#memory_total=267.07MB
sample#memory_rss=265.63MB
sample#memory_cache=1.43MB
sample#memory_swap=0.00MB
sample#memory_pgpgin=109878pages
sample#memory_pgpgout=41509pages
sample#memory_quota=512.00MB
Oink 报告:内存使用情况:435416
进入应用程序我有一些带有分页的数据表,当在页面中移动时内存不断增加:
sample#memory_total=349.68MB
sample#memory_rss=348.18MB
sample#memory_cache=1.50MB
sample#memory_swap=0.00MB
sample#memory_pgpgin=159122pages
sample#memory_pgpgout=69604pages
sample#memory_quota=512.00MB
此刻Oink报告:内存使用:602352
如果我转到应用程序 Heroku 报告的更简单的页面:
sample#memory_total=353.05MB
sample#memory_rss=351.51MB
sample#memory_cache=1.54MB
sample#memory_swap=0.00MB
sample#memory_pgpgin=169306pages
sample#memory_pgpgout=78924pages
sample#memory_quota=512.00MB
Oink 报告内存使用情况:604744
在 Heroku 移动 5 分钟后,报告的内存总量在 360 到 400+ MB 之间。它不会出现内存配额错误,但如果新的网络工作者会被解雇,我敢打赌。
我还从 ObjectSpace 中获取了一些数据。浏览网站(这次是在本地),首先使用最简单的页面,然后进入带有分页的部分,获取更多数据,然后出去等等。以下是来自 ObjectSpace.count_objects 的一些日志:
{:TOTAL=>556379, :FREE=>1142, :T_OBJECT=>27740, :T_CLASS=>7356, :T_MODULE=>1563, :T_FLOAT=>9, :T_STRING=>241807, :T_REGEXP=>2481, : T_ARRAY=>92685, :T_HASH=>16081, :T_STRUCT=>1118, :T_BIGNUM=>13, :T_FILE=>117, :T_DATA=>81408, :T_MATCH=>6132, :T_COMPLEX=>1, :T_RATIONAL= >909, :T_SYMBOL=>1691, :T_NODE=>62347, :T_ICLASS=>11779}
{:TOTAL=>556379, :FREE=>1211, :T_OBJECT=>27540, :T_CLASS=>7354, :T_MODULE=>1565, :T_FLOAT=>9, :T_STRING=>241100, :T_REGEXP=>2478, : T_ARRAY=>93344, :T_HASH=>16763, :T_STRUCT=>1078, :T_BIGNUM=>13, :T_FILE=>122, :T_DATA=>81422, :T_MATCH=>6031, :T_COMPLEX=>1, :T_RATIONAL= >911, :T_SYMBOL=>1690, :T_NODE=>61968, :T_ICLASS=>11779}
{:TOTAL=>556379, :FREE=>946, :T_OBJECT=>24257, :T_CLASS=>7523, :T_MODULE=>1565, :T_FLOAT=>9, :T_STRING=>251448, :T_REGEXP=>2362, : T_ARRAY=>83078, :T_HASH=>15272, :T_STRUCT=>1175, :T_BIGNUM=>63, :T_FILE=>128, :T_DATA=>89152, :T_MATCH=>5952, :T_COMPLEX=>1, :T_RATIONAL= >963, :T_SYMBOL=>2028, :T_NODE=>58656, :T_ICLASS=>11801}
输入带有分页的数据表,每页 25 条记录,检索到的数据包含唯一的字符串(实际上是地址)。
{:TOTAL=>556379, :FREE=>906, :T_OBJECT=>26280, :T_CLASS=>7363, :T_MODULE=>1563, :T_FLOAT=>9, :T_STRING=>252024, :T_REGEXP=>2474, : T_ARRAY=>87445, :T_HASH=>15347, :T_STRUCT=>1144, :T_BIGNUM=>16, :T_FILE=>133, :T_DATA=>80601, :T_MATCH=>6686, :T_COMPLEX=>1, :T_RATIONAL= >985, :T_SYMBOL=>1690, :T_NODE=>59906, :T_ICLASS=>11806}
{:TOTAL=>556379, :FREE=>146, :T_OBJECT=>18752, :T_CLASS=>7359, :T_MODULE=>1563, :T_FLOAT=>9, :T_STRING=>295002, :T_REGEXP=>2304, : T_ARRAY=>81885, :T_HASH=>13791, :T_STRUCT=>867, :T_BIGNUM=>15, :T_FILE=>11, :T_DATA=>77634, :T_MATCH=>847, :T_COMPLEX=>1, :T_RATIONAL= >1251, :T_SYMBOL=>1679, :T_NODE=>41463, :T_ICLASS=>11800}
{:TOTAL=>571870, :FREE=>433, :T_OBJECT=>19352, :T_CLASS=>7369, :T_MODULE=>1565, :T_FLOAT=>9, :T_STRING=>294098, :T_REGEXP=>2358, : T_ARRAY=>91079, :T_HASH=>14983, :T_STRUCT=>879, :T_BIGNUM=>15, :T_FILE=>16, :T_DATA=>77945, :T_MATCH=>1128, :T_COMPLEX=>1, :T_RATIONAL= >1591, :T_SYMBOL=>2028, :T_NODE=>45197, :T_ICLASS=>11824}
{:TOTAL=>628109, :FREE=>343, :T_OBJECT=>20647, :T_CLASS=>7360, :T_MODULE=>1563, :T_FLOAT=>9, :T_STRING=>318169, :T_REGEXP=>2346, : T_ARRAY=>115854, :T_HASH=>17767, :T_STRUCT=>949, :T_BIGNUM=>15, :T_FILE=>10, :T_DATA=>79152, :T_MATCH=>1243, :T_COMPLEX=>1, :T_RATIONAL= >1789, :T_SYMBOL=>1685, :T_NODE=>47405, :T_ICLASS=>11802}
{:TOTAL=>727564, :FREE=>470, :T_OBJECT=>22820, :T_CLASS=>7361, :T_MODULE=>1563, :T_FLOAT=>9, :T_STRING=>362350, :T_REGEXP=>2390, : T_ARRAY=>152959, :T_HASH=>22342, :T_STRUCT=>1035, :T_BIGNUM=>33, :T_FILE=>11, :T_DATA=>81286, :T_MATCH=>2167, :T_COMPLEX=>1, :T_RATIONAL= >2497, :T_SYMBOL=>1686, :T_NODE=>54779, :T_ICLASS=>11805}
{:TOTAL=>811122, :FREE=>392, :T_OBJECT=>24361, :T_CLASS=>7362, :T_MODULE=>1563, :T_FLOAT=>9, :T_STRING=>409740, :T_REGEXP=>2434, : T_ARRAY=>176571, :T_HASH=>25118, :T_STRUCT=>1076, :T_BIGNUM=>51, :T_FILE=>13, :T_DATA=>82701, :T_MATCH=>2858, :T_COMPLEX=>1, :T_RATIONAL= >3093, :T_SYMBOL=>1686, :T_NODE=>60285, :T_ICLASS=>11808}
现在将数据表和分页留在应用程序上的一个更简单的页面
{:TOTAL=>819681, :FREE=>494, :T_OBJECT=>24601, :T_CLASS=>7374, :T_MODULE=>1563, :T_FLOAT=>9, :T_STRING=>413540, :T_REGEXP=>2437, : T_ARRAY=>178899, :T_HASH=>25953, :T_STRUCT=>1118, :T_BIGNUM=>93, :T_FILE=>14, :T_DATA=>83043, :T_MATCH=>2924, :T_COMPLEX=>1, :T_RATIONAL= >3121, :T_SYMBOL=>1688, :T_NODE=>60999, :T_ICLASS=>11810}
我也可以获得 gc profiler 数据。但是让我担心的是,如果报告的数据和分配的东西大部分来自所需的宝石,我无论如何都需要。
所以...
我正在尝试检测内存泄漏,或者内存占用如此之高的原因,并尽可能减少它。欢迎任何建议如何从这里开始。
很高兴理解为什么在第一次单击后 - 重新启动后 - Heroku 报告的内存加倍,尽管我想这是在大多数对象被构造并分配内存之后。
但是 Oink 报告的内容和 Heroku 报告的内容之间的差异是巨大的,我猜 Oink 以字节为单位报告。我再次想象他们正在报道不同的事情,或者至少 Heroku 正在报道更多的事情。
任何好的提示如何解释所有这些数据?对于 Heroku 应用程序来说,300-400 MB 的内存占用不是太多了吗?
谢谢。