多线程haskell程序的内存分析

Posted

技术标签:

【中文标题】多线程haskell程序的内存分析【英文标题】:Memory profiling of a multithreaded haskell program 【发布时间】:2014-10-27 15:19:30 【问题描述】:

我有一个 Snap 网络应用程序,它提供一些 JS 文件和 1 像素图像(它的主要任务是更快地工作,然后提供巨大的 html/媒体内容)。 HAProxy 后面有几台服务器。

我将它从 GHC 7.6 升级到 7.8,还升级了一些库。升级后,应用程序开始一点一点地泄漏(在所有服务器上),在 8GB-RAM 机器上每 15 分钟以 OOM 结束(在 16Gb 上更长),然后重新启动。

问题是,如果我编译应用程序以进行分析并运行应用程序一段时间,我再也看不到任何内存泄漏。它只消耗 1 个 CPU 并在恒定的小内存中工作。

所以我想就如何找到这样的瓶颈寻求一些一般性建议,如果在分析下运行没有太大帮助的话。

更新:我在玩过一个应用程序后注意到,如果我删除 -A100M 运行时选项,它的 OOM 不会那么快,但是使用默认值 HAProxy 的“会话”会达到它的极限(所以,基本上它会窒息)。我现在正在使用不同的 RTS 选项,希望其中一些有助于同时获得性能和长期内存消耗。

更新 2:仅作记录,我发现使用 -A30 rts 选项应用程序虽然内存不足,但运行良好。 8Gb 机器 OOM-kill 应用程序,但 16Gb 机器看起来像这样:http://i.imgur.com/3W9KpFS.png(绿线是“RAM 可用”,您可以在图表上看到重新启动应用程序的部署过程)。我对结果很满意,但很高兴知道任何技术来分析多线程应用程序的内存。

更新 3:我投票认为这个问题“过于宽泛”。总的来说,我看到如果存在这样一套可以让您更轻松地分析内存的通用工具,那么它们肯定会记录在 wiki 等其他地方。

【问题讨论】:

您知道这篇文章缺少很多重要信息吗?什么应用程序?涉及哪些库?什么操作系统?什么CPU?源头在哪里?档案在哪里?您使用了哪些运行时选项?什么分析工具(threadscope)?你研究过哪些文献(比如chimera.labs.oreilly.com/books/1230000000929/…)?这可能是从 ghc-7.6 到 7.8 的回归,但你检查过他们的错误跟踪器 (ghc.haskell.org/trac/ghc/wiki/ReportABug)。 @d8d0d65b3f7cf42 我只提供我认为当时相关的唯一信息。您的大多数问题都不够具体,无法回答(例如“什么应用程序?”)。我尝试了不同的运行时选项(以及分析选项)。 threadscope 与内存分析有何关系?我过去使用过它,但我认为它在这里无关紧要。我没有读过这本书,但再一次,它有关于内存分析的章节吗?不知道是不是回归。为了说明这一点——我们首先需要以某种方式查明问题。 @d8d0d65b3f7cf42 所以,我很高兴回答任何具体问题,这些问题会给出一些有助于接近解决方案的结果。随时问! @d8d0d65b3f7cf42 添加了更多细节,希望对您有所帮助 你能给我们看一个代码sn-p来展示这种行为吗? 【参考方案1】:

我自己从未使用过它,但也许ticky-ticky profiling 可以提供帮助?它应该不受普通分析引起的优化变化的影响,但代价是更难解释。

基本上用-ticky-rtsopts标志编译和链接相关模块,并用+RTS -rfoo.ticky标志运行以获取foo.ticky中的大量数据。

【讨论】:

以上是关于多线程haskell程序的内存分析的主要内容,如果未能解决你的问题,请参考以下文章

JVM内存分析

java多线程--------深入分析 ThreadLocal 内存泄漏问题

多线程内存问题分析之mprotect方法

JVM内存管理概述与android内存泄露分析

java多线程的深入分析

JVM内存模型分析(通俗易懂)