一个多线程的Haskell程序的内存分析

3
我有一个Snap网络应用程序,它提供一些JS文件和1像素的图像(其主要任务是快速工作而不是提供大量的HTML/媒体内容)。在HAProxy后面有几个服务器。
我将其从GHC 7.6升级到7.8,并升级了一些库。升级后,应用程序开始逐渐泄漏(在所有服务器上),每15分钟在8GB RAM机器上结束OOM(在16Gb RAM机器上时间更长)并在重新启动后重复此过程。
问题是,如果我为配置文件编译应用程序并运行一段时间,我就看不到任何内存泄漏。它只使用1个CPU并在恒定的小内存中工作。
因此,我想请教如何找到这样的瓶颈的一般建议,如果在性能分析下运行没有太大帮助。
更新:我注意到,在尝试该应用程序后,如果我删除 -A100M 运行时选项,它不会那么快地OOM,但使用默认值HAProxy的“sessions”达到其限制(因此基本上被阻塞)。我现在正在尝试使用不同的RTS选项,希望其中一些将有助于实现性能和长期内存消耗两全其美。
更新2:仅供记录,我发现使用-A30 rts选项的应用程序虽然内存占用较高,但表现良好。8Gb机器OOM-kill应用程序,但16Gb机器看起来像这样:http://i.imgur.com/3W9KpFS.png(绿线是“可用RAM”,您可以在图表上看到重新部署过程,该过程在应用程序上重启)。我对结果感到满意,但仍然很高兴了解任何多线程应用程序内存分析技术。
更新3:我推荐将此问题标记为“过于广泛”。总的来说,我认为如果存在这样一组通用工具,可以更轻松地分析内存,那么它们肯定会在维基等其他文档中记录。

你意识到这篇文章缺少很多重要信息了吗?哪些应用程序?涉及哪些库?使用什么操作系统?使用什么CPU?源代码在哪里?配置文件在哪里?使用了哪些运行时选项?使用了哪些性能分析工具(ThreadScope)?你研究过哪些文献(例如,http://chimera.labs.oreilly.com/books/1230000000929/ch15.html#sec_conc-tuning)?这可能是从ghc-7.6到7.8的回归,但你是否检查过他们的错误跟踪器(https://ghc.haskell.org/trac/ghc/wiki/ReportABug)? - d8d0d65b3f7cf42
@d8d0d65b3f7cf42 我只提供我认为当时相关的信息。你大部分的问题不够具体,无法回答(比如“什么应用程序?”)。我尝试了不同的运行时选项(包括分析选项)。Threadscope如何与内存分析相关?我过去使用过它,但我不认为它在这里相关。我没有读过这本书,但再次问一下,它是否有关于内存分析的章节?我不知道这是否是一个回归问题。要确定这一点,我们首先需要以某种方式找出问题的根源。 - Konstantine Rybnikov
@d8d0d65b3f7cf42 所以,我很高兴回答任何具体的问题,这些问题将产生一些结果,有助于更接近解决方案。随时提问! - Konstantine Rybnikov
@d8d0d65b3f7cf42 增加了一些细节,希望这可以帮助。 - Konstantine Rybnikov
你能展示一段展现这种行为的代码片段吗? - jev
@jev 这就是问题所在。这是一个庞大的 Web 应用程序,现在的主要目标是至少感受到哪个子集正在泄漏。在此之后,我将尝试在单个线程中复现问题。 - Konstantine Rybnikov
1个回答

2
我从未亲自使用过,但也许ticky-ticky profiling可以帮助你?它被认为对普通分析所引起的优化变化免疫,但代价是更难解释。
基本上,使用-ticky-rtsopts标志编译和链接相关模块,然后使用+RTS -rfoo.ticky标志运行,以获取大量数据存储在foo.ticky中。

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