NEWS
Beispiel alle ioBroker Prozesse / Speicherverbrauch
-
Ein Beispielskript um an einem Linux-Rechner alle laufenden ioBroker Prozesse und den dazugehörigen Speicherverbrauch abzufragen.
Das Skript erzeugt ein JSON mit allen laufenden ioBroker Prozessen und legt diesen in einem Datenpunkt ab.
Visualisierung in VIS:
Anhand des JSON können einige weitere Informationen gewonnen werden, wie z.B.:
-
Anzahl ioBroker Prozesse
-
Gesamtspeicherverbrauch ioBroker (Summe RSS aller Prozesse)
-
…
Das Skript:
! ```
`var pfad = "Systeminfos.ioBroker" + "."; // Pfad in dem die Datenpunkte angelegt werden
! // Datenpunktnamen:
var idProzesse = pfad + 'ioBroker_Prozesse';
! // regelmässige Wiederholungen der Abfrage
var cronStr = "/10 * * * ";
! var abfrage = 'ps -A aux --sort -pmem | grep " [i]o."';
! createState(idProzesse, "", {
name: 'ioBroker laufende Prozesse',
desc: 'ioBroker laufende Prozesse, Speicherverbrauch',
type: 'string',
unit: '',
role: 'object'
});
! function writeJson(json) {
return JSON.stringify(json); // JSON in String umwandeln, damit das JSON in einem Datenpunkt geschrieben werden kann
}
!
! function createArrayJson (arr) {
var jsonArr = [];
var anzDP = 11; // Anzahl Datenreihen in der Abfrage
var anzProzesse = (arr.length-1)/anzDP;
! for (var i = 0; i < anzProzesse; i++) {
jsonArr.push({
command: arr[10 + ianzDP], // ioBroker Prozess (COMMAND = Kommando, mit dem der Prozess gestartet wurde)
pid: arr[ 1 + ianzDP], // Prozess ID
cpu: arr[ 2 + ianzDP], // aktueller CPU-Last in %
vmem: arr[ 4 + ianzDP], //
rss: arr[ 5 + ianzDP], // physikalische Speichernutzung
start: arr[ 8 + ianzDP], // Startzeitpunkt des Prozesses
time: arr[ 9 + ianzDP] // bisher verbrauchte CPU Zeit
});
}
return jsonArr;
}
! function abfrageConsole() {
exec(abfrage, function(err, stdout, stderr) {
if (err) {
log(err,"error");
return;
}
stdout = stdout.replace(/\n+/g, " "); // neue Zeile gegen Leerzeichen ersetzen
stdout = stdout.split(/ +/g); // array erstellen, Lerzeichen als Trennervar anzProzesse = (stdout.length-1) / 11; //log(stdout); //log("Anzahl laufender ioBroker Prozesse: " + anzProzesse); var jsonArr = createArrayJson(stdout);
! setState(idProzesse,writeJson(jsonArr));
});
}
! function abfragen() {
abfrageConsole();
}
! // regelmässige Wiederholungen
// -----------------------------------------------------------------------------
schedule(cronStr, abfragen);
! // main
// -----------------------------------------------------------------------------
function main() {
abfragen();
}
! // Start Skript:
// -----------------------------------------------------------------------------
! setTimeout(main, 500);`
! [EDIT]
! Es gibt eine neue Version des Skripts (Version 2):
! http://forum.iobroker.net/viewtopic.php ... 935#p26547
! Version 3:
! http://forum.iobroker.net/viewtopic.php ... 698#p26698[/i] -
-
Der Hammer! Danke
Gesendet mit Tapatalk
-
Klasse!
-
Hi Ruhr,
super - vielen Dank
wenn ich das richtig sehe, dann verwendest du das Widget "json table"
Das habe ich auch versucht, allerdings schaffe ich es nicht die Spaltenbreiten zu definieren.
Ergebnis ist, dass die ersten Spalten zu schmal sind und die letzten zu breit. Width scheint nicht mit Px-Angaben zu funktionieren.
Wie hast du die Einstellungen vorgenommen ?
vG Looxer
-
Hi Ruhr,
super - vielen Dank
wenn ich das richtig sehe, dann verwendest du das Widget "json table"
Das habe ich auch versucht, allerdings schaffe ich es nicht die Spaltenbreiten zu definieren.
Ergebnis ist, dass die ersten Spalten zu schmal sind und die letzten zu breit. Width scheint nicht mit Px-Angaben zu funktionieren.
Wie hast du die Einstellungen vorgenommen ?
vG Looxer `
Doch, ich habe einfach die Pixel unter Width eingetragen (unter Headers[0], Headers[1], …).
Du kannst auch einstellen, wieviele und welche Spalten angezeigt werden
-
Neue Version des Skripts:
- zusätzliche Parameter im JSON (CPU-Last, Speicher Prozentual)
Zusätzliche Datenpunkte werden angelegt:
-
Datenpunkt: Anzahl Prozesse ist hinzugekommen
-
Datenpunkt: Speicherverbrauch ioBroker physikalisch absolut
-
Datenpunkt: Speicherverbrauch ioBroker in Prozent vom Gesamtsystem
-
Datenpunkt: CPU Last ioBroker vom Gesamtsystem
Das neue Skript:
! ```
`var pfad = "Systeminfos.ioBroker.Prozesse" + "."; // Pfad in dem die Datenpunkte angelegt werden
! // Datenpunktnamen:
var idProzesse = pfad + 'ioBroker_Prozesse';
var idMemAll = pfad + 'ioBroker_Speicher_gesamt';
var idAnzProzesse = pfad + 'ioBroker_Anzahl_Prozesse';
var idCpuAll = pfad + 'ioBroker_CPU_Gesamt';
var idMemPercent = pfad + 'ioBroker_Speicher_prozentual';
! // regelmässige Wiederholungen der Abfrage
var cronStr = "*/10 * * * ";
! var abfrage = 'ps -A aux --sort -pmem | grep " [i]o."';
! createState(idProzesse, "", {
name: 'ioBroker laufende Prozesse Objekt',
desc: 'ioBroker laufende Prozesse Objekt, Speicherverbrauch',
type: 'string',
unit: '',
role: 'object'
});
! createState(idMemAll, 0, {
name: 'ioBroker Speicherverbrauch gesamt',
desc: 'ioBroker Speicherverbrauch gesamt (RSS)',
type: 'number',
unit: 'MB',
role: 'value'
});
! createState(idAnzProzesse, 0, {
name: 'ioBroker Anzahl Prozesse',
desc: 'ioBroker Anzahl aktiver Prozesse',
type: 'number',
unit: '',
role: 'value'
});
! createState(idCpuAll, 0.0, {
name: 'ioBroker CPU-Last gesamt',
desc: 'ioBroker CPU-Last gesamt',
type: 'number',
unit: '%',
role: 'value'
});
! createState(idMemPercent, 0.0, {
name: 'Speicherverbrauch prozentual',
desc: 'Speicherverbrauch prozentual',
type: 'number',
unit: '%',
role: 'value'
});
! function writeJson(json) {
return JSON.stringify(json); // JSON in String umwandeln, damit das JSON in einem Datenpunkt geschrieben werden kann
}
! function getMemAbsolut (json) {
var anzProzesse = (json.length);
var mem = 0;
for (var i = 0; i < anzProzesse; i++) {
mem = mem + json[i].rss;
}
return mem;
}function getCpu (json) {
var anzProzesse = (json.length);
var cpu = 0.0;
for (var i = 0; i < anzProzesse; i++) {
cpu = cpu + json[i].cpu;
}
return cpu;
}! function getMem (json) {
var anzProzesse = (json.length);
var mem = 0.0;
for (var i = 0; i < anzProzesse; i++) {
mem = mem + json[i].mem;
}
return mem;
}
! function createArrayJson (arr) {
var jsonArr = [];
var anzDP = 11; // Anzahl Datenreihen in der Abfrage
var anzProzesse = (arr.length-1)/anzDP;
! for (var i = 0; i < anzProzesse; i++) {
jsonArr.push({
command: arr[10 + ianzDP], // ioBroker Prozess (COMMAND = Kommando, mit dem der Prozess gestartet wurde)
pid: arr[ 1 + ianzDP], // Prozess ID
cpu: parseFloat(arr[ 2 + ianzDP]), // aktueller CPU-Last in %
mem: parseFloat(arr[ 3 + ianzDP]), // aktueller Verbrauch physikalischer Speicher %
vmem: parseInt(arr[ 4 + ianzDP]), //
rss: parseInt(arr[ 5 + ianzDP]), // physikalische Speichernutzung
start: arr[ 8 + ianzDP], // Startzeitpunkt des Prozesses
time: arr[ 9 + ianzDP] // bisher verbrauchte CPU Zeit
});
}
return jsonArr;
}
! function abfrageConsole() {
exec(abfrage, function(err, stdout, stderr) {
if (err) {
log(err,"error");
return;
}
stdout = stdout.replace(/\n+/g, " "); // neue Zeile gegen Leerzeichen ersetzen
stdout = stdout.split(/ +/g); // array erstellen, Lerzeichen als Trennervar anzProzesse = (stdout.length-1) / 11; //log(stdout); //log("Anzahl laufender ioBroker Prozesse: " + anzProzesse); var jsonArr = createArrayJson(stdout); var mem = Math.floor(getMemAbsolut(jsonArr)/1024); var cpu = Math.floor(getCpu(jsonArr)*10)/10; var memPercent = Math.floor(getMem(jsonArr)*10)/10;
! setState(idProzesse ,writeJson(jsonArr));
setState(idMemAll ,mem);
setState(idAnzProzesse ,anzProzesse);
setState(idCpuAll ,cpu);
setState(idMemPercent ,memPercent);
});
}
! function abfragen() {
abfrageConsole();
}
! // regelmässige Wiederholungen
// -----------------------------------------------------------------------------
schedule(cronStr, abfragen);
! // main
// -----------------------------------------------------------------------------
function main() {
abfragen();
}
! // Start Skript:
// -----------------------------------------------------------------------------
! setTimeout(main, 500);`
![/i][/i][/i][/i]
-
jap - hab ich genau so gemacht.
sieht dann so aus:
die 10 sind nur Testeinstellungen. Hier würde ich eben 6 10Px Spalten erwarten
-
jap - hab ich genau so gemacht.
sieht dann so aus: `
Ich habe 100px unter Width eingetragen.
Keine Ahnung, was VIS nimmt, wenn Du px weglässt. Wahrscheinlich Prozent und dann kommst Du über 100%
-
alles klar - hab die px vergessen - joah - so gehts - danke dir
-
Bei mir sieht es so aus:
Habe aber nicht viel gemacht.
Skript kopiert, gestartet.
in vis json-Tabelle eingefügt und Datenpunkt verknüpft.
Gruß
Rainer
-
Trag mal "200px" ein. dann geht es
Gruß
Jürgen
-
Ich hab das bisher so in meine Systemübersicht eingebaut.
Links sieht man die neuen Datenpunkte umrahmt.
Die Prozessliste öffnet sich als Dialog.
-
filename="Systemübersicht.png" index="0">~~
Ich hab das bisher so in meine Systemübersicht eingebaut.
Links sieht man die neuen Datenpunkte umrahmt.
Die Prozessliste öffnet sich als Dialog. `
Wie hast du die ESX Leistung ermittelt?
Nur mit hm Strommessung oder mit Script Abfrage des Nucs (insofern das überhaupt geht)
Gruß
Thomassch
Gesendet von iPhone mit Tapatalk
-
Nur mit hm Strommessung oder mit Script Abfrage des Nucs (insofern das überhaupt geht) `
Zwischen USV und ESXi hängt ein Homematic Leistungsmesser.
-
(Wie) Muss ich das json table widget konfigurieren.
Ich habe nichts gemacht, lediglich den Datenpunkt angegeben.
(oder ist das widget bsic-table vielleicht das falsche)
Unter Objects wird folgendes angegzeigt:
In der Tabell erscheinen jedoch die Prozessnamen nicht.Gruß
Rainer
-
(Wie) Muss ich das json table widget konfigurieren.
Ich habe nichts gemacht, lediglich den Datenpunkt angegeben.
(oder ist das widget bsic-table vielleicht das falsche)
Unter Objects wird folgendes angegzeigt:
In der Tabell erscheinen jedoch die Prozessnamen nicht.
Gruß
Rainer `
Hi Rainer,
das Widget ist: basic - table (JSON table)
Das Beispiel-Widget mit 3 Spalten (Datenpunkt-ID anpassen) zum Import:
! ````
[{"tpl":"tplTableBody","data":{"visibility-cond":"==","visibility-val":1,"static_value":"[{"Title": "first", "Value": 1, "_Description": "Value1"}, {"Title": "second", "Value": 2, "_Description": "Value2"}]","gestures-offsetX":0,"gestures-offsetY":0,"signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"table_oid":"javascript.1.Systeminfos.ioBroker.Prozesse.ioBroker_Prozesse","colCount":"3","colWidth1":"200px","colWidth2":"100px","detailed_wid":"","max_rows":"10","colAttr2":"rss","colName2":"Speicher(kB)","colAttr3":"mem","colName3":"Speicher(%)","colWidth3":"100px","colName1":"ioBroker Prozess","colAttr1":"command"},"style":{"left":"120px","top":"170px","width":"500px","height":"270px"},"widgetSet":"basic"}] 1.) entweder der JSON-Attribut Name (wenn das Feld leer bleibt) oder ein frei vergebener Name, wie im Beispiel 2.) Das JSON-Attribut (Spalte) gezielt ausgewählt. Sonst geht es nach der Reihenfolge 3.) Breite, z.B. in Pixel (px) Im aktuellen Skript sind die möglichen Attribute:
command: arr[10 + i*anzDP], // ioBroker Prozess (COMMAND = Kommando, mit dem der Prozess gestartet wurde) pid: arr[ 1 + i*anzDP], // Prozess ID cpu: parseFloat(arr[ 2 + i*anzDP]), // aktueller CPU-Last in % mem: parseFloat(arr[ 3 + i*anzDP]), // aktueller Verbrauch physikalischer Speicher % vmem: parseInt(arr[ 4 + i*anzDP]), // rss: parseInt(arr[ 5 + i*anzDP]), // physikalische Speichernutzung start: arr[ 8 + i*anzDP], // Startzeitpunkt des Prozesses time: arr[ 9 + i*anzDP] // bisher verbrauchte CPU Zeit
Mit der JSON-Tabelle kann man ganz schnell Tabellen herstellen. Wenn alle Attribute eines JSONs gewünscht sind, dann muss man gar nichts einstellen, ggf. nur die einzelnen Breiten anpassen. Ansonsten kann man ncoh gezielt aussuchen, was man anzeigen lassen will. In dem Beispiel-Widget hier sind es drei Attribute, die gezielt angegeben werden. Das Beispiel-Widget wurde auf die ersten 10 Prozesse begrenzt (das JSON ist von größten zum niedrigsten physikalischen Speicherverbrauch sortiert). Bei mir sind 37 Prozesse aktiv. Gruß Michael
-
Danke,
muss ich mich mal ranmachen.
Synchronosieren sich dann die Header und Spaltenbreiten wieder?
Habe übrigens die Prozessnamen gefunden.
Sie sind unsichtbar
Bei doppelklick auf ein Feld sieht man sie ???
PS ist das beispielwidget das, was unter der ID bereits eingefügt ist ("wenn keine ID")?
Gruß
Rainer
-
Synchronosieren sich dann die Header und Spaltenbreiten wieder? `
Bei mir sind die Breiten im Header und bei den Daten darunter immer gleich.
Keine Ahnung, wie Du das hinbekommen hast
Habe übrigens die Prozessnamen gefunden.
Sie sind unsichtbar
Bei doppelklick auf ein Feld sieht man sie ??? `
Liegt wahrscheinlich dran, dass keine Breite zur Verfügung steht.
Spiel mal ein bisschen mit dem Werten.
PS ist das beispielwidget das, was unter der ID bereits eingefügt ist ("wenn keine ID")? `
Hier verstehe ich nicht, was Du meinst.
Das Beispiel-Widget ist das aus dem Post oben, mit den drei Spalten.
Dort ist die ID: javascript.1.Systeminfos.ioBroker.Prozesse.ioBroker_Prozesse angegeben.
Wenn Du eine andere Instanz nutzt, den Pfad oder den Datenpunktnamen im Skript angepasst hast, dann musst Du Deine ID mit dem JSON Objekt dort auswählen.
Oder was meintest Du?
Gruß
Michael
-
Bin anscheinend doch nicht so doof, wie ich befürchtet hatte.
Es klappt einfach nicht!
Der Header der ersten Spalte erscheint nicht, der Inhalt ist unsichtbar, dadurch auch die Verschiebung.
und bei doppelklick in die erste Spalte sieht man auch den Text:
Wenn ich jetzt das zweite Feld so formatiere, wie ich das erste hätte haben wollen, erscheint tatsächlich die Spaltenbeschriftung und der Inhalt.
Allerdings erster Header und zweite Spalte.
Hat es damit zu tun, dass da Headers[0], aber Name [1] steht?
Gruß
Rainer
-
Lösch das alte Widget doch bitte mal.
Dann würde ich zum testen einmal das Beispiel-Widget importieren und dann es noch einmal an ein leeres Widget wagen.
Das mit dem Header [0], Name [1] ist mir auch aufgefallen. Ich denke, dass ist nur ein Bezeichnungsfehler im Widget.