BOINC, power cuts and an APC UPS

I’ve experienced a number of power cuts here today due to repairs being carried out on the local grid after the recent freezing weather. Not a problem, I thought, as I’ve got uninterruptible power supplies on all my computers. As long as the electricity isn’t off for too long, it’ll be fine.

And indeed, “Server Corner” in the room upstairs was fine. My LAN switch, the HP Microserver, Raspberry Pis and their external HDs carried on running on their UPS throughout the whole power cut.

The trouble was that my internet router and the house phone share their UPS with my main PC – which happened to be keeping the room warm while I was out walking the doy by running BOINC full-chat on its four CPU cores and on the GPU too. It’s power consumption is pretty close to the UPS’s rated capacity when doing that, so when the power failed, my APC Back-UPS 650 CS was hit with a load close to its recommended load capacity (>90%).

This shouldn’t have been a problem but for three things that have happened since we last had a long power cut. First, I’ve started running BOINC on my main PC again. Second, I recently removed the control cable from the back its APC UPS in order to test a “for spares or repair, no cables and sorry about the sticky mess” APC UPS I scored on eBay (it was fine – it just needed a new battery… and disinfecting). Third, I forgot I’d moved the UPS control cable over to the 99p eBay UPS and had then baulked at buying another control cable when I discovered that they cost nearly as much as a new battery. The cable in question being one of APC’s proprietary USB-to-not-quite-an-ethernet-jack ones.

The result of all this was that my main PC never received a signal from its UPS that the power was out, carried on running BOINC at full-chat and fully depleted the UPS battery in around two minutes. Having reached a critical battery level, UPS then shut itself down, depriving the internet router and house phone of power.

So much for sustaining essential services during a power cut!

Anyway, I’ve now returned the UPS data cable to my main computer and configured apcupsd (the Linux APC UPS daemon) to automatically shut down boinc-client when mains power is lost and restart it when power is restored.

To do this, three files must be edited:
/etc/apcupsd/apcupsd.conf
/etc/apcupsd/onbattery
/etc/apcupsd/offbattery

but before that, start boinc-client and then from the command line, run the command sudo apcaccess status to display your UPS status data. We’re interested in the TIMELEFT value. Note it down.

NB: I’m assuming that you already have apcupsd installed and configured for your UPS and have the data cable connected.

Now open /etc/apcupsd/apcupsd.conf in your favourite text editor. Look for the variables ONBATTERYDELAY, MINUTES, BATTERYLEVEL and TIMEOUT.

ONBATTERYDELAY should be set to only a few seconds – we want boinc-client running on batteries for as short a time as possible.

MINUTES must be set to less than the TIMELEFT value obtained from the output of the apcaccess status command while boinc-client is running· Otherwise a complete system shutdown will be initiated before boinc-client can be stopped.

BATTERYLEVEL should be set to the battery percentage you do want to initiate system shutdown at. I’ve set mine to 70 in order to leave a decent capacity for running the internet router and house phone.

TIMEOUT is set to zero.

Now save the file and restart the apcupsd daemon.

The final step is to add the appropriate commands for stopping and starting boinc-client to /etc/apcupsd/onbattery and /etc/apcupsd/offbattery. In each file the command should be added after the #!/bin/bash line but before the default emailing script that’s already in the files.

To /etc/apcupsd/onbattery add the line /sbin/service boinc-client stop (or it’s equivalent for your system – first experiment with starting and stopping boinc-client from the command line if you’re not sure) and to /etc/apcupsd/offbattery add the line /sbin/service boinc-client restart. Save and close the files. You should now be set up for automatically turning the CPU and GPU intensive boinc-client off whenever the power goes out.

If you want to test this, load up your sysstem monitor so you can see the graph of CPU utilisation. It should be pretty high with boinc-client running. Now cut the power at the wall socket. Within seconds, the CPU utilistation should drop as apcupsd reads the onbattery script and kills boinc-client.

To illustrate the benefits this has, here are the numbers for my system. With boinc-client running, apcaccess status shows

LOADPCT  :  88.0 Percent Load Capacity
...
TIMELEFT :   4.5 Minutes

and the power meter at the wall socket that the UPS is plugged into shows a UPS load of 3000W/325VA. Whereas without boinc-client I get

LOADPCT  :  47.0 Percent Load Capacity
...
TIMELEFT :   14 Minutes

and the power meter at the wall socket that the UPS is plugged into shows a UPS load of 140W/170VA.

This is quite a useful improvement in UPS runtime and just goes to show both how much boinc-client can stress a powerful machine when it’s running and how efficiently Intel processors and nVidia GPUs can throttle back when there’s no load on them.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s