Struggling with FreeNAS power consumption optmization

DisksView

I’ve been using FreeNAS 8.3.0 for several months now and it became such a work/entertainment hub that I simply started take it for granted. Yesterday I needed to create a new dataset and just out of curiosity I looked at the Reporting tab. My box has been running for over a month now, with all four disks spinning the entire time.

Ok, spinning disks evolved a long way but this is just a waste of energy. If it is in the middle of the night or during the day when no one is at home it should be in stand-by mode. I don’t want to manually turn it on and off because I will forget it and I don’t want to schedule power on and add a cron job to shut it down because I might be working late some day or just finishing a extra long movie and have to wait until it boots up again.Movie Fifty Shades Darker (2017)

It has to be automatic and seamless

Thankfully FreeNAS offers settings on the web ui to manage this. After a lot of experimentation and frustation I figured it out:

First of all, these settings seem to come into effect only after a reboot. A little note somewhere would have been helpful.

Second, on the View Disks page, the HDD Standby and the Advanced Power Management settings seem to be mutually exclusive. The first one just a “dumb” timer (that I don’t know if is in seconds of minutes, it’s behaviour is erratic) and the second one is a setting that is applied by the HD firmware. APM values lower than 128 allow the drive to spin down when idle.

After reading How to find out if a drive is spinning down properly and HDD standby times not as expected on the FreeNAS forum I did a couple more experiments.

All my drives have been set with HDD Standby = Always On and Advanced Power Management = 64.

Reboot and a improved check-spinning.sh:

#!/bin/sh

while [ 1 ]
do
    echo -n `date`    
    camcontrol devlist | awk -F\( '{print $2'} | awk -F\, '{print $1}' |while read LINE
    do
        CM=$(camcontrol cmd $LINE -a "E5 00 00 00 00 00 00 00 00 00 00 00" -r - | awk '{print $10}')
        if [ "$CM" = "FF" ] ; then
            echo -n " SPINNING  "
        elif [ "$CM" = "00" ] ; then
            echo -n "   IDLE    "
        else 
            echo -n "  UNKNOWN  "
        fi
    done    
    echo
    sleep 5
done

I let it run for a few hours and the output was something like:

Sat Mar 16 21:41:23 BRT 2013   IDLE       IDLE       IDLE       IDLE    
Sat Mar 16 21:41:28 BRT 2013   IDLE       IDLE       IDLE       IDLE    
Sat Mar 16 21:41:33 BRT 2013   IDLE       IDLE       IDLE       IDLE    
Sat Mar 16 21:41:38 BRT 2013 SPINNING   SPINNING   SPINNING   SPINNING  
Sat Mar 16 21:41:48 BRT 2013 SPINNING   SPINNING   SPINNING   SPINNING  
Sat Mar 16 21:41:53 BRT 2013 SPINNING   SPINNING   SPINNING   SPINNING  
Sat Mar 16 21:41:59 BRT 2013 SPINNING   SPINNING   SPINNING   SPINNING  
Sat Mar 16 21:42:04 BRT 2013 SPINNING   SPINNING   SPINNING   SPINNING  
Sat Mar 16 21:42:10 BRT 2013 SPINNING   SPINNING   SPINNING   SPINNING  
Sat Mar 16 21:42:15 BRT 2013 SPINNING   SPINNING   SPINNING   SPINNING  
Sat Mar 16 21:42:20 BRT 2013 SPINNING   SPINNING   SPINNING   SPINNING  
Sat Mar 16 21:42:26 BRT 2013 SPINNING   SPINNING   SPINNING   SPINNING  
Sat Mar 16 21:42:31 BRT 2013 SPINNING   SPINNING   SPINNING   SPINNING  
Sat Mar 16 21:42:36 BRT 2013 SPINNING     IDLE       IDLE     SPINNING  
Sat Mar 16 21:42:41 BRT 2013 SPINNING     IDLE       IDLE     SPINNING

The second script I wrote was to log all processes touching the disk at the time that they were being used.Watch Full Movie Online Streaming Online and Download

Following some suggestions from StackExchange, check-top.sh:

#!/bin/sh

while [ 1 ]
do
    echo -n `date`
    top -I -mio -b -n -a 2
    sleep 1
done

With the long output of this one I cross-referenced all times and found out that the culprit were three python scripts scheduled to run every minute: /usr/local/bin/graph.py, /usr/local/www/freenasUI/tools/alert.py and /usr/local/www/freenasUI/tools/autosnap.py.

They are responsible for updating the reports on the gui, for updating alerts and for generating automatic snapshots and replicating them to offsite FreeNAS boxes.

Don’t get me wrong, I use and love these three features, but I don’t need to have these scripts running every minute. Basically, if I am not connected to my NAS reading or writing files to it, I don’t need automatic snapshots or replication (nothing is changing right?). If there is no one connected, there is also no need to updating reports that no one is seeing.

How did I fixed it?

I wrote a bash script to check the state of my disks before invoking the passed command. Here is /conf/base/etc/runifspinning.sh:

#!/bin/bash

while read LINE; do
    CM=$(camcontrol cmd $LINE -a "E5 00 00 00 00 00 00 00 00 00 00 00" -r - | awk '{print $10}')
    if [ "$CM" = "00" ] ; then
        exit 0
    fi
done < <(camcontrol devlist | awk -F\( '{print $2'} | awk -F\, '{print $1}')

$*

Then, I changed the base crontab at /conf/base/etc/crontab from:

*/5 *   *   *   *   root    /usr/local/bin/python /usr/local/bin/graph.py
*/5 *   *   *   *   root    /usr/local/bin/python /usr/local/www/freenasUI/tools/alert.py > /dev/null 2>&1
*   *   *   *   *   root    /usr/local/bin/python /usr/local/www/freenasUI/tools/autosnap.py > /dev/null 2>&1

To:

*/5 *   *   *   *   root    /conf/base/etc/runifspinning.sh /usr/local/bin/python /usr/local/bin/graph.py
*/5 *   *   *   *   root    /conf/base/etc/runifspinning.sh /usr/local/bin/python /usr/local/www/freenasUI/tools/alert.py > /dev/null 2>&1
*   *   *   *   *   root    /conf/base/etc/runifspinning.sh /usr/local/bin/python /usr/local/www/freenasUI/tools/autosnap.py > /dev/null 2>&1

Rebooted and bingo! Now, I still have all the functionality but only when the disks are already spinning. No more waking from idle to perform repetitive tasks.

A few last notes

  • To change the base configuration you will have to ssh into your box and be able to run commands as root.
  • All these changes will probably be lost when upgrading since they are not persisted on the config database.
  • To make /conf writable you can use mount -uw /.

2 thoughts on “Struggling with FreeNAS power consumption optmization

  1. Also struggling with this, but with much less knowledge on how to go about it.

    Is the article still relevant to 9.2.1.8? I could not find the lines in the article in /conf/base/etc/crontab on my server.

Leave a Reply

Your email address will not be published. Required fields are marked *