2013-12-14 7 views
8

Ho usato "os" http://nodejs.org/api/os.html#os_os Per tentare di calcolare alcune statistiche di sistema da utilizzare in un'app.Node.js ottiene l'effettivo utilizzo della memoria in percentuale

Tuttavia, noto che non è in grado di calcolare correttamente la memoria, perché lascia fuori la cache ei buffer necessari per calcolare correttamente una singola percentuale leggibile. Senza di esso la memoria sarà quasi sempre del 90% + con la maggior parte dei server ad alte prestazioni (in base ai miei test).

avrei bisogno di calcolare in questo modo:

(CURRENT_MEMORY-CACHED_MEMORY-BUFFER_MEMORY) * 100/TOTAL_MEMORY

Questo dovrebbe farmi una% più accurata di memoria utilizzata dal sistema. Ma il modulo os e la maggior parte degli altri moduli node.js che ho visto mi danno solo memoria totale e attuale.

C'è un modo per farlo in node.js? Posso usare Linux ma non conosco i dettagli del sistema per sapere dove cercare di capirlo da solo (file da leggere per ottenere queste informazioni, come top/htop).

risposta

4

Dalla lettura della documentazione, ho paura di non avere alcuna soluzione nativa. Tuttavia, puoi sempre chiamare "libero" direttamente dalla riga di comando. Ho messo insieme il seguente codice in base a 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

Grazie, ha funzionato perfettamente! –

+0

Penso che 'lines [2] [3]' in questo snippet restituisca l'intersezione della linea 'buffer/cache' con la colonna 'free'] (http://stackoverflow.com/a/23542090/680454) – michielbdejong

3

Sulla base di Determining free memory on Linux, Memoria libera = buffer liberi + + cache.

Seguendo esempio include valori ottenuti con metodi nodo os per il confronto (che sono inutili)

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); 
}); 

Grazie a Leorex.

Controlla per process.platform === "linux"