2013-12-14 19 views
8

Ich habe "os" http://nodejs.org/api/os.html#os_os verwendet, um zu versuchen, einige Systemstatistiken für die Verwendung in einer App zu berechnen.Node.js erhalten tatsächlichen Speicherverbrauch als Prozent

Allerdings merke ich, dass es den Speicher nicht richtig berechnen kann, weil es den Cache und Puffer auslässt, die benötigt werden, um einen einzelnen lesbaren Prozentsatz richtig zu berechnen. Ohne es wird der Speicher fast immer 90% + mit den meisten Hochleistungsservern sein (basierend auf meinen Tests).

ich müsse es berechnen, wie so:

(CURRENT_MEMORY-CACHED_MEMORY-BUFFER_MEMORY) * 100/TOTAL_MEMORY

Dies soll mir ein genaueres% der Speicher erhalten durch das System verwendet wird. Aber das os-Modul und die meisten anderen node.js-Module, die ich gesehen habe, bekommen nur den gesamten und aktuellen Speicher.

Gibt es eine Möglichkeit, dies in node.js zu tun? Ich kann Linux verwenden, aber ich weiß nicht, wie das System funktioniert, um zu wissen, wo ich es suchen muss (Datei zum Lesen, um diese Informationen zu erhalten, wie top/htop).

Antwort

4

Aus dem Lesen der Dokumentation habe ich Angst, dass Sie keine native Lösung haben. Sie können jedoch immer 'frei' direkt von der Kommandozeile aus aufrufen. Ich habe den folgenden Code zusammen basierend auf Is it possible to execute an external program from within node.js?

var spawn = require('child_process').spawn; 
var prc = spawn('free', []); 

prc.stdout.setEncoding('utf8'); 
prc.stdout.on('data', function (data) { 
    var str = data.toString() 
    var lines = str.split(/\n/g); 
    for(var i = 0; i < lines.length; i++) { 
    lines[i] = lines[i].split(/\s+/); 
    } 
    console.log('your real memory usage is', lines[2][3]); 
}); 

prc.on('close', function (code) { 
    console.log('process exit code ' + code); 
}); 
+0

Danke, das hat perfekt funktioniert! –

+0

Ich denke, "Linien [2] [3]" in diesem Ausschnitt gibt die [Schnittpunkt der 'Puffer/Cache' Zeile mit der 'frei' Spalte] (http://stackoverflow.com/a/23542090/680454) – michielbdejong

3

Basierend auf Determining free memory on Linux, freier Speicher = frei + Puffer + Cache.

folgendes Beispiel enthält von Knoten OS Methoden zum Vergleich abgeleiteten Werte (die nutzlos sind)

var spawn = require("child_process").spawn; 
var prc = spawn("free", []); 
var os = require("os"); 

prc.stdout.setEncoding("utf8"); 
prc.stdout.on("data", function (data) { 
    var lines = data.toString().split(/\n/g), 
     line = lines[1].split(/\s+/), 
     total = parseInt(line[1], 10), 
     free = parseInt(line[3], 10), 
     buffers = parseInt(line[5], 10), 
     cached = parseInt(line[6], 10), 
     actualFree = free + buffers + cached, 
     memory = { 
      total: total, 
      used: parseInt(line[2], 10), 
      free: free, 
      shared: parseInt(line[4], 10), 
      buffers: buffers, 
      cached: cached, 
      actualFree: actualFree, 
      percentUsed: parseFloat(((1 - (actualFree/total)) * 100).toFixed(2)), 
      comparePercentUsed: ((1 - (os.freemem()/os.totalmem())) * 100).toFixed(2) 
     }; 
    console.log("memory", memory); 
}); 

prc.on("error", function (error) { 
    console.log("[ERROR] Free memory process", error); 
}); 

Dank Leorex.

Überprüfen Sie nach process.platform === "linux"