Wie wir in dem Artikel über SMA und EMA gesehen haben, sind die aus der Finanzwelt kommenden Funktionen zur Berechnung von moving averages (Durchschnittswert der letzen n Messungen) für Zeitreihen im Systemmonitoring-Kontext nicht so gut geeignet, da die Werte auch unregelmäßig eintreffen können. In Verbindung mit Round Robin Databases (RRD) lässt sich die Situation natürlich entschärfen, da diese die unregelmäßig eintreffenden Messwerte zu regelmäßigen Messwertreihen interpolieren können. Ich war dann aber doch auf der Suche nach einer generischen Lösung und bin so auf ein Verfahren gekommen, dass ich als Time Weighted Moving Average (TWMA) bezeichnen würde.

Vorraussetzung ist, dass die Messwert immer gemeinsam mit ihrem Zeitstempel erfasst und gespeichert werden. Moderne Systeme (konkret kenne ich das von NetApp) liefern diese Werte auch immer gleich mit Zeitstempel aus. So habe ich schon einen sehr genauen Wert, der durch die Übertragungsverzögerungen zum Monitoringsystem nicht mehr beeinflusst wird. Weiters gehe ich in der folgenden Erklärung davon aus, dass der Zeitstempel in Epochensekunden ausgedrückt wird.

Die Berechnung des TWMA erfolgt dann, indem die einzelnen Messwerte  jeweils mit dem Zeitstempel des Messwertes  multipliziert werden. Die Summe dieser Produkte dividiert durch die Summe der Zeitstempel ergibt dann einen Wert, der aktuelle Messwert stärker berücksichtigt als länger zurück liegende und auch kein Problem damit hat, wenn diese Wert nur sehr unregelmäßig eingetroffen sind.

Zur Illustration ein wenig Pseudocode:

Wenn der Hash %Messwert, die Schlüssel Wert und Timestamp enthält.

Wenn das Array @Messwertspeicher, je Element einen solchen Hash enthält.

Dann würde der Code in etwa so aussehen:

foreach $item (@Messwertspeicher) {
    $wsum = $wsum + ( $item->Wert * $item->Timestamp )
    $tsum = $tsum + $item->Timestamp
}
$twma = $wsum / $tsum