A known problem of running SBS on a DNS-323 is that the disk never
hibernate.
Some time ago I had presented in this post
(http://forums.slimdevices.com/showpost.php?p=386614&postcount=110) a
simple solution to make the server start/stop automatically when a
client connects to it. This solution involving the SvrPowerControlPlugin
(see http://forums.slimdevices.com/showthread.php?t=48521) and a simple
script listening for a connection on the port used by SBS basically
worked and the script was largely improved by Sydney on his blog
(http://bfg100k.blogspot.com/2009/05/on-demand-startstop-squeezecenter.html)
but it also had a drawback: when you try to connect a squeezebox to a
"sleeping" server using this technique, you have to wait about 2min for
the server to be up before you can hear music. This is a trade-off to
save energy and the lifetime of your hard-disk, but it is not really
comfortable. 
After having posted my technique I was busy on other things and hadn't
looked again at this until shortly when I tried different approaches to
get the disk sleep without this drawback.

The first thing I tried was to move the ffp plugins to an USB stick.
There are several ready to use scripts on the internet to do that
easily. I used this one
(http://forum.dsmg600.info/t3203-setup.sh-script-%28and-documenntation%29-mount-root.html)
as well as the additional explanations there:
(http://bfg100k.blogspot.com/2008/11/upgrading-ffp-05-and-moving-it-to-usb.html).
Moving ffp to an USB stick doesn't solve the hibernation problem with
Squeezebox Server, because the swap file is still on the disk. But it
makes ffp self contained on the stick (you can remove the stick to boot
without it), and allows the disk to stay down until you really need it.


The next thing I tried was to move the swap file to the USB stick.
There are good instructions there
(http://forum.dsmg600.info/viewtopic.php?id=3400) explaining how to do
it. The result was disappointing: it removed the disk accesses that
prevented the hibernation, but the read rate of the USB stick was so
slow that everything ran at a felt pace of 10% the original speed of the
system. Maybe the problem is that I used the cheapest 2Gb stick I could
find, but I didn't want to invest more, since it is quite probable that
the stick wouldn't last very long with the constant write operations
caused by the swap. So I gave up that idea. I kept ffp on the USB stick
but with a swap on the disk. 

I finally looked a bit deeper in my original idea of waiting for client
activity to start the full server and ran some tests to find a way to
reduce this 2min waiting time before the server is up. My idea was that
instead of running a small program starting the full SBS when clients
connect, I could start at least a part of SBS up to a point that doesn't
cause swap activities. During these tests, I found out that the real
problem that made the disk wake up are the constant communication
between SBS and MySQL (apparently 1 query every 30s). That's how I came
to the following solution:

- Instead a starting a dummy program listening on the port 3483 and
starting SBS when a connection is detected, I start SBS until a point
where it is at 95% initialized, but the network activity hasn't started
yet. Then I freeze the execution at that point until a connection is
detected on port 3483 (like with the old technique). SBS in this frozen
status doesn't prevent the disk to swap. A part of goes to the swap,
because it is too big to fit in memory, but since it sleeps, it is never
read back from the swap before a connection is detected. Once a
connection is detected, the initialiation of SBS is resumed and at the
end the server is exactly in the same state as if it had been started
normally. The difference between this approach and the old technique is
that instead of having to wait 2min for the who server to come up, you
only need to wait a couple of seconds for the last 5% of the
initialization to start the network activity. 
Later, when all clients are idle, the SvrPowerControl plugin is used to
connect all clients to MySqueezeBox.com and restart the server which
comes back in this sleeping state initialized at 95% until a client
connects again.
The drawback of this technique is that it requires a small change in
the code of SBS, but the change is so minimal that it can be done by
anybody. 

Here is the procedure to follow:

1)##### Prerequesites
My starting point is FFP 0.5 and SBS 7.4.1 installed from the fonz
packages (http://www.inreto.de/dns323/fun-plug/0.5/) on an USB stick. I
use the option of the USB script rebooting off the USB stick, since it
is supposed to save more RAM (see explanation under
http://forum.dsmg600.info/t3203-setup.sh-script-%28and-documenntation%29-mount-root.html).
The firmware of my DNS323 is 1.05. I am pretty sure that the same
technique would work even if ffp is not installed on an USB stick, but I
didn't test.

2)##### Install the SrvrPowerControl plugin
- Telnet your DNS323

Code:
--------------------
    
  # cd /ffp/lib/squeezecenter/Plugins/
  # wget -O SrvrPowerCtrl.zip 
http://srvrpowerctrl.googlecode.com/svn/SrvrPowerCtrl_beta.zip
  # unzip SrvrPowerCtrl.zip
  # rm SrvrPowerCtrl.zip
  
--------------------


3)##### Modify Slimserver.pl
- Edit the file /ffp/lib/squeezeboxserver/slimserver.pl as follow
(alternative you can replace it by the new version I attached to this
thread, if you are using exactly the same version of SBS as I do:
7.4.1)

- Add the line in bold at the beginning of the file:

Code:
--------------------
    
  (...)
  require 5.008_001;
  use strict;
  use warnings;
  USE SOCKET;
  
  (...)
  
--------------------


- Search for the following section in the code (line 456) and comment
out the 2 lines in bold


Code:
--------------------
    
  (...)
  main::INFOLOG && $log->info("UDP init...");
  Slim::Networking::UDP::init();
  
  #   MAIN::INFOLOG && $LOG->INFO(\"SLIMPROTO INIT...\");
  #   SLIM::NETWORKING::SLIMPROTO::INIT();                                    
  
  main::INFOLOG && $log->info("Cache init...");
  Slim::Utils::Cache->init();
  (...)
  
--------------------


- Search for the following section (at line 556) and add the code in
bold

Code:
--------------------
    
  (...)
  Slim::Utils::Timers::setTimer(
  undef,                                                          
  time() + 30,
  \&Slim::Utils::Update::checkVersion,                            
  );                                                                      
  
  ####### CHANGED FOR DNS323
  ####### SUSPEND THE EXECUTION UNTIL A CLIENT TRIES TO CONNECT
  MY $SS_PORT = 3483;
  MY $PORT = SHIFT || $SS_PORT;
  MY $PROTO = GETPROTOBYNAME('TCP');
  
  # CREATE A SOCKET
  SOCKET(SERVER, PF_INET, SOCK_STREAM, $PROTO) OR DIE \"SOCKET: $!\";
  SETSOCKOPT(SERVER, SOL_SOCKET, SO_REUSEADDR, 1) OR DIE \"SETSOCK: $!\";
  MY $PADDR = SOCKADDR_IN($PORT, INADDR_ANY);
  
  # BIND AND LISTEN
  BIND(SERVER, $PADDR)      OR DIE \"BIND: $!\";
  LISTEN(SERVER, 1) OR DIE \"LISTEN: $!\";
  
  # WAIT FOR A CONNECTION
  MY $CLIENT_ADDR = ACCEPT(CLIENT, SERVER);
  
  # TERMINATE CONNECTION WITH CLIENT
  CLOSE CLIENT;
  CLOSE SERVER;
  
  # NOW START THE UDP LISTENING OF THE SQUEEZEBOX SERVER
  # (WHAT WAS COMMENTED OUT BEFORE)
  MAIN::INFOLOG && $LOG->INFO(\"SLIMPROTO INIT...\");
  SLIM::NETWORKING::SLIMPROTO::INIT();
  
  ####### END OF CHANGE
  
  main::INFOLOG && $log->info("Squeezebox Server HTTP enable...");
  Slim::Web::HTTP::init2();
  
  # otherwise, get ready to loop
  $lastlooptime = Time::HiRes::time();
  (...)
  
--------------------


4)##### Modify /ffp/start/slimserver.sh
This script needs to be slightly modified because in the current
version the restart command fails, because it doesn't wait long enough
for the server to be stopped before starting it again.
Edit the file and add the line in bold in the following section:


Code:
--------------------
    
  slimserver_stop()
  {
  if [ -r /ffp/lib/squeezeboxserver/Logs/slimserver.pid ]; then
  kill $(cat /ffp/lib/squeezeboxserver/Logs/slimserver.pid)
  fi
  killall slimserver.pl 2>/dev/null
  *sleep 30*
  }
  
--------------------


5)##### Configure sudoers to allow the user nobody to restart SBS

Code:
--------------------
    
  # cd /ffp/etc
  # chmod u+w sudoers
  # echo "nobody ALL= NOPASSWD: /ffp/bin/sh /ffp/start/slimserver.sh restart" 
>> sudoers
  # chmod u-w sudoers
  
--------------------


6)##### Start the server

Code:
--------------------
    
  # sh /ffp/start/slimserver.sh start
  
--------------------

With the command top, you can observe that it starts normally and at
some point, with a memory usage of about 92% it sleeps.
Now let a client connect to it, and you'll see with top that it wakes
up and the client gets the connection shortly after that.

7)##### Edit the properties of the SvrPowerControl:
Open the web interface, edit the properties of the SvrPowerControl
plugin as follow:
- Check the option "Include “Shutdown to SqueezeNetwork” as a menu
option?"
- Edit the command "Shutdown Command (include full path and cmd line
args):" as follow: 
Code:
--------------------
    sudo /ffp/bin/sh /ffp/start/slimserver.sh restart
--------------------

- Let all the other options unchecked
- In the section "Idle Player Monitor", check the option "Monitor idle
Player" and set the "Action to take after idle time:" to "Shutdown to
SqueezeNetwork"
- Setup the idle time you allow before the server goes to bed.
- Save the properties

After all clients are idle for the time you set in the properties, you
should see the process of the server stop and restart to the standby
menu.

Note that if the clients are not completely powered off and still
connected to the server, it will cause the server to fully start again.
That's why it is recommanded to setup the properties of the
SvrPowerControl to "Shutdown to SqueezeNetwork", and that you only
connect to the DNS323 when you want to listen to your local library. For
alarms and internet radio you can use SqueezeNetwork...

Yannick


+-------------------------------------------------------------------+
|Filename: slimserver.pl.zip                                        |
|Download: http://forums.slimdevices.com/attachment.php?attachmentid=8605|
+-------------------------------------------------------------------+

-- 
yannick
------------------------------------------------------------------------
yannick's Profile: http://forums.slimdevices.com/member.php?userid=19770
View this thread: http://forums.slimdevices.com/showthread.php?t=70856

_______________________________________________
plugins mailing list
plugins@lists.slimdevices.com
http://lists.slimdevices.com/mailman/listinfo/plugins

Reply via email to