Golang CircleCI 2.0测试失败,出现信号:killed。

3

我正在迁移到CircleCI 2.0,在成功构建后,当执行测试时,它们会随机失败,并显示以下错误消息:

/usr/local/go/pkg/tool/linux_amd64/link: signal: killed
/usr/local/go/pkg/tool/linux_amd64/link: flushing $WORK/b462/payment_step_svc.test: write $WORK/b462/svc.test: cannot allocate memory

我使用了以下配置。
jobs:
  build:
    docker:
      - image: circleci/golang:latest
      - image: rabbitmq:3.5.4
      - image: redis

    working_directory: /go/src/github.com/soniabhishek/taskrunner

    environment:
      GOOS: linux
      GOARCH: amd64
      GOPATH: /go

    steps:
      - checkout
      - run:
          name: Get dependencies
          command: go get -t -d -v ./...
      - run:
          name: Build all
          command: go build ./...
      - run:
          name: Test all
          command: go test -v ./...

我尝试了很多go语言版本,除了最新版本(1.10.3)以外。

虽然我找到了解决方法,但我不确定为什么会出现这个问题, 只要使用CGO_ENABLED=0,我的所有测试都可以运行。

想知道为什么会出现这个问题,以及永久的解决方案。

2个回答

6
这里有两个线索表明您正在消耗过多的内存,操作系统正在强制终止您的“流氓”进程。它们是:
- killed - cannot allocate memory
您可以通过在构建失败后获取SSH会话并使用dmesg检查kill历史记录来确认此情况。如果它给出一个"牺牲子进程"的消息,那么您达到了如此严重的内存限制,以至于操作系统被迫从内存中删除进程。
您有几个选项。我按照我建议您优先选择的顺序列出它们:
- 通过对Go程序进行更改来减少内存消耗 - 请求CircleCI为您设置更大的Docker容器(这将是一个收费选项)。默认值为4G,我相信8G和16G也可用。 - 切换到Machine执行程序(目前免费,但可能会更改)。这将为您提供8G的RAM,但您会失去一些Docker方法的灵活性(例如,您必须使用几个预设的基本映像之一)。

1
在CircleCI中,dmesg无法在Docker镜像上工作。除非你找到了一种使其工作的方法?... - Sardathrion - against SE abuse
1
@Sardathrion:感谢您的留言。您说得很对,我刚在Alpine容器中尝试了dmesg命令。如果容器中的某个进程超出了内存限制,那么这个进程会被主机或Docker“kill”掉,我的理解是正确的吗? - halfer
我不记得我在回答这个问题时使用的信息,但是任何CI环境都会以某种方式遇到这个问题,无论它们是否被Docker化。我期望一个“killed”的操作系统消息应该可以从某个地方获得 - 这可能可以在主机上运行,并且仍然可以合理地详细说明在容器中被杀死的内容? - halfer
思考一下,我认为容器级别的进程应该可以被主机单独杀死,因为“容器并不存在”——它们只是由共享同一cgroup的多个进程设置的幻象。但我很想听听你的想法。 - halfer
1
根据我的一点不完美的经验,使用一些 sleep 语句有时会使构建通过。我可以在一个比“正常”容量小得多的玩具 VM 上轻松构建代码(使用相同的命令),所以认为添加 sleep 会有所帮助。然而,这会创建一个可怕的 Heisenbug,不值得这样做。我现在正在支付 CircleCI 并转移到“xlarge”机器,问题已经消失了。 - Sardathrion - against SE abuse

1
在这种情况下对我有用的是 go test -p 1,以告诉Go一次只运行一个编译。
如果没有这个,Go将运行您拥有的CPU数量,在CircleCI上默认为两个。

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