optimization fsStats, disksIO, networkStats

This commit is contained in:
Sebastian Hildebrandt 2016-11-14 11:49:46 +01:00
parent 78c400f051
commit fedebe797a
5 changed files with 297 additions and 216 deletions

View File

@ -89,6 +89,7 @@ Other changes
| Version | Date | Comment | | Version | Date | Comment |
| -------------- | -------------- | -------- | | -------------- | -------------- | -------- |
| 3.10.1 | 2016-11-14 | optimization fsStats, disksIO, networkStats |
| 3.10.0 | 2016-11-12 | added blockDevices, fixed fsSize, added file system type | | 3.10.0 | 2016-11-12 | added blockDevices, fixed fsSize, added file system type |
| 3.9.0 | 2016-11-11 | added MAC address to networkInterfaces, fixed currentLoad | | 3.9.0 | 2016-11-11 | added MAC address to networkInterfaces, fixed currentLoad |
| 3.8.1 | 2016-11-04 | updated docs | | 3.8.1 | 2016-11-04 | updated docs |

View File

@ -132,6 +132,49 @@ exports.blockDevices = blockDevices;
// -------------------------- // --------------------------
// FS - speed // FS - speed
function calcFsSpeed(rx, wx) {
let result = {
rx: 0,
wx: 0,
tx: 0,
rx_sec: -1,
wx_sec: -1,
tx_sec: -1,
ms: 0
};
if (_fs_speed && _fs_speed.ms) {
result.rx = rx;
result.wx = wx;
result.tx = result.rx + result.wx;
result.ms = Date.now() - _fs_speed.ms;
result.rx_sec = (result.rx - _fs_speed.bytes_read) / (result.ms / 1000);
result.wx_sec = (result.wx - _fs_speed.bytes_write) / (result.ms / 1000);
result.tx_sec = result.rx_sec + result.wx_sec;
_fs_speed.rx_sec = result.rx_sec;
_fs_speed.wx_sec = result.wx_sec;
_fs_speed.tx_sec = result.tx_sec;
_fs_speed.bytes_read = result.rx;
_fs_speed.bytes_write = result.wx;
_fs_speed.bytes_overall = result.rx + result.wx;
_fs_speed.ms = Date.now();
_fs_speed.last_ms = result.ms;
} else {
result.rx = rx;
result.wx = wx;
result.tx = result.rx + result.wx;
_fs_speed.rx_sec = -1;
_fs_speed.wx_sec = -1;
_fs_speed.tx_sec = -1;
_fs_speed.bytes_read = result.rx;
_fs_speed.bytes_write = result.wx;
_fs_speed.bytes_overall = result.rx + result.wx;
_fs_speed.ms = Date.now();
_fs_speed.last_ms = 0;
}
return result;
}
function fsStats(callback) { function fsStats(callback) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -142,7 +185,7 @@ function fsStats(callback) {
reject(error); reject(error);
} }
var result = { let result = {
rx: 0, rx: 0,
wx: 0, wx: 0,
tx: 0, tx: 0,
@ -152,6 +195,9 @@ function fsStats(callback) {
ms: 0 ms: 0
}; };
let rx = 0;
let wx = 0;
if ((_fs_speed && !_fs_speed.ms) || (_fs_speed && _fs_speed.ms && Date.now() - _fs_speed.ms >= 500)) {
if (_linux) { if (_linux) {
// exec("df -k | grep /dev/", function(error, stdout) { // exec("df -k | grep /dev/", function(error, stdout) {
exec("lsblk | grep /", function (error, stdout) { exec("lsblk | grep /", function (error, stdout) {
@ -174,25 +220,11 @@ function fsStats(callback) {
if (line != '') { if (line != '') {
line = line.replace(/ +/g, " ").split(' '); line = line.replace(/ +/g, " ").split(' ');
result.rx += parseInt(line[5]) * 512; rx += parseInt(line[5]) * 512;
result.wx += parseInt(line[9]) * 512; wx += parseInt(line[9]) * 512;
} }
}); });
result.tx = result.rx + result.wx; result = calcFsSpeed(rx, wx);
if (_fs_speed && _fs_speed.ms) {
result.ms = Date.now() - _fs_speed.ms;
result.rx_sec = (result.rx - _fs_speed.bytes_read) / (result.ms / 1000);
result.wx_sec = (result.wx - _fs_speed.bytes_write) / (result.ms / 1000);
result.tx_sec = result.rx_sec + result.wx_sec;
} else {
result.rx_sec = -1;
result.wx_sec = -1;
result.tx_sec = -1;
}
_fs_speed.bytes_read = result.rx;
_fs_speed.bytes_write = result.wx;
_fs_speed.bytes_overall = result.rx + result.wx;
_fs_speed.ms = Date.now();
} }
if (callback) { callback(result) } if (callback) { callback(result) }
resolve(result); resolve(result);
@ -212,36 +244,73 @@ function fsStats(callback) {
if (line != '') { if (line != '') {
line = line.split(' '); line = line.split(' ');
result.rx += parseInt(line[0]); rx += parseInt(line[0]);
result.wx += parseInt(line[1]); wx += parseInt(line[1]);
} }
}); });
result.tx = result.rx + result.wx; result = calcFsSpeed(rx, wx);
if (_fs_speed && _fs_speed.ms) {
result.ms = Date.now() - _fs_speed.ms;
result.rx_sec = (result.rx - _fs_speed.bytes_read) / (result.ms / 1000);
result.wx_sec = (result.wx - _fs_speed.bytes_write) / (result.ms / 1000);
result.tx_sec = result.rx_sec + result.wx_sec;
} else {
result.rx_sec = -1;
result.wx_sec = -1;
result.tx_sec = -1;
}
_fs_speed.bytes_read = result.rx;
_fs_speed.bytes_write = result.wx;
_fs_speed.bytes_overall = result.rx + result.wx;
_fs_speed.ms = Date.now();
} }
if (callback) { callback(result) } if (callback) { callback(result) }
resolve(result); resolve(result);
}) })
} }
} else {
result.ms = _fs_speed.last_ms;
result.rx = _fs_speed.bytes_read;
result.wx = _fs_speed.bytes_write;
result.tx = _fs_speed.bytes_read + _fs_speed.bytes_write;
result.rx_sec = _fs_speed.rx_sec;
result.wx_sec = _fs_speed.wx_sec;
result.tx_sec = _fs_speed.tx_sec;
if (callback) { callback(result) }
resolve(result);
}
}); });
}); });
} }
exports.fsStats = fsStats; exports.fsStats = fsStats;
function calcDiskIO(rIO, wIO) {
let result = {
rIO: 0,
wIO: 0,
tIO: 0,
rIO_sec: -1,
wIO_sec: -1,
tIO_sec: -1,
ms: 0
};
if (_disk_io && _disk_io.ms) {
result.rIO = rIO;
result.wIO = wIO;
result.tIO = rIO + wIO;
result.ms = Date.now() - _disk_io.ms;
result.rIO_sec = (result.rIO - _disk_io.rIO) / (result.ms / 1000);
result.wIO_sec = (result.wIO - _disk_io.wIO) / (result.ms / 1000);
result.tIO_sec = result.rIO_sec + result.wIO_sec;
_disk_io.rIO = rIO;
_disk_io.wIO = wIO;
_disk_io.rIO_sec = result.rIO_sec;
_disk_io.wIO_sec = result.wIO_sec;
_disk_io.tIO_sec = result.tIO_sec;
_disk_io.last_ms = result.ms;
_disk_io.ms = Date.now();
} else {
result.rIO = rIO;
result.wIO = wIO;
result.tIO = rIO + wIO;
_disk_io.rIO = rIO;
_disk_io.wIO = wIO;
_disk_io.rIO_sec = -1;
_disk_io.wIO_sec = -1;
_disk_io.tIO_sec = -1;
_disk_io.last_ms = 0;
_disk_io.ms = Date.now();
}
return result;
}
function disksIO(callback) { function disksIO(callback) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -252,7 +321,7 @@ function disksIO(callback) {
reject(error); reject(error);
} }
var result = { let result = {
rIO: 0, rIO: 0,
wIO: 0, wIO: 0,
tIO: 0, tIO: 0,
@ -261,6 +330,10 @@ function disksIO(callback) {
tIO_sec: -1, tIO_sec: -1,
ms: 0 ms: 0
}; };
let rIO = 0;
let wIO = 0;
if ((_disk_io && !_disk_io.ms) || (_disk_io && _disk_io.ms && Date.now() - _disk_io.ms >= 500)) {
if (_linux) { if (_linux) {
// prints Block layer statistics for all mounted volumes // prints Block layer statistics for all mounted volumes
// var cmd = "for mount in `lsblk | grep / | sed -r 's/│ └─//' | cut -d ' ' -f 1`; do cat /sys/block/$mount/stat | sed -r 's/ +/;/g' | sed -r 's/^;//'; done"; // var cmd = "for mount in `lsblk | grep / | sed -r 's/│ └─//' | cut -d ' ' -f 1`; do cat /sys/block/$mount/stat | sed -r 's/ +/;/g' | sed -r 's/^;//'; done";
@ -276,24 +349,10 @@ function disksIO(callback) {
// sum r/wIO of all disks to compute all disks IO // sum r/wIO of all disks to compute all disks IO
let stats = line.split(';'); let stats = line.split(';');
result.rIO += parseInt(stats[0]); rIO += parseInt(stats[0]);
result.wIO += parseInt(stats[4]); wIO += parseInt(stats[4]);
}); });
result.tIO = result.rIO + result.wIO; result = calcDiskIO(rIO, wIO);
if (_disk_io && _disk_io.ms) {
result.ms = Date.now() - _disk_io.ms;
result.rIO_sec = (result.rIO - _disk_io.rIO) / (result.ms / 1000);
result.wIO_sec = (result.wIO - _disk_io.wIO) / (result.ms / 1000);
result.tIO_sec = result.rIO_sec + result.wIO_sec;
} else {
result.rIO_sec = -1;
result.wIO_sec = -1;
result.tIO_sec = -1;
}
_disk_io.rIO = result.rIO;
_disk_io.wIO = result.wIO;
_disk_io.tIO = result.tIO;
_disk_io.ms = Date.now();
if (callback) { callback(result) } if (callback) { callback(result) }
resolve(result); resolve(result);
@ -312,31 +371,27 @@ function disksIO(callback) {
if (line != '') { if (line != '') {
line = line.split(' '); line = line.split(' ');
result.rIO += parseInt(line[1]); rIO += parseInt(line[1]);
result.wIO += parseInt(line[0]); wIO += parseInt(line[0]);
} }
}); });
result = calcDiskIO(rIO, wIO);
result.tIO = result.rIO + result.wIO;
if (_disk_io && _disk_io.ms) {
result.ms = Date.now() - _disk_io.ms;
result.rIO_sec = (result.rIO - _disk_io.rIO) / (result.ms / 1000);
result.wIO_sec = (result.wIO - _disk_io.wIO) / (result.ms / 1000);
result.tIO_sec = result.rIO_sec + result.wIO_sec;
} else {
result.rIO_sec = -1;
result.wIO_sec = -1;
result.tIO_sec = -1;
}
_disk_io.rIO = result.rIO;
_disk_io.wIO = result.wIO;
_disk_io.tIO = result.tIO;
_disk_io.ms = Date.now();
} }
if (callback) { callback(result) } if (callback) { callback(result) }
resolve(result); resolve(result);
}) })
} }
} else {
result.rIO = _disk_io.rIO;
result.wIO = _disk_io.wIO;
result.tIO = _disk_io.rIO + _disk_io.wIO;
result.ms = _disk_io.last_ms;
result.rIO_sec = _disk_io.rIO_sec;
result.wIO_sec = _disk_io.wIO_sec;
result.tIO_sec = _disk_io.tIO_sec;
if (callback) { callback(result) }
resolve(result);
}
}); });
}); });
} }

View File

@ -81,6 +81,7 @@
// -------------------------------- // --------------------------------
// //
// version date comment // version date comment
// 3.10.1 2016-11-14 optimization fsStats, disksIO, networkStats
// 3.10.0 2016-11-12 added blockDevices, fixed fsSize, added file system type // 3.10.0 2016-11-12 added blockDevices, fixed fsSize, added file system type
// 3.9.0 2016-11-11 added MAC address to networkInterfaces, fixed currentLoad // 3.9.0 2016-11-11 added MAC address to networkInterfaces, fixed currentLoad
// 3.8.1 2016-11-04 updated docs // 3.8.1 2016-11-04 updated docs

View File

@ -108,7 +108,7 @@ function networkInterfaces(callback) {
mac = details.mac mac = details.mac
}); });
let internal = (ifaces[dev] && ifaces[dev][0]) ? ifaces[dev][0].internal : null; let internal = (ifaces[dev] && ifaces[dev][0]) ? ifaces[dev][0].internal : null;
result.push({ iface: dev, ip4: ip4, ip6: ip6, mac : mac, internal: internal }) result.push({ iface: dev, ip4: ip4, ip6: ip6, mac: mac, internal: internal })
} }
} }
if (callback) { callback(result) } if (callback) { callback(result) }
@ -122,26 +122,43 @@ exports.networkInterfaces = networkInterfaces;
// -------------------------- // --------------------------
// NET - Speed // NET - Speed
function calcNetworkSpeed(iface, rx, tx) { function calcNetworkSpeed(iface, rx, tx, operstate) {
let rx_sec = -1; let result = {
let tx_sec = -1; iface: iface,
let ms = 0; operstate: operstate,
rx: 0,
tx: 0,
rx_sec: -1,
tx_sec: -1,
ms: 0
};
if (_network[iface] && _network[iface].ms) { if (_network[iface] && _network[iface].ms) {
ms = Date.now() - _network[iface].ms; result.rx = rx;
rx_sec = (rx - _network[iface].rx) / (ms / 1000); result.tx = tx;
tx_sec = (tx - _network[iface].tx) / (ms / 1000); result.ms = Date.now() - _network[iface].ms;
} else { result.rx_sec = (rx - _network[iface].rx) / (result.ms / 1000);
_network[iface] = {}; result.tx_sec = (tx - _network[iface].tx) / (result.ms / 1000);
}
_network[iface].rx = rx; _network[iface].rx = rx;
_network[iface].tx = tx; _network[iface].tx = tx;
_network[iface].rx_sec = result.rx_sec;
_network[iface].tx_sec = result.tx_sec;
_network[iface].ms = Date.now(); _network[iface].ms = Date.now();
return ({ _network[iface].last_ms = result.ms;
rx_sec: rx_sec, } else {
tx_sec: tx_sec, result.rx = rx;
ms: ms result.tx = tx;
}) if (!_network[iface]) _network[iface] = {};
_network[iface].rx = rx;
_network[iface].tx = tx;
_network[iface].rx_sec = -1;
_network[iface].tx_sec = -1;
_network[iface].ms = Date.now();
_network[iface].last_ms = 0;
}
return result;
} }
function networkStats(iface, callback) { function networkStats(iface, callback) {
// fallback - if only callback is given // fallback - if only callback is given
@ -171,8 +188,12 @@ function networkStats(iface, callback) {
ms: 0 ms: 0
}; };
let cmd, lines, stats, speed; let operstate = 'unknown';
let rx = 0;
let tx = 0;
let cmd, lines, stats;
if (!_network[iface] || (_network[iface] && !_network[iface].ms) || (_network[iface] && _network[iface].ms && Date.now() - _network[iface].ms >= 500)) {
if (_linux) { if (_linux) {
if (fs.existsSync('/sys/class/net/' + iface)) { if (fs.existsSync('/sys/class/net/' + iface)) {
cmd = cmd =
@ -182,15 +203,12 @@ function networkStats(iface, callback) {
exec(cmd, function (error, stdout) { exec(cmd, function (error, stdout) {
if (!error) { if (!error) {
lines = stdout.toString().split('\n'); lines = stdout.toString().split('\n');
result.operstate = lines[0].trim(); operstate = lines[0].trim();
result.rx = parseInt(lines[1]); rx = parseInt(lines[1]);
result.tx = parseInt(lines[2]); tx = parseInt(lines[2]);
speed = calcNetworkSpeed(iface, result.rx, result.tx); result = calcNetworkSpeed(iface, rx, tx, operstate);
result.rx_sec = speed.rx_sec;
result.tx_sec = speed.tx_sec;
result.ms = speed.ms;
} }
if (callback) { callback(result) } if (callback) { callback(result) }
resolve(result); resolve(result);
@ -215,13 +233,10 @@ function networkStats(iface, callback) {
// skip header line // skip header line
// use the second line because it is tied to the NIC instead of the ipv4 or ipv6 address // use the second line because it is tied to the NIC instead of the ipv4 or ipv6 address
stats = lines[1].replace(/ +/g, " ").split(' '); stats = lines[1].replace(/ +/g, " ").split(' ');
result.rx = parseInt(stats[6]); rx = parseInt(stats[6]);
result.tx = parseInt(stats[9]); tx = parseInt(stats[9]);
speed = calcNetworkSpeed(iface, result.rx, result.tx); result = calcNetworkSpeed(iface, rx, tx, operstate);
result.rx_sec = speed.rx_sec;
result.tx_sec = speed.tx_sec;
} }
} }
if (callback) { callback(result) } if (callback) { callback(result) }
@ -229,6 +244,15 @@ function networkStats(iface, callback) {
}); });
}); });
} }
} else {
result.rx = _network[iface].rx;
result.tx = _network[iface].tx;
result.rx_sec = _network[iface].rx_sec;
result.tx_sec = _network[iface].tx_sec;
result.ms = _network[iface].last_ms;
if (callback) { callback(result) }
resolve(result);
}
}); });
}); });
} }

View File

@ -84,7 +84,7 @@ function getLoad() {
} }
if (_linux) { if (_linux) {
let now = Date.now() - _current_cpu.ms; let now = Date.now() - _current_cpu.ms;
if (now >= 1000) { if (now >= 500) {
_current_cpu.ms = Date.now(); _current_cpu.ms = Date.now();
exec("cat /proc/stat | grep 'cpu '", function (error, stdout) { exec("cat /proc/stat | grep 'cpu '", function (error, stdout) {
if (!error) { if (!error) {