Cabal安装criterion时出现内存不足问题

3

我正在一个只有768MB内存和512MB交换空间的容器上运行。我无法增加它们的大小。 cabal install criterion 始终会出现以下错误:

Failed during the building phase.
The exception was: ExitFailure (-9)
This may be due to an out-of-memory condition.

在编译Criterion.Types时出现了问题。有没有什么解决方法或者我只能放弃使用 criterion?


1
尝试在 GHC 上设置 RTS 标志以限制其内存使用量 (--ghc-options="+RTS -M600M"),并避免并行运行多个作业 (-j1)。 - Li-yao Xia
谢谢!如果您将其作为答案编写,我会接受。 - jorgen
1
它真的起作用了吗?! - Li-yao Xia
像魔法一样 :) - jorgen
2个回答

10

为了限制GHC的内存使用量(--ghc-options="+RTS -M600M")并避免并行运行多个作业(-j1),请在GHC上设置RTS标志。


1
这似乎让我更进一步地尝试 cabal install cabal-install(试图从2.4升级到3.4),但现在出现了以下错误:ghc: panic! (the 'impossible' happened) (GHC version 8.6.5 for x86_64-unknown-linux): heap overflow。 - marcel_g
@marcel_g 在使用1GB RAM的EC2实例上运行时遇到了相同的问题。你找到解决方案了吗? - David Azar
@DavidAzar - 我找到了解决方案。我会在回答中发布我的草稿笔记。 - marcel_g

1

回答@DavidAzar对回答的评论:

@Li-yaoXia的解决方案有效,但随后我遇到了更多问题。这些都是我在解决问题时记录下来的粗略笔记。所以可能有更简洁的解决方案。

实际上,它编译了所有内容,但 cabal --version 仍然显示2.4而不是3.4。也许它不在路径中?

Warning: could not create a symlink in /root/.cabal/bin for cabal because 
the file exists there already but is not managed by cabal. You can create a symlink for 
this executable manually if you wish. The executable file has been installed at /root/.cabal/bin/cabal

这里似乎有一个解决方案:https://dev59.com/vm3Xa4cB1Zd3GeqPaxZX#17030330。但在重新安装cabal并重新编译之前,我必须想办法删除现有的符号链接。
还有这个解决方案,我会先尝试一下:updating cabal-install, but version is not changed
  • 在bash中运行unminimize,这将安装ubuntu的所有常规内容。

  • 首先,在/bin目录下创建一个名为/cabal-old的文件夹,然后将cabal可执行文件复制到cabal-old文件夹中。接着,从/bin文件夹中删除cabal。

  • 然后创建一个新的符号链接指向新的cabal可执行文件:

    ln -s /root/.cabal/bin/cabal cabal

  • 这样做可以让cabal 3.4在执行cabal --version时出现。

  • 接下来,安装git:apt-get install git

  • 然后进入plutus-pioneer-program/code/week01/文件夹并输入cabal build

  • 这会从git下载很多东西,然后失败了。

    警告:请求的索引状态2021-02-24T00:00:00Z比'hackage.haskell.org'更新!回退到旧状态(2021-02-23T23:53:53Z)。正在解决依赖项...cabal: 无法解决依赖关系:[__0] 尝试:Win32-network-0.1.0.0 (用户目标)[__1] 尝试:base-4.12.0.0/installed-4.12.0.0 (Win32-network的依赖项)[__2] 下一个目标:plutus-pioneer-program-week01 (用户目标)[__2] 拒绝:plutus-pioneer-program-week01-0.1.0.0(冲突:base==4.12.0.0/installed-4.12.0.0,plutus-pioneer-program-week01 =>base^>=4.14.1.0)[__2] 失败(回溯,冲突集:base,plutus-pioneer-program-week01)在详尽地搜索依赖树之后,这些都是我最难实现的目标:base、Win32-network、plutus-pioneer-program-week01

  • 我从Stackoverflow上得到了一个建议,即Plutus-Pioneer代码可能需要ghc 8.10,而我使用的版本是8.6.5,所以下一步是弄清楚如何更新它。

  • 在获取ghc 8.10之前,显然需要安装ghcup,在非root用户下运行此命令:

    curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh

  • 这开始安装,但因为我没有安装'make'而失败。运行这个:

    apt-get install make

  • 然后重新运行curl命令。curl安装程序的输出显示正在安装ghc 8.10,但完成后,ghc --version仍然输出8.6.5。又是符号链接问题?

  • 我在输出中发现了这个问题:

    为了运行ghc和cabal,您需要调整PATH变量。您可能希望在您的shell配置中源'/root/.ghcup/env'以这样做(例如:~/.bashrc)。

  • 它可能还需要弄清楚如何指定使用哪个版本的ghc。

  • 我需要更新bin文件夹中的符号链接,以便使用正确的ghc版本,并且还有以下其他链接需要更新:

lrwxrwxrwx 1 root root   9 Mar 24  2020 ghc -> ghc-8.6.5
-rwxr-xr-x 1 root root 226 Mar 24  2020 ghc-8.6.5  
lrwxrwxrwx 1 root root  13 Mar 24  2020 ghc-pkg -> ghc-pkg-8.6.5
-rwxr-xr-x 1 root root 258 Mar 24  2020 ghc-pkg-8.6.5  
lrwxrwxrwx 1 root root  10 Mar 24  2020 ghci -> ghci-8.6.5
-rwxr-xr-x 1 root root  55 Mar 24  2020 ghci-8.6.5

首先,创建一个新的ghcup符号链接:

ln -s /root/.ghcup/bin/ghcup ghcup

(虽然我不记得我需要ghcup做什么。)

  • 接下来,更新/bin文件夹中列出的所有3个符号链接的ghc符号链接:

    mv -T ghc ghc-old-link ln -s /root/.ghcup/bin/ghc ghc

  • 这将使新版本的ghc显示在bash shell中。

  • 现在尝试构建,它会下载并开始构建很多东西,但现在出现了这个错误:

    cabal:无法构建cborg-0.2.4.0(plutus-pioneer-program-week01-0.1.0.0所需的内容)。构建过程被杀死(即SIGKILL)。 这种情况的典型原因是没有足够的可用内存(例如,操作系统杀死了使用大量内存的进程)。

解决方法: Docker->首选项->资源->增加RAM和交换空间。在我的情况下,从2-8GB RAM,从1到2 GB交换空间。

现在可以构建第1周的Plutus Pioneer代码。


1
感谢您抽出时间回复。我尝试了几种方法并取得了一些进展,但最终解决问题的方法是使用更大的EC2实例。我测试了几个实例,最终选择了一个带有16GB内存的t2.xlarge实例,并且没有遇到任何问题。我所尝试编译的软件需要更强大的服务器才能运行,但相关文档已经过时了... - David Azar
是的,我认为最终让我成功的关键是@Li-yao Xi的解决方案以及增加我的Docker实例的RAM和交换空间。 - marcel_g

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