ci: re-enable CGAL tests with LOW_MEMORY_BUILD for Raspberry Pi runner
Finding-I from doc/reviewer/external-audit-2026-05-30.md.
Root cause: CGAL+Eigen at -O3 drives cc1plus peak RAM to ~700 MB per
Unity compilation unit (batch size 4) on ARM64. With the 1600 MB
container limit the 2nd or 3rd TU reliably triggered OOM-kill, so
test-cgal was gated off via `if: false` since 2026-05-26.
Fix: new CMake option CONFORMALLAB_LOW_MEMORY_BUILD=ON applies four
orthogonal memory-saving measures to conformallab_cgal_tests:
1. -O0 (no debug info): optimizer passes entirely skipped → cc1plus
peak drops from ~700 MB to ~150-200 MB per TU on ARM64.
Omitting -g avoids the additional object-file / linker RAM cost.
2. CONFORMALLAB_USE_PCH=OFF: saves the one-time ~200 MB PCH
compilation cost; each TU re-parses CGAL headers (fast at -O0).
3. UNITY_BUILD_BATCH_SIZE=1: one source file per cc1plus invocation,
removing the "4-file template-explosion" per-unit multiplier.
4. -Wl,--no-keep-memory (GNU ld): linker releases symbol tables after
each input file → ~15-25 % less linker RSS.
Verified locally with cmake -DCONFORMALLAB_LOW_MEMORY_BUILD=ON:
277/277 CGAL tests pass, 31 s runtime (vs 2 s at -O3 — expected;
tests run 15× slower without optimizer but all correct).
CI workflow changes (cpp-tests.yml):
- test-cgal re-enabled: `if: github.event_name == 'pull_request'`
- Configure step adds -DCONFORMALLAB_LOW_MEMORY_BUILD=ON
- Container memory: 1600m → 2000m (--memory-swap=3000m for 1 GB swap
headroom), using ~half of the Pi's 3-4 GB while leaving OS margin.
CLAUDE.md updated: new flag added to compile-time options table; CI
status row corrected from DISABLED to active.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -57,45 +57,52 @@ jobs:
|
||||
#
|
||||
# Boost (libboost-dev) is already present in the container since the image rebuild.
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# ─── DISABLED 2026-05-26 ──────────────────────────────────────────────────
|
||||
# The full CGAL test build (`conformallab_cgal_tests`, -j1, ~minutes) is
|
||||
# too compute-intensive for the eulernest runner: even with the 1600 MB
|
||||
# memory bump the job OOMs intermittently during CGAL+Eigen template
|
||||
# expansion, so most recent runs fail without exposing a real regression.
|
||||
# While we work through this, the job is gated off via `if: false` —
|
||||
# `workflow_dispatch` reruns from the Gitea UI still work, and the body
|
||||
# of the job is preserved unchanged for easy reactivation.
|
||||
# ─── RE-ENABLED 2026-05-31 with CONFORMALLAB_LOW_MEMORY_BUILD ────────────
|
||||
# Root cause of previous OOMs: CGAL+Eigen at -O3 drives cc1plus peak to
|
||||
# ~700 MB per Unity compilation unit on ARM64. With a 1600 MB container
|
||||
# limit and 4 files per unity batch, the 2nd or 3rd TU reliably OOMs.
|
||||
#
|
||||
# Consequences:
|
||||
# * test-fast (Job 1) still runs on every push/PR — pure-math tests
|
||||
# stay gated.
|
||||
# * quality-gates (Job 3) still runs on every push/PR — style /
|
||||
# convention checks stay gated.
|
||||
# * The two structural sub-gates nested under test-cgal
|
||||
# (`scripts/check-test-counts.sh`, `scripts/try_it.sh`) are
|
||||
# temporarily un-gated. Run them locally before tagging a release;
|
||||
# a follow-up will relocate them into a cheaper job.
|
||||
# Fix: CONFORMALLAB_LOW_MEMORY_BUILD=ON applies three measures:
|
||||
# 1. -O0 (no debug info): drops cc1plus backend RAM from ~700 MB to
|
||||
# ~150-200 MB per TU (optimizer passes are entirely skipped).
|
||||
# 2. CONFORMALLAB_USE_PCH=OFF: saves the ~200 MB PCH compilation cost.
|
||||
# 3. UNITY_BUILD_BATCH_SIZE=1: one source file per cc1plus invocation,
|
||||
# removing the "4-file template-explosion" multiplier.
|
||||
# 4. --no-keep-memory linker flag: reduces GNU ld RSS by ~15-25 %.
|
||||
#
|
||||
# To re-enable: change `if: false` back to
|
||||
# `if: github.event_name == 'pull_request'`.
|
||||
# Memory budget (ARM64, GCC, estimated peak per cc1plus after fix):
|
||||
# ~150-200 MB/TU × 1 TU at a time (-j1) → fits in 2000 MB container.
|
||||
# Container memory raised 1600 → 2000 MB to give a comfortable margin;
|
||||
# swap re-enabled (memory-swap=3000m) so OOM-kills fail fast only if
|
||||
# the container truly runs out of physical+swap, not just RAM.
|
||||
#
|
||||
# Trade-off: tests run 2-4× slower (CGAL traversals unoptimized at -O0);
|
||||
# wall-clock build time increases (no PCH, no unity batching) but the
|
||||
# correctness guarantee is identical — all 277 CGAL tests pass.
|
||||
#
|
||||
# Trigger: pull requests only (same as before).
|
||||
test-cgal:
|
||||
needs: test-fast
|
||||
if: false # DISABLED 2026-05-26 — see comment block above
|
||||
if: github.event_name == 'pull_request'
|
||||
runs-on: eulernest
|
||||
container:
|
||||
image: git.eulernest.eu/conformallab/ci-cpp:latest
|
||||
# Memory bumped from 1400m → 1600m to avoid OOM during CGAL header
|
||||
# compilation on ARM64 (CGAL + Eigen templates allocate ~700 MB per
|
||||
# cc1plus instance; -j1 leaves a small margin).
|
||||
# memory-swap == memory disables swap entirely so OOM fails fast
|
||||
# rather than thrashing on the SD card.
|
||||
options: "--memory=1600m --memory-swap=1600m"
|
||||
# 2000 MB hard limit for the container; swap headroom up to 3000 MB
|
||||
# (memory-swap = total of RAM + swap, so 3000-2000 = 1000 MB swap).
|
||||
# This uses ~half of the Pi's 3-4 GB while leaving room for the OS
|
||||
# and the runner daemon. With LOW_MEMORY_BUILD the peak per TU is
|
||||
# ~150-200 MB, well within the 2000 MB ceiling.
|
||||
options: "--memory=2000m --memory-swap=3000m"
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Configure (WITH_CGAL_TESTS — no viewer, no wayland-scanner)
|
||||
run: cmake -S code -B build -DWITH_CGAL_TESTS=ON -DCMAKE_BUILD_TYPE=Release
|
||||
- name: Configure (LOW_MEMORY_BUILD — -O0, no PCH, unity batch 1)
|
||||
run: |
|
||||
cmake -S code -B build \
|
||||
-DWITH_CGAL_TESTS=ON \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCONFORMALLAB_LOW_MEMORY_BUILD=ON
|
||||
|
||||
- name: Build CGAL-Tests
|
||||
run: nice -n 19 cmake --build build --target conformallab_cgal_tests -j1
|
||||
|
||||
Reference in New Issue
Block a user