View previous topic :: View next topic |
Author |
Message |
Tablestone n00b
Joined: 23 Dec 2016 Posts: 1
|
Posted: Fri Dec 23, 2016 11:04 pm Post subject: Compilation on low end hardware w. distcc, pump, ccache, lxd |
|
|
##
## Compilation on low end computers with distcc, pump, ccache and lxd/lxc containers.
##
1. DESCRIPTION
This is a simple benchmarking study of different compilation configurations with distcc, pump, ccache and lxd/lxc containers.
2. BACKGROUND
I am an experienced Linux user, but a beginner with the Gentoo distro. While running emerge and reading the forums, it became apperent that compiling huge packages, like gcc or a DE, is a very time consuming endeavour. This other day gcc emerged for upgrade. Tried to compile it but the computer shutdown because of too high temprature - Yah! (Later I found out about the 'ondemand' processor configuration and added it as default mode.) So I surveyed my options and compiled my results in this little write-up.
There are no detailed instructions how to install the tools of this setup as they are available elsewhere.
Please feel free to comment, correct or give any suggestions/tweaks.
3. HARDWARE LINE-UP
Computers: 1 master + 2 slaves
Master OS: Gentoo
Processor: Intel Core2 Duo 1.8GHz
Memory: 2G
Swap: 4G
Slave OS: Ubuntu 16.04 + LXD/LXC
Processor: Intel Core2 Duo 2.0GHz & 2.13GHz
Memory: 4G
Swap: 8G
All computers are connected with wire to the same network switch.
4. SOFTWARE INSTALLED
Gentoo Master: distcc, ccache
Ubuntu Slaves: LXD (apt-get install lxd zfs) and latest gentoo (amd64) containers (lxc images list images:)
Containers: distcc ccache
5. NETWORK CONFIG
Ubuntu Slaves:
lxd init: container reachable from the internet=yes
Gentoo Master:
ip route add [container subnet 1]/24 via [ubuntu slave 1 ip]
ip route add [container subnet 2]/24 via [ubuntu slave 2 ip]
6. DISTCC CONFIG
6.1 MAIN CONFIGURATION
Gentoo Master and Slave containers:
DISTCCD_OPTS=""
DISTCCD_EXEC="/usr/bin/distccd"
DISTCCD_PIDFILE="/var/run/distccd/distccd.pid"
DISTCCD_OPTS="${DISTCCD_OPTS} --port 3632"
DISTCCD_OPTS="${DISTCCD_OPTS} --log-level notice --log-file /var/log/distccd.log"
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.0.0/24 --allow 127.0.0.1"
DISTCCD_OPTS="${DISTCCD_OPTS} -N 15"
-- Fix logfile
touch /var/log/distccd.log
chown distcc:adm /var/log/distccd.log
-- Start distccd
rc-update add distccd default
rc-service distccd start
Comment: If you want localhost to run distcc you have to set "--allow 127.0.0.1" and add 127.0.0.1 in your DISTCC_HOSTS environment variable. Just setting "localhost" in DISTCC_HOSTS will not trigger distcc on localhost.
For debugging distcc set: export DISTCC_VERBOSE=1
6.2 RUNNING THE TEST
You can use the command distcc-config but the best option is setting the DISTCC_HOSTS environment variable.
Gentoo Master:
export DISTCC_HOSTS="--randomize localhost/2 X.X.X.A Y.Y.Y.A ..."
export DISTCC_HOSTS="--randomize localhost/2 X.X.X.A,lzo,cpp Y.Y.Y.A,lzo,cpp ..." (for running pump)
Slave containers: -
7. ABOUT THE TEST
The 'time' command is prefixed to all compile commands. I have not tried to tweak any special variables, like ccache cache size, except the N-value in 'make -jN'. For low end computers, distcc + lxc containers seems to be the best option. I have tried compiling the Gentoo kernel with distcc running on Ubuntu 16.04, but got compiling errors - even with the same gcc version. Installing and configuring a Gentoo toolchain on Ubuntu was daunting and would probably mess up my Ubuntu installation. That's why I took the fast and easy way and installed LXD on Ubuntu, downloaded a Gentoo container image. Voila - the toolchain was now identical, and the kernel could compile without errors.
The gentoo containers are running on the 2 Ubuntu "slaves". The 'lxc' value in the table headers below is the amount of containers utilized for each compile round.
The kernel configuration is customized and slimmed for the computer, if you think the compile time is oddly low.
Testing with distcc,pump and ccache together gives alot of warnings like: "... cannot use distcc_pump on already preprocessed file (such as emitted by ccache)".
As you will see in my results, in this small setup of computers, pump or ccache is not helping getting the numbers down.
8. REMEMBER
After each compilation with ccache you have to run 'ccache -c' and 'ccache -C' to empty the cache before next run. And of course run: make clean.
9. EMERGE
If you are going to use distcc with emerge you have to configure your make.conf:
Example configuration:
FEATURES="distcc"
MAKEOPTS="-jN -lM" (N=your calculated number, M=cores on master computer)
CFLAGS="... -march=YOUR_PROCESSOR_TYPE", example: -march=core2, NOT: -march=native (!)
10. CALCULATING N (in make -jN)
Default formula for N is: computers * cores * 2 + 1
But when using LXC containers, that formula will not suit that well. So I had to find value that gives the lowest compile time. It's about hammering the distcc-slaves and keeping them busy all the time, but not to much or you will start to DDos yourself. For this setup, N=45 seems to be the peak value for master.
If you get to many "IO Errors" or "failed to distribute" during make, you probably have to lower the N.
11. FUTURE STUDIES
- Could I use my friends computers over the Internet to lower the compile time even further?
- distcc seems to be creating new network connections for every job. If persistent connections could be set up, could that speed things up more?
12. THE BENCHMARK RESULTS
Code: | ##
## Compiling with no helpers
##
cmd: make
RUN1 RUN2
=================================
real 20m4.354s 20m22.167s
user 19m31.480s 19m52.460s
sys 1m2.170s 1m5.460s
cmd: make -j3
RUN1 RUN2
=================================
real 12m49.139s 12m47.887s
user 22m40.290s 22m41.180s
sys 1m9.780s 1m11.990s
##
## Compiling with distcc
##
cmd: make -jN CC="distcc"
lxc/N 2/20 4/30 6/40 8/45
======================================================
real 6m41.775s 6m20.539s 6m7.839s 6m11.272s
user 10m31.290s 9m52.990s 9m25.970s 9m25.080s
sys 1m2.760s 0m59.480s 1m0.650s 1m3.410s
real 6m40.486s 6m25.932s 6m11.976s 6m9.344s
user 10m27.920s 9m50.820s 9m34.020s 9m27.780s
sys 1m4.620s 1m0.890s 1m1.500s 1m2.330s
##
## Compiling with distcc and pump
##
cmd: pump make -jN CC="distcc"
lxc/N 2/20 4/30 6/40 8/45
======================================================
real 7m2.199s 6m33.341s 6m59.561s 6m56.275s
user 9m14.550s 8m21.150s 8m11.450s 7m37.140s
sys 0m54.030s 0m51.860s 0m52.690s 0m52.400s
real 7m12.727s 6m43.063s 6m57.651s 6m54.132s
user 9m32.270s 8m25.900s 8m14.170s 7m35.300s
sys 0m53.320s 0m53.710s 0m52.620s 0m50.240s
##
## MAKE + DISTCC + CCACHE
##
cmd: make -jN CC="ccache distcc"
lxc/N 2/20 4/30 6/40 8/45
======================================================
real 7m32.975s 6m51.302s 6m39.652s 6m35.960s
user 11m47.400s 10m29.930s 10m4.540s 9m59.630s
sys 1m10.380s 1m6.310s 1m8.380s 1m6.750s
real 7m25.447s 6m54.705s 6m41.620s 6m33.465s
user 11m35.120s 10m39.680s 10m14.620s 9m53.620s
sys 1m9.480s 1m6.010s 1m6.840s 1m7.400s
##
## MAKE + DISTCC + CCACHE + PUMP
##
cmd: pump make -jN CC="ccache distcc"
lxc/N 2/20 4/30 6/40 8/45
======================================================
real 7m32.727s 6m57.459s 6m40.352s 6m33.930s
user 11m46.700s 10m37.200s 10m7.870s 9m57.190s
sys 0m59.440s 0m57.680s 0m57.560s 0m56.050s
real 7m26.226s 6m53.005s 6m41.323s 6m34.207s
user 11m35.750s 10m31.770s 10m10.770s 9m53.930s
sys 0m59.850s 0m57.800s 0m57.900s 0m57.210s |
##
## END
## |
|
Back to top |
|
|
eccerr0r Watchman
Joined: 01 Jul 2004 Posts: 9678 Location: almost Mile High in the USA
|
Posted: Sat Dec 24, 2016 6:40 am Post subject: |
|
|
I've found:
- there's a lot of "junk" that can't be distcc'ed - so it buys nothing
- Network connection speed hurts - anything less than 100Mbit can really hurt.
My distcc system that I REALLY noticed this behavior:
P3-933 Fujitsu Stylistic 512MB - distcc master. Experimenting with ethernet and wifi.
Core2 Quad 9550S 8GB - Distcc slave (one 32 bit VM, and 64-bit crossdev)
Core i7-2700k 8GB - Distcc slave (64-bit crossdev)
Builds are still very slow on the P3, transferring distcc files to the slaves took a really long time on wifi, and it almost seemed like it didn't really help overall. Behavior is very similar on my Atom 1.6GHz.
Core2 machines that you have are considerably faster than the p3...
I ended up doing Jaglover's suggestion to NFS mount the slow machine and build on the fast one... This might not be an option for you as your machines are on the same order of magnitude, but for me the p3 and many of my other machines aren't even worth being in my distcc pool because of the speed ratios... _________________ Intel Core i7 2700K/Radeon R7 250/24GB DDR3/256GB SSD
What am I supposed watching? |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|