How to Limit CPU Computation Consumption for Builds and Compilation
This guide provides strategies to limit CPU usage for CPU-intensive processes like compilation or builds.
1. Limit Parallel Jobs
Many build systems and compilers allow you to control the number of parallel jobs, which directly affects CPU usage.
For
make
: Use the-j
flag to specify the number of parallel jobs:make -j2 # Limits to 2 parallel jobs
Dynamically limit based on the number of CPU cores:
make -j$(nproc --ignore=2) # Uses all but 2 CPU cores
For
cmake
orninja
: Use the-j
flag similarly:ninja -j2 # Limits to 2 parallel jobs
For
gcc
orclang
: Use-j
withlto
(Link-Time Optimization):gcc -flto=2 -o my_program my_program.c
2. Use nice
and renice
Lower the priority of the build process to reduce its CPU impact on other tasks.
Start the build with
nice
:nice -n 10 make -j$(nproc)
Adjust the priority of an ongoing build process:
renice 10 -p <PID>
3. Limit CPU Cores with taskset
Restrict the build process to specific CPU cores to reduce overall CPU usage.
Example: Limit the build to 2 CPU cores (e.g., cores 0 and 1):
taskset -c 0,1 make -j2
4. Use cpulimit
Dynamically limit the CPU usage of the build process to a specific percentage.
Example: Limit
make
to 50% CPU:cpulimit -l 50 -e make
5. Control System-Wide CPU Usage
If you’re running builds in a shared environment, you can use system-wide tools to limit CPU usage.
Using
cgroups
(Linux): Create a control group and limit CPU usage for the build process:cgcreate -g cpu:/buildgroup echo 100000 > /sys/fs/cgroup/cpu/buildgroup/cpu.cfs_quota_us # Limit to 10% CPU echo <PID> > /sys/fs/cgroup/cpu/buildgroup/tasks
Using Docker: If you’re running the build in a Docker container, limit CPU usage:
docker run --cpus="1.5" <image_name> # Limit to 1.5 CPU cores
6. Throttle I/O and CPU Together
Build processes often involve heavy I/O operations. Use tools like ionice
to prioritize I/O and reduce overall system load.
Example:
ionice -c 3 nice -n 10 make -j$(nproc)
7. Pause and Resume Builds
If you need to temporarily free up CPU resources, you can pause and resume the build process.
Pause a process:
kill -STOP <PID>
Resume a process:
kill -CONT <PID>
8. Use Build System-Specific Options
Some build systems have built-in options to limit resource usage.
For
bazel``**:** Use the ``--local_cpu_resources
flag:bazel build --local_cpu_resources=2 //my:target
For
gradle
: Use the--max-workers
flag:./gradlew build --max-workers=2
9. Monitor and Adjust
Use monitoring tools to observe CPU usage and adjust limits as needed.
Linux: Use
htop
,top
, orglances
to monitor CPU usage.Windows: Use Task Manager or Resource Monitor.
macOS: Use Activity Monitor.
—
By combining these techniques, you can effectively limit CPU consumption during compilation or builds while still maintaining reasonable performance.