我有一个Snap网络应用程序,可以提供一些JS文件和1像素图像(它的主要任务是快速工作,然后提供巨大的HTML /媒体内容)。 HAProxy背后有几台服务器。
我将它从GHC 7.6升级到7.8,还升级了一些lib。升级后,应用程序开始逐渐泄漏(在所有服务器上),在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可用",你可以看到在程序图上重新启动app的deploy-procedure)。我对结果感到满意,但很高兴知道任何技术来分析多线程应用程序的内存。
更新3:我投票结束这个问题,因为"太宽泛"。一般来说,我看到如果存在这样的通用工具集可以让你更容易分析内存,那么它们肯定会在wiki等其他地方记录下来。
答案 0 :(得分:2)
我自己从未使用过它,但也许ticky-ticky profiling可以提供帮助吗?它应该不受普通分析引起的优化变化的影响,但代价是难以解释。
基本上使用-ticky
和-rtsopts
标记编译和链接相关模块,并使用+RTS -rfoo.ticky
标志运行以获取foo.ticky
中的大量数据。