diff --git a/docker/Dockerfile b/docker/Dockerfile index f7d6215..0d999f0 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -88,6 +88,15 @@ RUN . /tmp/versions.env \ && curl -fsSL "https://github.com/OpenMathLib/OpenBLAS/releases/download/v${OPENBLAS_VERSION}/OpenBLAS-${OPENBLAS_VERSION}.tar.gz" \ | tar -xz -C /tmp \ && cd "/tmp/OpenBLAS-${OPENBLAS_VERSION}" \ + # musl's pthread default stack is 128 KB (vs glibc's 8 MB read from + # RLIMIT_STACK). OpenBLAS worker threads inherit it and overflow on + # DYNAMIC_ARCH Fortran kernels with large auto-arrays → SIGSEGV at the + # first BLAS3 call from MUMPS. Force an 8 MB stack on each worker. + # Guard: fail the build if the upstream anchor disappears so a silent + # OpenBLAS refactor can't reintroduce the crash. + && grep -q 'pthread_attr_init(&attr);' driver/others/blas_server.c \ + && sed -i 's|pthread_attr_init(&attr);|pthread_attr_init(\&attr); pthread_attr_setstacksize(\&attr, 8 << 20);|' driver/others/blas_server.c \ + && grep -q 'pthread_attr_setstacksize(&attr, 8 << 20);' driver/others/blas_server.c \ && make -j"$(nproc)" \ NO_SHARED=1 \ USE_THREAD=1 USE_OPENMP=0 \ diff --git a/docker/rts-flags.sh b/docker/rts-flags.sh index 7388a57..c4f1b7f 100755 --- a/docker/rts-flags.sh +++ b/docker/rts-flags.sh @@ -40,7 +40,13 @@ CHUNK_MB=$((NURSERY_MB / 32)) MAX_MB=$((RAM_MB * 3 / 4)) [ $MAX_MB -lt 2048 ] && MAX_MB=2048 -RTS_FLAGS="+RTS -N -M${MAX_MB}M -H${HEAP_MB}M -A${NURSERY_MB}M -n${CHUNK_MB}m -qg0 -c -F1.5 -I30 -RTS" +# -Fd1.0 (GHC 9.10+): return free heap blocks to the OS over ~1 idle period +# instead of holding them indefinitely after a parsing spike. Default decay +# (4.0) keeps RSS pinned near the peak for minutes. +# -I0.3 (GHC default): trigger idle-time major GC promptly. The previous +# -I30 deferred GC for 30 s, hiding live-data drops and starving -Fd of +# free blocks to release. +RTS_FLAGS="+RTS -N -M${MAX_MB}M -H${HEAP_MB}M -A${NURSERY_MB}M -n${CHUNK_MB}m -qg0 -c -F1.5 -Fd1.0 -I0.3 -RTS" echo "RTS_FLAGS=\"$RTS_FLAGS\""