mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-08-04 02:08:06 +00:00
fix(install): survive the rgbmatrix build on low-memory Pis (#430)
* fix(install): survive the rgbmatrix build on low-memory Pis The one-shot installer failed at Step 6 on a 1GB Pi with "Failed building wheel for rgbmatrix", and told the user to install build tools they already had. The real cause was the kernel OOM killer. Upstream's pyproject.toml declares no [tool.scikit-build] options, so scikit-build-core drives Ninja at its default of nproc+2 jobs -- six concurrent compiles on a 4-core Pi. CMakeLists.txt compiles the same 14 sources three times (~45 translation units), two of them Cython-generated C++ where a single cc1plus peaks near 800MB. That does not fit in 512MB-1GB of RAM. Add scripts/install/lib_lowmem.sh and wire it into the installer: - Cap build parallelism at max(1, min(cores, RAM/768)) via CMAKE_BUILD_PARALLEL_LEVEL, which is what cmake --build actually reads. MAKEFLAGS is ignored by Ninja and is set only as a Makefile-generator fallback. A 4GB Pi 4 still gets 4 jobs; 512MB and 1GB boards get 1. - Add a temporary swapfile sized to bring RAM+swap to 3GB (capped at 2GB), removed once the build finishes. An EXIT trap is the backstop for the error path. Nothing is written to /etc/fstab or /etc/dphys-swapfile. Existing swap is measured excluding zram, which is compressed RAM and so does not help a build OOM. - Keep pip's build tree off tmpfs. Debian 13 mounts /tmp as tmpfs, so the default held the whole C++ build tree in RAM alongside the compiler. - Diagnose OOM failures from the build log and the kernel ring buffer, instead of always blaming missing build tools. The OOM killer writes nothing to pip's output, which is why this was misreported. - Report RAM and the chosen job count in the Step 1 preflight, and emit a heartbeat during the compile so a deliberately serial 15-25 minute build does not look like a hang. New flags --skip-swap and --build-jobs N, with LEDMATRIX_SKIP_SWAP and LEDMATRIX_BUILD_JOBS equivalents. Also skip the duplicate apt-get update that the one-shot installer and first_time_install.sh each ran a minute apart, and complete the dphys-swapfile advice in diagnose_dependencies.sh with the CONF_MAXSWAP line, without which raising CONF_SWAPSIZE above 2048 is silently clamped. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VdsJs65WnUo8BtKHMAGA1q * fix(install): address review findings on the low-memory build path Three fixes from PR review: - Validate --build-jobs / LEDMATRIX_BUILD_JOBS before check_memory's fallback return. When lib_lowmem.sh is absent that return also honoured the override, so a non-numeric value skipped validation and instead blew up later in an arithmetic test in Step 6 with a generic error. - Fall back to the default TMPDIR when the disk-backed build directory cannot be created, rather than pointing the build at a path that does not exist. A nearly-full disk is the likely cause on exactly the devices this targets. - Pass LEDMATRIX_APT_UPDATED explicitly to the sudo child instead of relying on -E, which a sudoers env_reset/env_keep policy can strip. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VdsJs65WnUo8BtKHMAGA1q * fix(install): don't add 30s to every rgbmatrix build The build progress heartbeat slept for the full 30s report interval before re-checking whether the compile had finished, so every build paid up to 30 seconds of dead wall time -- including fast ones on a Pi 4/5 and every --force-rebuild run. Poll every 2s and report every 30s instead. Measured: 30s of overhead on an instant build drops to 2s, with heartbeats still emitted on the same schedule. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VdsJs65WnUo8BtKHMAGA1q --------- Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -82,6 +82,70 @@ python3 web_interface/start.py
|
||||
|
||||
## Common Issues by Category
|
||||
|
||||
### Installation & Build Issues
|
||||
|
||||
#### Step 6 fails: "Failed building wheel for rgbmatrix"
|
||||
|
||||
**Symptoms:**
|
||||
|
||||
```
|
||||
note: This error originates from a subprocess, and is likely not a problem with pip.
|
||||
ERROR: Failed building wheel for rgbmatrix
|
||||
Failed to build rgbmatrix
|
||||
✗ Failed to install rpi-rgb-led-matrix Python package
|
||||
```
|
||||
|
||||
**Cause:**
|
||||
|
||||
Almost always the kernel's out-of-memory killer, not missing build tools. The
|
||||
`rpi-rgb-led-matrix` library compiles roughly 45 C++ translation units, two of
|
||||
them Cython-generated — a single `cc1plus` on those can peak near 800MB. The
|
||||
build system defaults to running several of those at once, which exceeds RAM on
|
||||
512MB and 1GB boards. Because the OOM killer writes nothing to pip's output, the
|
||||
failure looks like a toolchain problem, and `sudo apt install -y
|
||||
python-dev-is-python3 cmake build-essential` will report everything is already
|
||||
up to date.
|
||||
|
||||
**How to confirm:**
|
||||
|
||||
```bash
|
||||
dmesg -T | grep -i "out of memory" # look for "Killed process ... (cc1plus)"
|
||||
free -h # total RAM and swap
|
||||
```
|
||||
|
||||
**Fix:**
|
||||
|
||||
Current versions of the installer handle this automatically: they cap build
|
||||
parallelism based on available RAM and add a temporary swapfile for the build,
|
||||
removing it when the build finishes. If you are on an older checkout, or the
|
||||
temporary swapfile could not be created, either force a serial compile:
|
||||
|
||||
```bash
|
||||
sudo ./first_time_install.sh --build-jobs 1
|
||||
```
|
||||
|
||||
or add permanent swap and re-run the installer, which resumes at Step 6:
|
||||
|
||||
```bash
|
||||
sudo apt install -y dphys-swapfile
|
||||
sudo sed -i 's/^#\?CONF_SWAPSIZE=.*/CONF_SWAPSIZE=2048/' /etc/dphys-swapfile
|
||||
sudo sed -i 's/^#\?CONF_MAXSWAP=.*/CONF_MAXSWAP=2048/' /etc/dphys-swapfile
|
||||
sudo dphys-swapfile swapoff && sudo dphys-swapfile setup && sudo dphys-swapfile swapon
|
||||
sudo ./first_time_install.sh
|
||||
```
|
||||
|
||||
`CONF_MAXSWAP` matters: it defaults to 2048 and silently clamps `CONF_SWAPSIZE`,
|
||||
so setting only `CONF_SWAPSIZE` to a larger value has no effect.
|
||||
|
||||
**Related:**
|
||||
|
||||
- The installer needs roughly 3GB free on the card to place the swapfile. If
|
||||
disk is tight it will say so and skip the swapfile: `sudo apt clean` first.
|
||||
- `sudo bash scripts/check_system_compatibility.sh` reports RAM and disk.
|
||||
- `sudo bash scripts/diagnose_dependencies.sh` dumps build-dependency state.
|
||||
|
||||
---
|
||||
|
||||
### Web Interface & Service Issues
|
||||
|
||||
#### Service Not Running/Starting
|
||||
|
||||
Reference in New Issue
Block a user