2014-09-03 48 views
3

我有一个Snap Web应用程序,它服务于一些JS文件和1像素图像(它的主要任务是宁可快速工作,然后服务于大量的HTML /媒体内容)。 HAProxy后面有几台服务器。多线程的haskell程序的内存分析

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

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

所以我想问一些关于如何找到这样一个瓶颈的一般性建议,如果在分析中运行没有多大帮助。

更新:我发现玩过一个应用程序后,如果我删除-A100M运行时选项它没有OOM那么快,但默认值HAProxy的“会话”达到它的限制(所以,基本上它扼流圈)。我现在正在使用不同的RTS选项,希望有些人能够帮助获得兼顾性能和长时间的内存消耗。

更新2:只是为了记录,我发现与-A30 rts选项应用程序,虽然是饥饿的内存,生活相当不错。 8Gb机器的OOM杀应用程序,但16Gb一个看起来像这样:http://i.imgur.com/3W9KpFS.png(绿线是“RAM可用”,你可以看到部署程序重新启动应用程序的图形)。我对结果很满意,但很高兴知道任何技术来分析多线程应用程序的内存。

更新3:我投票结束这个问题“太宽泛”。一般来说,如果能够让你简化内存配置的通用工具集会更加简单,那么他们肯定会在wiki等其他地方被记录下来。

+0

你意识到这篇文章缺少大量重要信息?什么应用?什么库涉及?什么OS?什么CPU?源代码在哪里?档案在哪里?你使用了哪些运行时选项?什么性能分析工具(threadscope)?你研究过哪些文献(如http://chimera.labs.oreilly.com/books/1230000000929/ch15.html#sec_concuning)?这可能是从ghc-7.6到7.8的回归,但是你检查了他们的错误跟踪器(https://ghc.haskell.org/trac/ghc/wiki/ReportABug)。 – d8d0d65b3f7cf42 2014-09-03 11:14:06

+0

@ d8d0d65b3f7cf42我提供了我认为当时唯一相关的信息。你的大部分问题都不足以回答(比如“什么应用?”)。我尝试了不同的运行时选项(也分析了一些)。 threadscope如何与内存分析相关?我过去使用过它,但我认为这里没有关系。我没有读过这本书,但是又一次,它有关于内存分析的章节吗? 我不知道这是否回归。为了说明这一点 - 我们首先需要以某种方式针对问题。 – 2014-09-03 11:36:27

+0

@ d8d0d65b3f7cf42因此,我很乐意回答任何具体的问题,这些问题会给出一些有助于更接近解决方案的结果。随意问! – 2014-09-03 11:37:16

回答

2

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

基本上编译和相关模块与-ticky-rtsopts标志联系起来,并与+RTS -rfoo.ticky标志运行时获得的数据堆在foo.ticky