我应该如何解释 ghc 堆分析器的输出?

2024-04-12

我有一个在 haskell 中实现的服务器进程,它充当一个简单的内存数据库。客户端进程可以连接然后添加和检索数据。该服务使用的内存比我预期的要多,我正在尝试找出原因。

我拥有的最粗略的指标是linux“top”。当我启动该过程时,我看到一个大小约为 27MB 的“VIRT”图像。运行客户端插入 60,000 个数据项后,我看到图像大小约为 124MB。

运行进程来捕获 GC 统计信息(+RTS -S),我最初看到

Alloc    Copied     Live    GC    GC     TOT     TOT  Page Flts
bytes     bytes     bytes  user  elap    user    elap
28296      8388      9172  0.00  0.00    0.00    0.32    0    0  (Gen:  1)

添加 60k 项目后,我看到活动字节平滑增长到

   ...
   532940     14964  63672180  0.00  0.00   23.50   31.95    0    0  (Gen:  0)
   532316      7704  63668672  0.00  0.00   23.50   31.95    0    0  (Gen:  0)
   530512      9648  63677028  0.00  0.00   23.50   31.95    0    0  (Gen:  0)
   531936     10796  63686488  0.00  0.00   23.51   31.96    0    0  (Gen:  0)
   423260  10047016  63680532  0.03  0.03   23.53   31.99    0    0  (Gen:  1)
   531864      6996  63693396  0.00  0.00   23.55   32.01    0    0  (Gen:  0)
   531852      9160  63703536  0.00  0.00   23.55   32.01    0    0  (Gen:  0)
   531888      9572  63711876  0.00  0.00   23.55   32.01    0    0  (Gen:  0)
   531928      9716  63720128  0.00  0.00   23.55   32.01    0    0  (Gen:  0)
   531856      9640  63728052  0.00  0.00   23.55   32.02    0    0  (Gen:  0)
   529632      9280  63735824  0.00  0.00   23.56   32.02    0    0  (Gen:  0)
   527948      8304  63742524  0.00  0.00   23.56   32.02    0    0  (Gen:  0)
   528248      7152  63749180  0.00  0.00   23.56   32.02    0    0  (Gen:  0)
   528240      6384  63756176  0.00  0.00   23.56   32.02    0    0  (Gen:  0)
   341100  10050336  63731152  0.03  0.03   23.58   32.35    0    0  (Gen:  1)
     5080  10049728  63705868  0.03  0.03   23.61   32.70    0    0  (Gen:  1)

这似乎告诉我堆有大约 63MB 的实时数据。当您添加堆栈空间、代码空间、GC 开销等时,这很可能与顶部的数字一致。

所以我尝试使用堆分析器来找出组成部分 这个63MB。结果令人困惑。使用“+RTS -h”运行,并查看 生成的 hp 文件,最后一个也是最大的快照有:

containers-0.3.0.0:Data.Map.Bin 1820400
bytestring-0.9.1.7:Data.ByteString.Internal.PS  1336160
main:KV.Store.Memory.KeyTree    831972
main:KV.Types.KF_1  750328
base:GHC.ForeignPtr.PlainPtr    534464
base:Data.Maybe.Just    494832
THUNK   587140

快照中的所有其他数字都比这个小得多。 将这些相加后,峰值内存使用量约为 6MB,如 图表输出:

为什么这与 GC 统计中显示的活动字节不一致?它是 很难看出我的数据结构如何需要 63MB,并且 分析器说他们不是。记忆去哪儿了?

感谢您对此的任何提示或指示。

Tim


我有一个理论。我的理论是你的程序使用了很多类似的东西ByteStrings。我的理论是因为主要内容ByteStrings is malloc已完成,在分析时不会显示它们。因此,您可能会耗尽堆,而不会在分析图上显示堆的最大内容。

更糟糕的是,当你抓取子串时ByteStrings,它们默认保留指向最初分配的内存块的指针。因此,即使您只想存储某些内容的一小部分ByteString您最终可能会保留整个最初分配的ByteString这不会显示在您的堆配置文件中。

无论如何,这就是我的理论。我对 GHC 的堆分析器如何工作以及如何工作了解不够。ByteStrings已实施以确定。也许其他人可以插话并证实或质疑我的理论。

Edit2: tibbe 注意到使用的缓冲区ByteStrings 被固定。因此,如果您要分配/释放大量小Bytestrings,您可以对堆进行碎片化,这意味着您用完了可用堆,其中一半未分配。

编辑:JaffaCake 告诉我,有时堆分析器不会显示 ByteStrings 分配的内存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该如何解释 ghc 堆分析器的输出? 的相关文章

  • 有可能吗?:行为 t [行为 t a] -> 行为 t [a]

    有没有办法有一个Behavior t a 其中 a 在时间 t 的值是 a 中包含的值Behavior t Behavior t a 在时间 t 即 具有以下类型的函数 Behavior t Behavior t a gt Behavior
  • Haskell:Where 与 Let

    我是 Haskell 的新手 我很困惑Where vs Let 它们似乎都提供了相似的目的 我读过一些比较Where vs Let但我很难辨别何时使用它们 有人可以提供一些背景信息或者一些示例来说明何时使用其中一种而不是另一种吗 哪里与让
  • Accelerate 和 Repa 是否有不同的用例?

    我一直在玩 Repa 和 Accelerate 它们都很有趣 但我不知道何时使用其中一个 何时使用另一个 他们是一起成长 是竞争对手 还是只是为了解决不同的问题 Repa 是一个用于高效数组构建和遍历的库 用 Haskell 编程并在 Ha
  • Haskell 中美元符号 ($) 和 id 函数之间有关系吗?

    这几天我正在读一篇评论莫纳德挑战 http mightybyte github io monad challenges 我强烈推荐给像我这样的 Haskell 初学者 我最终得到了这个线程 https news ycombinator co
  • 如何在 Yesod 中使用 CSS 框架?

    我想将 Blueprint CSS 框架与 Yesod 一起使用 有没有最佳实践 因为 Yesod 使用 CSS 模板 所以在我看来我不能直接使用 css 文件 我必须将它们重命名为 lucius files 吗 如何将 CSS 添加到 d
  • Haskell Cabal 包 - 找不到 Paths_ 模块

    我正在开发一个 Haskell 项目 Happstack 服务器 Blaze HTML 前端作为主要库 我想添加一个静态数据目录 看起来你可以使用 Cabal 使用自动生成的Path
  • Haskell:找不到模块“Data.List.Split”

    我正在尝试在 Haskell 中拆分列表 据我所知 最简单的方法是splitOn 但是这个函数需要Data List Split 所以我尝试运行import Data List Split在前奏曲中 但是 我收到以下错误 Could not
  • 在 Haskell 中计算移动平均线

    我正在学习 Haskell 所以我尝试实现移动平均函数 这是我的代码 mAverage Int gt Int gt Float mAverage x a fromIntegral k fromIntegral x k lt rawAvera
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • 纯函数怎么能做IO呢?

    我最近了解到莫纳德随机数 http hackage haskell org package MonadRandom 0 1 13 docs Control Monad Random Class html t 3aMonadRandom图书馆
  • 将 num 的签名键入 double?

    我才刚刚开始为你学习 Haskell 以获得伟大的好处 并且我在类型类方面遇到了一些麻烦 我想创建一个接受任何数字类型并强制其为双精度的函数 我的第一个想法是定义 numToDouble Num gt Double 但我认为这不起作用 因为
  • 将两个 Int 值相除以获得 Float 的正确方法是什么?

    我想分两份IntHaskell 中的值并获得结果Float 我尝试这样做 foo Int gt Int gt Float foo a b fromRational a b 但 GHC 版本 6 12 1 告诉我 无法将预期类型 Intege
  • Haskell 中的分类结构

    Hask通常被认为是一个范畴 其对象是类型 态射是函数 然而 我看到 Conor McBride pigworker 警告不要使用Hask多次 1 https stackoverflow com a 45905082 474311 2 ht
  • 以下两个 lambda 函数的空间复杂度

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • Haskell 泛化问题(涉及列表理解)

    假设我想知道a上的所有要点 x y 矩形内的平面has 我可以使用列表推导式来计算 如下所示 let myFun2D x y x lt 0 2 y lt 0 2 现在 如果我想为一个人完成同样的事情 x y z 空间 我可以采取同样的方式并
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • 简单 Haskell Monad - 随机数

    我正在尝试扩展代码这个帖子 https stackoverflow com questions 3944170 haskell and state 接受的答案 允许我能够基于以种子作为参数的函数 randomGen 调用 randomGen
  • QuickCheck是否可以生成任意函数

    我试图为身份编写一个 QuickCheck 测试 f y f y 我最初的计划是编写一个返回函数和整数的任意生成器 具有签名Gen Int gt Int Int 并在prop DollerDoesNothing使用 不使用测试该功能应用程序
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个

随机推荐

  • 如何深度复制混有特征的类

    这是一些示例 scala 代码 abstract class A val x Any abstract def copy A class b i Int extends A i override def copy new B x class
  • python中,什么时候可以省略self?

    下面定义的代码Duck类由以下组合而成Bill类和Tail班级 我的问题是至于方法about inside Duck类定义 为什么可以写bill description and tail length Is self这里省略了 如果是 我什
  • neo4j cypher节点之间的多重关系

    例如 a r gt b 两个节点之间存在多个r 每个r userId都是唯一的 例如 a r R userId user1 gt b a r R userId user2 gt b 对于 a r gt c 也是如此 而情况是a r gt b
  • Mojolicious REST 调用中错误的 HTTP 响应

    我使用的mojolicious应用程序是基于JSON的 即客户端和服务器之间的交互更多的是JSON结构化数据的交换 我正在尝试实现一种标准方法 当在 REST 调用期间发生错误时 使用正确的 HTTP 响应代码来处理错误 实施此类标准的最佳
  • 插入符使用插入符训练对象返回的预测与使用提取的最终模型返回的预测不同

    在拟合模型时我更喜欢使用插入符号 因为它的相对速度和预处理功能 然而 我对它如何做出预测有点困惑 当比较直接从训练对象做出的预测和从提取的最终模型做出的预测时 我看到了非常不同的数字 来自火车对象的预测似乎更准确 library caret
  • 如何执行 CompletableFuture 数组并组合其结果

    我正在研究 Java 8CompletableFutures并阅读 并看到 我应该采用thenCompose代替thenApply 我已将我的代码转换为使用thenCompose但我有一种不正确的感觉 这是我的控制代码 final Comp
  • Spark 和 AWS S3 连接错误:无法通过 Spark-shell 从 S3 位置读取文件

    在下面的 Spark shell 中 我尝试连接到 S3 并加载文件以创建数据帧 spark shell packages com databricks spark csv 2 10 1 5 0 scala gt val sqlContex
  • 哪个 ORM 支持这个

    我有一个可选的查询部分 需要在特定条件下执行 这是示例代码 int cat 1 int UserID 12 string qry select from articles if cat gt 0 qry where categoryID c
  • 如何仅在特定 API 级别上执行代码

    例如 这段代码 if Build VERSION SDK INT gt Build VERSION CODES GINGERBREAD myCalendarView setOnDateChangeListener new OnDateCha
  • 如何向 CMFCPopupMenu 添加图标?

    我想用CMFCPopupMenu用于右键单击期间的弹出菜单 如何添加图标CMFCPopupMenu 这是我在基本 MFC 应用程序中尝试的示例代码 CMFCPopupMenu TestCMFCPopMenu new CMFCPopupMen
  • str在 data.frame 中按行分割并按列分配结果

    所以我有数据框 dat data frame x c Sir Lancelot the Brave King Arthur The Black Knight The Rabbit stringsAsFactors F gt dat x 1
  • Java 8 Streams:将对象列表转换为一组对象

    我正在尝试将对象列表转换为一组对象 以确保集合中是否不存在重复项 我正在尝试使用 Streams 我有一个类产品如下 class Product int id String name float price public Product i
  • 模拟通过实例使用的类方法

    我正在尝试使用模拟修补类方法 如所述在文档中 http www voidspace org uk python mock patch html patch Mock 对象本身工作正常 但它的方法却不能 例如 它们的属性如下call coun
  • 从 Delphi 将列表导出到 OpenOffice Calc

    我正在使用 Delphi 7 我想使用自动化而不是使用文件将列表内容从我的程序导出到 OpenOffice Calc 任务很简单 创建新文档 迭代行 列并更改单元格数据 我找到了一些代码 但它并不完整 我希望有人有一些示例代码可以完成这个非
  • 将 Python 安装到自托管 Windows 构建代理

    我已经安装了 Windows 代理 并且需要能够运行 Python 脚本 我知道我需要安装Python 但我不知道如何安装 我将标准安装中的 Python 文件添加到 AGENT TOOLSDIRECTORY Python 3 8 2 x6
  • Swift 的 Facebook 登录按钮

    在 Xcode 中 如果我创建一个UIView然后将自定义类添加为FBSDKLoginButton 当我单击时 它会引导我完成 Facebook 登录 然后返回到与FBSDKLoginButton但不是说登录按钮 而是说现在注销 当单击登录
  • 使用装饰器恢复生成器

    让我们有一个类 它的功能有时会失败 但经过一些操作后它就可以完美地工作 现实生活中的例子是 Mysql 查询 它会引发 mysql exceptions OperationalError 2006 MySQL server has gone
  • 终止递归调用

    据我所知 terminate 当异常处理出现问题时被调用 通常只是没有被捕获 我得到的只是一个错误行terminate called recursively 经过一段时间的谷歌搜索后 我发现了很多例子 terminate called af
  • 如何在 Visual Studio 中将 .NET Framework 更改为 .NET Standard/Core?

    我在 Visual Studio 中有一个 C 解决方案 它最初是在 NET Framework 中创建的 我想将项目转换为 NET Standard Core 如果我进入项目 gt 属性 我会看到附加的屏幕 其中目标框架是 NET Fra
  • 我应该如何解释 ghc 堆分析器的输出?

    我有一个在 haskell 中实现的服务器进程 它充当一个简单的内存数据库 客户端进程可以连接然后添加和检索数据 该服务使用的内存比我预期的要多 我正在尝试找出原因 我拥有的最粗略的指标是linux top 当我启动该过程时 我看到一个大小