summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/TIPS.txt (renamed from doc/HOWTO.txt)20
-rw-r--r--monitorplugins/net.py (renamed from monitorplugins/network.py)29
-rw-r--r--tuningplugins/disk.py10
-rw-r--r--tuningplugins/net.py48
4 files changed, 93 insertions, 14 deletions
diff --git a/doc/HOWTO.txt b/doc/TIPS.txt
index 9f2d0f9..6b76dd1 100644
--- a/doc/HOWTO.txt
+++ b/doc/TIPS.txt
@@ -1,5 +1,8 @@
=== Simple user tips for improving power usage ===
+* Use a properly dimensioned system for the job (no need for overpowered systems for simple Desktop use e.g.)
+* For servers consolidate services on fewer systems to maximize efficiency of each system
* Enforce turning of machines that are not used (e.g. company policy)
+* Unplug and/or turn of peripherals that aren't used (e.g. external USB devices, monitors, printers, scanners)
* Turn of unused hardware already in BIOS.
* Disable power hungry features.
* Enable CPU scaling if supported for ondemand CPU governor. DONT use powersave governor, typically uses more power than ondemand
@@ -12,17 +15,24 @@
** hdparm -S240 /dev/sda (20m idle to spindown)
** hdparm -B1 /dev/sda (Max powersave mode)
* Make sure writes to hd don't wake it up too quickly:
-** Set flusing to once every hour
-** echo "360000" > /proc/sys/vm/dirty_writeback_centisecs
+** Set flusing to once 5 minutes
+** echo "3000" > /proc/sys/vm/dirty_writeback_centisecs
** Enable laptop mode
-** echo "1" > /proc/sys/vm/laptop_mode
+** echo "5" > /proc/sys/vm/laptop_mode
+* Use relatime for your / partition
+** mount -o remount,relatime /
+* Disable CD-ROM polling from HAL (prevents popups when a CD is inserted):
+** hal-disable-polling --device /dev/scd0
+* Enable USB autosuspend by adding the following to the kernel boot commandline:
+** usbcore.autosuspend=5
* Screensaver needs to dpms off the screen, not just make colors black. To turn of monitor after 120s when X is running:
** xset dpms 0 0 120
=== Simple programmer tips for improving power usage ===
+* Avoid unecessary work/computation
* Wake up only when necessary
-* No poll() calls
-* If you wake up, do everything at once (race to idle)
+* Do not actively poll in programs or use short regular timeouts, rather react to events
+* If you wake up, do everything at once (race to idle) and as fast as possible
* Use large buffers to avoid frequent disk access. Write one large block at a time
* Don't use [f]sync() if not necessary
* Group timers accross applications if possible (even systems)
diff --git a/monitorplugins/network.py b/monitorplugins/net.py
index 64c493a..0091b26 100644
--- a/monitorplugins/network.py
+++ b/monitorplugins/net.py
@@ -21,6 +21,19 @@ import os
class NetMonitor:
def __init__(self):
self.devices = {}
+ devs = open("/proc/net/dev").readlines()
+ for l in devs:
+ l = l.replace(":", " ")
+ v = l.split()
+ d = v[0]
+ if not d.startswith("eth"):
+ continue
+ self.devices[d] = {}
+ self.devices[d]["new"] = ['0', '0', '0', '0']
+ self.devices[d]["max"] = [70*1024*1024, 1, 70*1024*1024, 1]
+ self.__updateStat__(d)
+ self.devices[d]["max"] = [70*1024*1024, 1, 70*1024*1024, 1]
+ print self.devices
def __calcdiff__(self, dev):
l = []
@@ -29,9 +42,15 @@ class NetMonitor:
return l
def __updateStat__(self, dev):
- l = open("/sys/block/"+dev+"/stat", "r").read()
- self.devices[dev]["old"] = self.devices[dev]["new"]
- self.devices[dev]["new"] = l.split()
+ self.devices[dev]["old"] = self.devices[dev]["new"][:]
+ l = open("/sys/class/net/"+dev+"/statistics/rx_bytes", "r").read().strip()
+ self.devices[dev]["new"][0] = l
+ l = open("/sys/class/net/"+dev+"/statistics/rx_packets", "r").read().strip()
+ self.devices[dev]["new"][1] = l
+ l = open("/sys/class/net/"+dev+"/statistics/tx_bytes", "r").read().strip()
+ self.devices[dev]["new"][2] = l
+ l = open("/sys/class/net/"+dev+"/statistics/tx_packets", "r").read().strip()
+ self.devices[dev]["new"][3] = l
l = self.__calcdiff__(dev)
for i in xrange(len(l)):
if l[i] > self.devices[dev]["max"][i]:
@@ -48,8 +67,8 @@ class NetMonitor:
ret["NET"] = {}
for dev in self.devices.keys():
ret["NET"][dev] = {}
- ret["NET"][dev]["READ"] = float(self.devices[dev]["diff"][1]) / float(self.devices[dev]["max"][1])
- ret["NET"][dev]["WRITE"] = float(self.devices[dev]["diff"][5]) / float(self.devices[dev]["max"][5])
+ ret["NET"][dev]["READ"] = float(self.devices[dev]["diff"][0]) / float(self.devices[dev]["max"][0])
+ ret["NET"][dev]["WRITE"] = float(self.devices[dev]["diff"][2]) / float(self.devices[dev]["max"][2])
return ret
_plugin = NetMonitor()
diff --git a/tuningplugins/disk.py b/tuningplugins/disk.py
index e41403f..5bdcea2 100644
--- a/tuningplugins/disk.py
+++ b/tuningplugins/disk.py
@@ -16,7 +16,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
-import os
+import os, copy
class DiskTuning:
def __init__(self):
@@ -35,12 +35,14 @@ class DiskTuning:
def setTuning(self, load):
disks = load.setdefault("DISK", {})
+ oldidle = copy.deepcopy(self.devidle)
for dev in disks.keys():
devload = disks[dev]
self.__updateIdle__(dev, devload)
- if self.devidle[dev]["READ"] == 30 and self.devidle[dev]["WRITE"] == 30:
- os.system("hdparm -S5 /dev/"+dev)
- os.system("hdparm -B1 /dev/"+dev)
+ if self.devidle[dev]["READ"] == 30 or self.devidle[dev]["WRITE"] == 30:
+ os.system("hdparm -Y -S60 -B1 /dev/"+dev)
+ if oldidle.has_key(dev) and oldidle[dev]["READ"] > 30 and oldidle[dev]["WRITE"] > 30 and (self.devidle[dev]["READ"] == 0 or self.devidle[dev]["WRITE"] == 0):
+ os.system("hdparm -S255 -B127 /dev/"+dev)
print(load, self.devidle)
_plugin = DiskTuning()
diff --git a/tuningplugins/net.py b/tuningplugins/net.py
new file mode 100644
index 0000000..8ac2db1
--- /dev/null
+++ b/tuningplugins/net.py
@@ -0,0 +1,48 @@
+# Copyright (C) 2008, 2009 Red Hat, Inc.
+# Authors: Phil Knirsch
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+
+import os, copy
+
+class NetTuning:
+ def __init__(self):
+ self.devidle = {}
+
+ def __updateIdle__(self, dev, devload):
+ for type in ("READ", "WRITE"):
+ if devload[type] <= 0.005:
+ idle = self.devidle.setdefault(dev, {})
+ idle.setdefault(type, 0)
+ idle[type] += 1
+ else:
+ idle = self.devidle.setdefault(dev, {})
+ idle.setdefault(type, 0)
+ idle[type] = 0
+
+ def setTuning(self, load):
+ disks = load.setdefault("NET", {})
+ oldidle = copy.deepcopy(self.devidle)
+ for dev in disks.keys():
+ devload = disks[dev]
+ self.__updateIdle__(dev, devload)
+ if self.devidle[dev]["READ"] == 6 or self.devidle[dev]["WRITE"] == 6:
+ os.system("ethtool -s "+dev+" advertise 0x003")
+ if oldidle.has_key(dev) and oldidle[dev]["READ"] > 6 and oldidle[dev]["WRITE"] > 6 and (self.devidle[dev]["READ"] == 0 or self.devidle[dev]["WRITE"] == 0):
+ os.system("ethtool -s "+dev+" advertise 0x03F")
+ print(load, self.devidle)
+
+_plugin = NetTuning()