Я провожу тесты Go с детектором гонок в GitHub Actions через Nix, и всегда сталкиваюсь с ошибкой выделения ThreadSanitizer на Linux-раннерах. На macOS точно такой же конвейер работает нормально.
Ошибка:
Код: Выделить всё
==5050==ERROR: ThreadSanitizer failed to allocate 0x1fc0000 (33292288) bytes at address caaaab6a0000 (errno: 12)
FAIL go.trai.ch/bob/internal/core/domain 0.007s
FAIL
Код: Выделить всё
.github/workflows/ci.yamlКод: Выделить всё
name: CI
on:
push:
branches: [ main ]
pull_request:
jobs:
test:
name: Test on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-22.04, macos-26]
steps:
- uses: actions/checkout@v6
- uses: DeterminateSystems/nix-installer-action@v21
- uses: DeterminateSystems/magic-nix-cache-action@v13
- name: Check Flake
run: nix flake check
- name: Run Tests
run: nix develop --command go test -v -race ./...
- name: Build Binary
run: nix build
- В macOS runner: успешно.
Код: Выделить всё
go test -v -race ./... - В Ubuntu runner: постоянно терпит неудачу из-за ошибки ThreadSanitizer «не удалось выделить… errno: 12», указанной выше.
Код: Выделить всё
go test -v -race ./... - Сбой происходит только при использовании .
Код: Выделить всё
-race
- Использование различных образов GitHub Actions Ubuntu:
Код: Выделить всё
ubuntu-latest Код: Выделить всё
ubuntu-22.04Код: Выделить всё
ubuntu-24.04
Код: Выделить всё
magic-nix-cache[*]Выполнение того же рабочего процесса без каких-либо изменений в самом коде Go.
[*]Проблема возникает только в Linux CI; локально (в том числе на macOS)
Код: Выделить всё
go test -race ./...Окружающая среда (приблизительно)
- Платформа: действия GitHub
- ОС: запуск Ubuntu через (и другие, которые я пробовал) и macOS через
Код: Выделить всё
runs-on: ubuntu-22.04Код: Выделить всё
runs-on: macos-26 - Менеджер пакетов: Nix (хлопья)
- Команда:
Код: Выделить всё
nix develop --command go test -v -race ./... - Go: устанавливается через Nix (из )
Код: Выделить всё
nixpkgs
Код: Выделить всё
go envКод: Выделить всё
nix developВопросы
- Что обычно вызывает подобную ошибку выделения ThreadSanitizer () в Linux в действиях GitHub?
Код: Выделить всё
errno: 12 - Вероятно ли это:
- проблема с ограничением памяти в бегунке Ubuntu,
- что-то конкретное о том, как детектор гонок Go / Tsan работает в Linux,
- или связано с запуском Go через Nix (например, некоторые проблемы с песочницей Nix/ulimit/ASLR/адресным пространством)?
- Существуют ли рекомендуемые способы:
- уменьшить Tsan / использование памяти в тестах Go на CI или
Код: Выделить всё
-race - настройте GitHub Actions/Nix так, чтобы меньшая вероятность нехватки памяти?
Код: Выделить всё
go test -race
- уменьшить Tsan /
- В качестве обходного пути распространена ли практика:
- запускать только в подмножестве пакетов
Код: Выделить всё
-race - или только в версиях macOS
- или настройте /проверить параллелизм для CI?
Код: Выделить всё
GORACE / GOMAXPROCS
- запускать
Код: Выделить всё
ulimitКод: Выделить всё
-raceПодробнее здесь: https://stackoverflow.com/questions/798 ... omem-works
Мобильная версия