• Kunden aus Hessen und Nordrhein-Westfalen können über die Rufnummer 0221 / 466 191 00 Hilfe bei allen Problemen in Anspruch nehmen.
    Kunden aus Baden-Württemberg können über die Rufnummer 0711 / 54 888 150 Hilfe bei allen Problemen in Anspruch nehmen.

Unitymedia Auslastung des eigenen Segments ansehen (reloaded)

Diskutiere Auslastung des eigenen Segments ansehen (reloaded) im Internet und Telefon über das TV-Kabelnetz Forum im Bereich Internet und Telefon; Ja, mein RPi hat zu wenig RAM. Gut, dann bleibt es erst mal so wie es ist bis es ein Upgrade gibt.
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #226
Ja, mein RPi hat zu wenig RAM. Gut, dann bleibt es erst mal so wie es ist bis es ein Upgrade gibt.
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #227
im git ist jetzt eine neue Version mit einer 2. Y-Achse fuer den Summenwert. Ob es jetzt besser aussieht? Ich weiss nicht :)
Das alte Verhalten kann man herstellen, indem man die ++ in Zeile 78 wieder rausnimmt:

if (++use_2nd_yaxis) {
aendern in
if (use_2nd_yaxis) {


sshot_001.jpg
sshot_004.jpg
 
Zuletzt bearbeitet:
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #228
im git ist jetzt eine neue Version mit einer 2. Y-Achse fuer den Summenwert. Ob es jetzt besser aussieht? Ich weiss nicht :)

Ich finde, dass die Gesamtkurve immer die Größte sein müsste. So ist es relativ unübersichtlich, leider.
Zwei bessere Möglichkeiten würden mir da einfallen, aber ich weiß nicht, ob das mit RRD tools geht:
Man könnte z.B. die Skala für die Geschwindigkeit bis 50 MBit größer ansetzen, als für die höheren Geschwindigkeiten der Gesamtauslastung. Nachteil, die Darstellung Summe ist dann nicht mehr linear.
Oder (sicherlich am schwersten) man nutzt einen Graphen für die einzelnen Kanäle und einen zweiten Graphen für die Summe (beides innerhalb einer Grafik), die man dann direkt über dem ersten platziert.

Als dritte Variante würde mir noch einfallen, dass man die einzelnen Kanäle als Fläche darstellt und die Gesamtauslastung praktisch einfach nur die Gesamtfläche dieser Kanäle ist. Aber dafür ist wohl die Auslastung der Kanäle insgesamt zu irrulär, sodass das nicht gut aussehen wird.
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #229
Ich finde die Originalversion glaube ich am besten, muss es aber noch ein paar Tage beobachten. Im Grunde ist die Auslastung einzelner SC-QAM eher weniger interessant, als die Gesamtlast. Wobei es reicht wenn ein SC-QAM ausgelastet ist, dass die Geschwindigkeit nicht stabil anliegt.
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #230
Als dritte Variante würde mir noch einfallen, dass man die einzelnen Kanäle als Fläche darstellt und die Gesamtauslastung praktisch einfach nur die Gesamtfläche dieser Kanäle ist. Aber dafür ist wohl die Auslastung der Kanäle insgesamt zu irrulär, sodass das nicht gut aussehen wird.
klingt nicht schlecht. Ich mache das bei Gelegenheit mal

Bei der .txt Datei, fände ich eine Skalierung auf MBit/s sinnvoll, oder wenigstens ein Dezimaltrennzeichen.

haettest du mir ein Beispiel wie der Inhalt des Textfile konkret aussehen soll?
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #231
Och einfach MBit/s. Also zum Beispiel: 123 MBit/s, oder 1.234 MBit/s usw. Die Einheit dahinter wäre dann noch das i-Tüpfelchen :cool:
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #232
definiere ich jede Kurve als Summe der Last auf dem zugeordneten DS Channel + aller darunter liegenden DS Channel Lastwerte sieht es wie folgt aus. Die oberste Kurve (gruen) gibt somit zugleich den zeitlichen Verlauf der Gesamtlast wieder.

was man bei dieser Darstellung schnell erkennt ist ungleichmaessige Lastverteilung auf den Kanaelen. Z.B. wenn mal wieder im wesentlichen nur die DOCSIS 3.0 Kanaele unter Last stehen.

sshot_000.jpg
 
Zuletzt bearbeitet:
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #233
eine Version mit neuem Displaymode und den restlichen Fixes ist jetzt im git. Falls noch Probleme sind, bitte melden :)

weil die Codetags in diesem Forum nicht funktionieren als quote:

Usage: CableLoadMonitor
-h - print this help and exit
-f [0-9]+( :[0-9]+)* - specify downstream (DS) channel frequencies (in MHz)
-f - force scan of TC4400 for DS channel frequencies
-c [0-9]+ - create a RRD base with given RRA steps (in secs)
-r [0-9]+ - recording history size (in secs)
-w [0-9]+ - width of generated graph(s)
-h [0-9]+ - height of generated graph(s)
-g [0-9]+ [0-9]+ - generate a graph with given end and length (in secs)
-d [01] - display mode (0 == standard, 1 == accumulated)
-i - ignore errors reported by dvbtune

Defaults:
-c 10 # 10 secs
-r 604800 # 1 week
-w 1400
-h 1000

Example:
CableLoadMonitor -d 1 -r 3600 -f 626:634 -i
- use display mode 1 (accumulated)
- record 1 hour of data
- scan 626 MHz and 634 MHz DS channel frequencies
- ignore bit errors reported by DVB driver
- generate graphs of size 1400x1000 (default)
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #234
Ist es denn eigentlich sinnvoll, eine Langzeit-Analyse auf der "feinen" Datenbasis aller Messwerte die man überhaupt gesammelt hat zu machen?
Wenn man drei Monate anzeigt, sind die "Tageswellen" ja nur noch schlecht zu erkennen, geschweige denn, ein einzelner Kanal zu analysieren.
Vielleicht sollte man die Messwerte von maximal drei Monaten behalten, und für Langzeitbetrachtungen irgendwelchen "eingedampften" Messwerte nutzen, z. B. ein Wert pro Stunde für Durchschnittsauslastung/Maximallast.
Alternativ kann man sich die letzten drei Monate wie bisher halten, und für die "älteren" Monate die Text-Dateien nur als Zip-File irgendwo ablegen...
Wenn man dann an historischer Kaffeesatzleserei Interesse hat, kann man sich ja die alten Datensätze wieder auspacken, und auf einem großen PC grafisch auswerten ...
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #235
man kann in einen bestehenden Datensatz beliebig weit hineinzoomen. z.B. mit

CableLoadMonitor -d 1 -g 1814400 3600

wird ein Snapshot (per CableLoadMonitor.png) im Displaymode 1 erzeugt , der 3 Wochen ( 60 60 24 7 3**** == 1814400) in der Vergangenheit liegt und 1 Stunde (60 60 * == 3600) umfasst. DIese Stunde ist dann natuerlich sehr gut erkennbar, da sie ueber die komplette X-Achse gespreizt ist.
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #236
eine Version mit neuem Displaymode und den restlichen Fixes ist jetzt im git. Falls noch Probleme sind, bitte melden :)

weil die Codetags in diesem Forum nicht funktionieren als quote:

Cool Danke. Werde ich am WE mal updaten. Die 'accumulated' Ansicht gefällt mir ganz gut.
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #237
man kann in einen bestehenden Datensatz beliebig weit hineinzoomen. z.B. mit

CableLoadMonitor -d 1 -g 1814400 3600

wird ein Snapshot (per CableLoadMonitor.png) im Displaymode 1 erzeugt , der 3 Wochen ( 60 60 24 7 3**** == 1814400) in der Vergangenheit liegt und 1 Stunde (60 60 * == 3600) umfasst. DIese Stunde ist dann natuerlich sehr gut erkennbar, da sie ueber die komplette X-Achse gespreizt ist.

Mit den Nachteilen, dass irgendwann jeder Rechner "dicke Backen" angesichts der vielen Datensätze bekommt...
Bei Messwerten aus 20 Jahren musst Du dann ein RAID-Plattenarray an den Raspberry anklemmen ;-)
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #238
ja ist schon klar

ich denke das muesste ein uebergeordnetes Script machen: Neustart + Wegspeichern der alten DB wenn ein Satz voll ist. Weil ich moechte nicht schuld sein wenn bei diesem Prozess lebenswichtige Daten verloren gehen, weil z.B. im Raspi nur eine SDHC mit 512MB steckt:)
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #239
ich muss gestehen ich hatte noch einen leichten Bug im Script, sorry for this :)

Der dazu gefuehrt hat, dass die Datenbasis das 10 fache der spezifizierten Aufzeichnungzeit umfasste. Also z.B. 10 Wochen statt 1 Woche fuer den Default-Wert.

Ich hatte mich schon gewundert, dass ich locker Snapshots, die ueber 9 Wochen in die Vergangenheit zurueckreichen machen konnte, obwohl es maximal nur 1 Woche haette sein duerfen.

Falls also jemand seine Wunsch-Aufzeichnungzeit mit "can't allocate memory" vereitelt bekommen hat bitte die DB nochmal neu erzeugen. SIe ist jetzt nur noch ein 10tel so gross...
 
Zuletzt bearbeitet:
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #240
Full house!

@sparkie

Was sollte ich jetzt also am besten machen? Noch mal frisch laden? Wie mache ich es, dass er es wenn ich es frisch lade nicht wieder als CableLoadMonitor.2 speichert, sondern das Alte überschreibt?
 

Anhänge

  • Segment_voll1.png
    Segment_voll1.png
    588,3 KB · Aufrufe: 3
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #241
du kannst das alte einfach vor dem Download loeschen, dann aendert er beim Download nicht den Namen ab.
Fuer die neue Version musst du die *.awklib ebenfalls (wie im github beschrieben) downloaden, denn sie steht jetzt im gleichen Verzeichnis wie der Rest.

Siehe bitte auch Doku im github, unter Punkt "finally install the load monitoring tool"
 
Zuletzt bearbeitet:
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #242
Setz ich mich die Tage mal dran, danke! Das ist aber nun nicht der neue Graph, den mag ich nämlich nicht 😇
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #243
So, ich habe jetzt den Stick hier.
Allerdings funktioniert das ganze bei mir nicht so wirklich. @rv112 können wir mal abgleichen, ob wir tatsächlich den selben DVB-C Stick haben?
Die ID von meinem (lsusb in die Console) ist:
Bus 001 Device 003: ID 2040:0265 Hauppauge

Mein Problem ist, dass dvbsnoop die Zahlen zur Auslastung erst nach über zwei Sekunden auswirft. Damit funktioniert zum einen das Script nicht, weil dort ein Timeout von 1 Sec angegeben ist und zum anderen dauert das Scannen von allen 32 Kanälen fast drei Minuten. Damit gibt es natürlich nur unbrauchbare Werte...

Ich frage mich aber, wieso das so ist? Das war ja sonst bisher in dem Thread hier und im VF Forum nie ein Problem.
Ich hab hier mal einen typischen Aufruf des Programms:
Bash:
pi@cable-pi:~/cable-monitor $ dvbsnoop -s bandwidth 8190 -n 80000
dvbsnoop V1.4.50 -- http://dvbsnoop.sourceforge.net/
---------------------------------------------------------
PID bandwidth statistics...
PID: 8190 (0x1ffe) - max packet count: 80000
---------------------------------------------------------
packets read: 9/(9) d_time: 2.057 s = 6.580 kbit/s (Avrg: 6.580 kbit/s) [bad: 0]
packets read: 5/(14) d_time: 0.001 s = 7520.000 kbit/s (Avrg: 10.236 kbit/s) [bad: 0]
packets read: 130/(144) d_time: 0.008 s = 24440.000 kbit/s (Avrg: 104.879 kbit/s) [bad: 0]
packets read: 7/(151) d_time: 0.008 s = 1316.000 kbit/s (Avrg: 109.553 kbit/s) [bad: 0]
packets read: 15/(166) d_time: 0.001 s = 22560.000 kbit/s (Avrg: 120.436 kbit/s) [bad: 0]
packets read: 4/(170) d_time: 0.008 s = 752.000 kbit/s (Avrg: 122.864 kbit/s) [bad: 0]
packets read: 119/(289) d_time: 0.001 s = 178976.000 kbit/s (Avrg: 208.869 kbit/s) [bad: 0]
packets read: 5/(294) d_time: 0.008 s = 940.000 kbit/s (Avrg: 211.669 kbit/s) [bad: 0]
packets read: 7/(301) d_time: 0.001 s = 10528.000 kbit/s (Avrg: 216.708 kbit/s) [bad: 0]
packets read: 4/(305) d_time: 0.008 s = 752.000 kbit/s (Avrg: 218.751 kbit/s) [bad: 0]

Man sieht sehr schön, dass die Messung der ersten Pakete 2sec dauert und das natürlich den Durchschnitt auf sehr unrealistische Werte senkt. In der Folge steigt die AVG Geschwindigkeit für ca. 5 Sekunden an, bis sie dann halbwegs stabil ist.

Zum Setup:
Frisch installierter Raspberry 4 4GB mit Buster, Hauppauge WinTV Duo, und nur die im Github genannten Pakete + dvb-tools installiert (um den DVB-C Mode zu aktivieren).
Powerdown ist auch ausgeschaltet.
 
Zuletzt bearbeitet:
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #244
sieht so aus als wenn die WinTV Duo ewig braeuchte um nach einem Frequenzwechsel wieder einen stabilen Empfang zu haben. @rv112 hat hierzu nach einem 'dvbtune' noch einen sleep() eingebaut. Wobei ich seine genauen Programmaederungen nicht kenne.
 
Zuletzt bearbeitet:
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #245
Ne, das dauert auch solange, wenn ich manuell über die Konsole mit dvbtune erst die Frequenz wechsel, dann eine halbe Minute warte und dann erst dvbsnoop öffne.
Das Problem ist, dass dvbsnoop selbst zu lange braucht um brauchbare Werte auszugeben.
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #246
Ich pack hier gleich meine komplette Configdatei rein und eine lsusb.
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #247
Habe erfolgreich den Edision OPTIMUSS Stick (einen DVBSKY330 Clone) auf einem Raspberry angeschlossen.

Aber bei ersten Tests kommt dann folgendes:

Code:
pi@raspberrypi:~ $ dvbsnoop -s bandwidth 8190 -n 800
dvbsnoop V1.4.50 -- http://dvbsnoop.sourceforge.net/
---------------------------------------------------------
PID bandwidth statistics...
PID: 8190 (0x1ffe) - max packet count: 800
---------------------------------------------------------
Error(22): DMX_SET_PES_FILTER: Invalid argument
pi@raspberrypi:~ $
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #248
So bitte, hier mein Configfile:

#!/bin/sh

#
# DOCSIS cable load monitor
#
# tool to monitor downstream load on DOCSIS cable networks
#
#
#

cat > $0_$$.awk << !

func setup( \
)
{
CLARGS = "$0|$1|$2|$3|$4|$5|$6|$7|$8|$9|${10}|${11}|${12}|${13}|${14}|${15}|${16}|${17}|${18}|${19}|${20}"

# avoid dangling include files. incore inode still exists
system("rm $0_$$.awk")

# take care of shell expansion (if security is an issue)
setup_lib($#, "awk|" CLARGS, $$, "`pwd`", "`hostname`", "$R_")
PRP(CLARGS "\n")

# required if Sundtek hardware is in use as we install with '-service' option
LD_PL = "LD_PRELOAD=/opt/lib/libmediaclient.so "

# where to find your TC4400 cable modem (if any)
CABLE_MODEM_IP = "192.168.100.1"

# file current recording parameters as incompatible changes must trigger a new RRD generation
CONF_FILE = INSTPATH "CableLoadMonitor.cfg"
FREQ_FACTOR = 1000000

# default RRDBASE
RRDBASE_FILE = INSTPATH "CableLoadMonitor.rrd"
RRDBASE_RRASTEPS = 10 # defaults to 10s
RRDBASE_HISTSIZE = 60 * 60 * 24 * 7 # defaults to 1 week

# default RRDGRAPH
RRDGRAPH_NAME = "/var/www/html/" "CableLoadMonitor"
RRDGRAPH_EXT = ".png"
RRDGRAPH_TMP = RRDGRAPH_NAME RRDGRAPH_EXT "_"
RRDGRAPH_WIDTH = 2000
RRDGRAPH_HEIGHT = 1000
RRDGRAPH_Y_UPPER_LIMIT = 200 # scale Y axis to this minimum
BWIDTH_SNAPSHOT = RRDGRAPH_NAME "_bwidth.txt"

# feel free to add other history sizes (aka generated graphs) as well
RRDGRAPHS[RRDGRAPHS_CNT++] = 60 * 60 " |1h"
RRDGRAPHS[RRDGRAPHS_CNT++] = 60 * 60 * 6 " |6h"
RRDGRAPHS[RRDGRAPHS_CNT++] = 60 * 60 * 24 " |1d"
RRDGRAPHS[RRDGRAPHS_CNT++] = 60 * 60 * 24 * 7 " |7d"
RRDGRAPHS[RRDGRAPHS_CNT++] = 60 * 60 * 24 * 30 " |30d"
RRDGRAPHS[RRDGRAPHS_CNT++] = 60 * 60 * 24 * 365 " |365d"

# ---
rrdbase_rrasteps = RRDBASE_RRASTEPS
rrdbase_histsize = RRDBASE_HISTSIZE
rrdgraph_width = RRDGRAPH_WIDTH
rrdgraph_height = RRDGRAPH_HEIGHT

# --- define this to display a black theme
if (++use_black_theme) {
IF_BLACK_THEME = IF_BLACK_THEME "--color \"ARROW#ffffff\"" " \\\\\n"
IF_BLACK_THEME = IF_BLACK_THEME "--color \"BACK#000000\"" " \\\\\n"
IF_BLACK_THEME = IF_BLACK_THEME "--color \"CANVAS#000000\"" " \\\\\n"
IF_BLACK_THEME = IF_BLACK_THEME "--color \"GRID#ffffff\"" " \\\\\n"
IF_BLACK_THEME = IF_BLACK_THEME "--color \"MGRID#ffffff\"" " \\\\\n"
IF_BLACK_THEME = IF_BLACK_THEME "--color \"FONT#ffffff\"" " \\\\\n"
IF_BLACK_THEME = IF_BLACK_THEME "--color \"AXIS#ffffff\"" " \\\\\n"
IF_BLACK_THEME = IF_BLACK_THEME "--color \"FRAME#ffffff\"" " \\\\\n"
IF_BLACK_THEME = IF_BLACK_THEME "--border 1" " \\\\\n"
}
# --- define this to rescale the sum graph
if (use_2nd_yaxis) {
IF_2ND_YAXIS_SCALE = 10

IF_2ND_YAXIS = IF_2ND_YAXIS "--right-axis " 1 / IF_2ND_YAXIS_SCALE ":1" " \\\\\n"
IF_2ND_YAXIS = IF_2ND_YAXIS "--right-axis-label sum" " \\\\\n"

SUM_DEF = SUM_DEF sprintf("DEF:sum_=" RRDBASE_FILE ":sum:AVERAGE", i, i) " \\\\\n"
SUM_DEF = SUM_DEF "CDEF:sum=sum_," IF_2ND_YAXIS_SCALE ",/" " \\\\\n"
} else {
SUM_DEF = SUM_DEF sprintf("DEF:sum=" RRDBASE_FILE ":sum:AVERAGE", i, i) " \\\\\n"
}
}

func read_cfg( \
line, CMD, a)
{
if (ex("ls " CONF_FILE, 0, "^(" CONF_FILE ")$")) {
CMD = "cat " CONF_FILE
#PR("reading last recently used downstream channel frequencies and RRD parameters")
FREQ_SPEC_CFG = ex_line(CMD)
while ((line = ex_line(CMD)) != -1) {
if (match(line, "^RRA:AVERAGE:.*:([0-9]+):([0-9]+)$", a)) {
RRA_STEPS_CFG = a[1]
HIST_SIZE_CFG = a[2]
}
}
}
}

func exit_(msg \
)
{
PRE(msg)
PRE("exiting...")
++ERR; exit
}

func set_freqs(str, \
i, a)
{
if (!match(str, "^[0-9]+:)[0-9]+)*$")) {
return 0
}
split(str, a, ":")
for (i = 1; a; ++i) {
FREQ[FREQ_CNT++] = a
}
return 1
}

func retrieve_down_freqs(freqs, \
URL, ignore, line, WGET, LYNX, i, a)
{
URL = "http://" CABLE_MODEM_IP "/cmconnectionstatus.html"

if (freqs == "force_new_scan" || !freqs) {

#
# specific to TC4400 yet
#
PR("trying to retrieve downstream channel frequencies from TC4400 modem")
WGET = "echo; wget --connect-timeout=1 -t 1 -q --http-user=admin --http-password=\"bEn2o#US9s\" " URL " -O -"
LYNX = "lynx -nolist -width 300 -dump -stdin"
while ((line = ex_line(WGET)) != -1) {
if (match(line, "<script")) {
++ignore
} else if (ignore) {
if (match(line, "/script?")) {
ignore = 0
}
} else {
print line |& LYNX
}
}
close(LYNX, "to")
while (LYNX |& getline line > 0) {
if (match(line, "Locked +SC-QAM +Downstream +Bonded +([0-9]+) ", a)) {
FREQ[FREQ_CNT++] = a[1] / FREQ_FACTOR
}
}
close(LYNX)
} else if (freqs) {
PR("evaluating given downstream channel frequencies")
if (!set_freqs(freqs)) {
exit_("can't handle the given downstream channel frequency specification")
}
} else {
# error -> will exit
}
PRF("downstream channel frequencies now in use: ")
if (!FREQ_CNT) {
exit_("could not retrieve any")
}
PRF("[ " FREQ_CNT " ] ")
for (i = 0; i < FREQ_CNT; ++i) {
PRF(FREQ " ")
BWIDTH_OF = "na"
FREQ_SPEC_NEW = FREQ_SPEC_NEW (FREQ_SPEC_NEW ? ":" : "") FREQ
}
PR("")
}

func assemble_rrdcreate_cmd( \
CMD, i)
{
CMD = "rrdtool create " RRDBASE_FILE " -s 1" " \\\\\n"
for (i = 0; i < FREQ_CNT; ++i) {
CMD = CMD sprintf("DS:f%02d:GAUGE:120:U:U", i) " \\\\\n"
}
CMD = CMD sprintf("DS:sum:GAUGE:120:U:U") " \\\\\n"
CMD = CMD sprintf("RRA:AVERAGE:0.1:" rrdbase_rrasteps ":" rrdbase_histsize)
RRDB_CCMD_NEW = CMD
}

func assemble_rrdgraph_cmd(end, size, \
group, GROUPS, CMD, i, k)
{
# use the first version if interested in average and min too
GROUPS = "MAX:max:MIN:min:LAST:last:AVERAGE:avg"
GROUPS = "MAX:max:LAST:last"
split(GROUPS, group, ":")

CMD = "rrdtool graph " RRDGRAPH_TMP " -a PNG -l 0 -u " RRDGRAPH_Y_UPPER_LIMIT * FREQ_FACTOR " \\\\\n" \
"--title=\"Graph generated at \`date\`\"" " \\\\\n" \
"-w " rrdgraph_width " -h " rrdgraph_height " \\\\\n" \
"--end " end " --start end-" size "s" " \\\\\n"
CMD = CMD " \\\\\n"
CMD = CMD IF_BLACK_THEME " \\\\\n"
CMD = CMD IF_2ND_YAXIS " \\\\\n"
CMD = CMD " \\\\\n"
for (i = 0; i < FREQ_CNT; ++i) {
CMD = CMD sprintf("DEF:f%02d=" RRDBASE_FILE ":f%02d:AVERAGE", i, i) " \\\\\n"
}
CMD = CMD SUM_DEF " \\\\\n"
CMD = CMD " \\\\\n"
for (i = 0; i < FREQ_CNT; ++i) {
if (i < FREQ_CNT / 2) {
CMD = CMD sprintf("\"LINE:f%02d#ff0000:%d\"", i, FREQ) " \\\\\n"
} else {
CMD = CMD sprintf("\"LINE:f%02d#0000ff:%d\"", i, FREQ) " \\\\\n"
}
}
CMD = CMD " \\\\\n"
CMD = CMD "\"LINE:sum#00ff00:sum\\\l\"" " \\\\\n"
CMD = CMD " \\\\\n"
for (k = 1; group[k]; k += 2) {
for (i = 0; i < FREQ_CNT; ++i) {
CMD = CMD sprintf("\"GPRINT:f%02d:%s:%%3.0lf %%s\"", i, group[k]) " \\\\\n"
}
CMD = CMD sprintf("\"GPRINT:%s:%s:%%3.0lf %%s\"", "sum", group[k])
CMD = CMD "\" " group[k + 1] "\\\l\"" " \\\\\n"
}
return CMD
}

func assemble_rrdgraphs_cmd( \
i, a)
{
for (i = 0; i < RRDGRAPHS_CNT; ++i) {
split(RRDGRAPHS, a, "|")
if (a[1] > rrdbase_histsize) {
break
}
RRDGRAPH_CMD = assemble_rrdgraph_cmd("now", gensub(" +", "", "g", a[1]))
RRDGRAPH_FILE = RRDGRAPH_NAME "_" a[2] RRDGRAPH_EXT
PR("generating graph for: " sprintf("%4s", a[2]) " recording length, size " rrdgraph_width "x" rrdgraph_height " pixels")
}
}

func scan_down_channels( \
RRDUPD_STR, BWIDTH_SUM, a, i, k)
{
PRF(strftime("%T: "))
for (i = 0; i < FREQ_CNT; ++i) {
# tuning via mediaclient not in use ATM
# ex("timeout 10 /opt/bin/mediaclient -d /dev/dvb/adapter0/frontend0 -m DVBC -f " FREQ * FREQ_FACTOR " -M Q256 -S 6952000")
ex(LD_PL "timeout 10 dvbtune -f " FREQ * FREQ_FACTOR " -s 6952 -qam 256", 0, "Bit error rate: ([0-9]+)$", a)
ex("sleep 1") # <=== ZUSAETZLICHE ZEILE
a[1] += 0
if (a[1] && !dvbtune_ignerrs) {
PR("\n\n" a[0] ", please check your cables\n")
}

#
# in case of very small bandwidth values limit the measurement
# interval to something useful to keep the overall scan time sufficiently low.
#
# the arbitrarily chosen stop value of 80000 appears to be high enough to even
# handle high bandwidths with enough accuracy.
#
if (!ex(LD_PL "timeout 1 dvbsnoop -s bandwidth 8190 -n 80000", 0, "^## PID:.*Avrg: +([^ ]+) ", a)) {

#
# UPDATE as of 2019_08_03:
# - in the event of dvbsnoop failure: no longer exit but retry instead
# - you may want to reload your DVB drivers if these crashed
#
PR("\ndvbsnoop fails for [ " FREQ " ], retrying...")

#
# place your specific driver reload code here
#
ex("systemctl stop sundtek; sleep 5; systemctl start sundtek; sleep 20", 1)
--i; continue
# exit_("dvbsnoop fails")
}
BWIDTH_OF = int(a[1] + 0.5)
PRF(sprintf("%6s", BWIDTH_OF))
BWIDTH_SUM = 0
RRDUPD_STR = "rrdtool update " RRDBASE_FILE " N"
for (k = 0; k < FREQ_CNT; ++k) {
BWIDTH_SUM += BWIDTH_OF[k]
RRDUPD_STR = RRDUPD_STR ":" BWIDTH_OF[k] * 1000
}
#
# do not update until the initial scan completes
#
if (BWIDTH_OF[FREQ_CNT - 1] != "na") {
RRDUPD_STR = RRDUPD_STR ":" BWIDTH_SUM * 1000
ex(RRDUPD_STR, 2)
}
}
PR(sprintf("%7s", BWIDTH_SUM))
print BWIDTH_SUM > BWIDTH_SNAPSHOT; close(BWIDTH_SNAPSHOT)
}

func generate_rrdgraphs( \
i)
{
for (i = 0; RRDGRAPH_CMD; ++i) {
ex(RRDGRAPH_CMD)
ex("mv " RRDGRAPH_TMP " " RRDGRAPH_FILE, 2)
}
}

func watch_the_scenery( \
)
{
#
# some inital setup specific to certain devices. this may fail
# on one or another device. don't care.
#

#
# fix for:
# * Silicon Labs Si2168 card not compatible? · Issue #1 · sp4rkie/docsis-cable-load-monitor
#
#
ex("echo 0 | sudo tee -a /sys/module/dvb_core/parameters/dvb_powerdown_on_sleep")

#
# fix for:
# * set dtvmode
#
#
ex("/opt/bin/mediaclient -d /dev/dvb/adapter0/frontend0 --setdtvmode=DVBC")

while (1) {
generate_rrdgraphs()
scan_down_channels()
}
}

func usage( \
locked, line, a)
{
PR("Usage: " PRGBNAME)
while ((line = ex_line("cat " PRGNAME)) != -1) {
if (locked) {
if (match(line, "match[^,]+, \"(.+)\"[^\"]+# (.*)$", a)) {
PR(sprintf(" %-21s - %s", gensub("\\\\$", "", "g", a[1]), a[2]))
}
} else {
if (match(line, "^func process_cmdline")) ++locked
}
}
PR("\ndefaults:")
PR(" -c " sprintf("%-10d", RRDBASE_RRASTEPS) " # 10 secs")
PR(" -r " sprintf("%-10d", RRDBASE_HISTSIZE) " # 1 week" )
PR(" -w " sprintf("%-10d", RRDGRAPH_WIDTH) )
PR(" -h " sprintf("%-10d", RRDGRAPH_HEIGHT) )
}

func process_cmdline( \
renew_rrd_base, backup_time, freq_list, i, a)
{
read_cfg()
if (FREQ_SPEC_CFG) freq_list = FREQ_SPEC_CFG
if (RRA_STEPS_CFG) rrdbase_rrasteps = RRA_STEPS_CFG
if (HIST_SIZE_CFG) rrdbase_histsize = HIST_SIZE_CFG

#
# regexps for arg matching are kept somewhat sloppy to avoid clutter in usage() text output
#
for (i = 2; i < _ARGC; ++i) {
if (match(_ARGV _ARGV[i + 1], "-h$")) { # print this help and exit
usage()
exit
} else if (match(_ARGV " " _ARGV[i + 1], "-f [0-9]+:)[0-9]+)*$")) { # manually specify downstream channel frequencies
freq_list = _ARGV[i + 1]
++i
} else if (match(_ARGV, "-f$")) { # scan a TC4400 for current downstream channel freqs
freq_list = "force_new_scan"
} else if (match(_ARGV " " _ARGV[i + 1], "-c [0-9]+$")) { # create a RRD base with given RRA steps (in secs)
rrdbase_rrasteps = _ARGV[i + 1]
++i
} else if (match(_ARGV " " _ARGV[i + 1], "-r [0-9]+$")) { # recording history size (in secs)
rrdbase_histsize = _ARGV[i + 1]
++i
} else if (match(_ARGV " " _ARGV[i + 1], "-w [0-9]+$")) { # width of generated graph(s)
rrdgraph_width = _ARGV[i + 1]
++i
} else if (match(_ARGV " " _ARGV[i + 1], "-h [0-9]+$")) { # height of generated graph(s)
rrdgraph_height = _ARGV[i + 1]
++i
} else if (match(_ARGV " " _ARGV[i + 1] " " _ARGV[i + 2], "-g [0-9]+ [0-9]+$")) { # generate a graph with given end and length (in secs)
rrdgraph_histend = strftime("%s") - _ARGV[i + 1]
rrdgraph_length = _ARGV[i + 2]
i += 2
} else if (match(_ARGV, "-i$")) { # ignore errors reported by dvbtune
++dvbtune_ignerrs
} else {
usage()
++ERR; exit
}
}
retrieve_down_freqs(freq_list)
if (rrdgraph_histend) {
PR("point in time where the generated graph ends: " strftime("%T", rrdgraph_histend))
PR("time span covered by the generated graph: " rrdgraph_length "s")
PR("graph is written to: " RRDGRAPH_NAME RRDGRAPH_EXT)
ex(assemble_rrdgraph_cmd(rrdgraph_histend, rrdgraph_length), 2)
ex("mv " RRDGRAPH_TMP " " RRDGRAPH_NAME RRDGRAPH_EXT)
exit
}
PR("recording RRA step size: " rrdbase_rrasteps " seconds")
PR("recording RRA history size: " \
int(rrdbase_histsize / (60 * 60 * 24)) " day(s) " \
int(rrdbase_histsize % (60 * 60 * 24) / (60 * 60 )) " hour(s) " \
int(rrdbase_histsize % (60 * 60 ) / (60 )) " minute(s) " \
int(rrdbase_histsize % (60 ) ) " second(s) " \
)
if (dvbtune_ignerrs) PR("dvbtune: " "ignore bit errors")
assemble_rrdcreate_cmd()
assemble_rrdgraphs_cmd()
if (split(FREQ_SPEC_CFG, a, ":") != split(FREQ_SPEC_NEW, a, ":")) {
if (FREQ_SPEC_CFG) PR("count of monitored channel frequencies did change")
renew_rrd_base += 2
} else if (FREQ_SPEC_CFG != FREQ_SPEC_NEW) {
if (FREQ_SPEC_CFG) PR("values of monitored channel frequencies did change")
renew_rrd_base += 1
}
if (RRA_STEPS_CFG != rrdbase_rrasteps \
|| HIST_SIZE_CFG != rrdbase_histsize) {
if (RRA_STEPS_CFG) PR("RRD base recording parameters did change")
renew_rrd_base += 2
}
if (renew_rrd_base) {
if (ex("ls " RRDBASE_FILE, 0 ,"^(" RRDBASE_FILE ")$")) {
backup_time = strftime(".%Y-%m-%d_%T")
PR("backing up old RRD data")
ex("cp -va " RRDBASE_FILE " " RRDBASE_FILE backup_time)
ex("cp -va " CONF_FILE " " CONF_FILE backup_time)
}
print FREQ_SPEC_NEW > CONF_FILE
print RRDB_CCMD_NEW > CONF_FILE
close(CONF_FILE)
if (renew_rrd_base > 1) {
PR("(re)creating the RRD base")
ex(RRDB_CCMD_NEW, 2)
}
}
watch_the_scenery()
}

BEGIN {
QUIET = 1
setup()
process_cmdline()
exit
}

END {
cleanup()
PRP("\n" PRGBNAME " " "exits with: " (ERR ? ERR : 0) " " "error(s)")
PRP("====== [" sprintf(" %5d ", PROCINFO["pid"]) "] program stop [" strftime() "] on " HOSTNAME " ======")
close(PROTOCOL)
exit ERR
}

!

[ -t 0 ] && STDIN="< /dev/null"
eval exec awk -f /usr/local/lib/l5.awklib -f $0_$$.awk $STDIN 2>&1



Und ein lsusb:

Bus 001 Device 004: ID 2040:0265 Hauppauge
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #249
Habe ein Problem gelöst - der Tuner musste auf DVB-C umgestellt , bei dvbsnoop kommt aber danach zwar kein Fehler mehr, aber auch kein Output - nach einer halben Stunde habe ich abgebrochen.
Kann man irgendwie testen, ob der Stick überhaupt ein Signal bekommt?

Code:
pi@raspberrypi:~ $ dvb-fe-tool -d DVBC/ANNEX_A
Changing delivery system to: DVBC/ANNEX_A
pi@raspberrypi:~ $ dvbsnoop -s bandwidth 8190 -n 800
dvbsnoop V1.4.50 -- http://dvbsnoop.sourceforge.net/
---------------------------------------------------------
PID bandwidth statistics...
PID: 8190 (0x1ffe) - max packet count: 800
---------------------------------------------------------
^C
pi@raspberrypi:~ $
 
  • Auslastung des eigenen Segments ansehen (reloaded) Beitrag #250
Aber bei ersten Tests kommt dann folgendes:

wie sieht denn der vorangestellte 'dvbtune' aus? Am besten das Script aufrufen und im *.log File nachsehen, was man fuer Optionen angeben muss.
Das kann man dann per cut&paste manuell ausfuehren.
 
Thema:

Auslastung des eigenen Segments ansehen (reloaded)

Auslastung des eigenen Segments ansehen (reloaded) - Ähnliche Themen

Vodafone West Fast jeden Tag Internet weg für 1-2 Minuten: Ich habe jetzt seit einigen Monaten das Problem, das fast jeden Tag das Internet zufällig ausfällt, aber immer nur für 1-2 Minuten. Darauf habe...
Vodafone Täglich zwei Verbindungsabbrüche: Hallo zusammen, da ich mir nicht sicher bin ob es sich hierbei um einen Fehler oder ein Feature handelt frag ich erstmal hier nach und nicht im...
Unitymedia Connectbox startet mehrmals täglich neu: Hallo, ich schreibe aus dem ehemaligen Kabel BW Netzbereich und bin nun bei Vodafone. Ich habe damals bei Unitymedia eine Connectbox aufgedrückt...
Unitymedia

OFDMA verschwindet

Unitymedia OFDMA verschwindet: Hallo zusammen, ich habe ein 1000/50 Anschluss in BW, der seit wenigen Wochen nicht mehr so gut läuft. Hohe Latenzen und teilweise ping Verluste...
Unitymedia Nach Techniker-Besuch (ursprünglich wegen erhöhter Fehler auf Kanälen) nun Ping sprunghaft/instabil: Hallo liebes Forum, in der Vergangenheit habe ich euch nur durch die Google-Suche bei der Beantwortung einiger Fragen zu gewissen Werten bei...
Oben