I wrote this quick & dirty bandwidth monitor for use with htop. It also displays the average bandwidth for the last 10 seconds.
It displays a line similar to this at the top of the screen:
eth0:RX:600b TX:944b Avg:77b eth2:RX:0b TX:0b Avg:0b
Usage is simple:
$ ./bw.monitor.php & htop
#!/usr/bin/php
<?php
set_time_limit(0);
define('ESC',chr(27));
$ignore_interfaces = array('lo','wlan0');
function human($bytes, $decimals = 1) {
$sz = 'bkmgtp';
$factor = floor((strlen($bytes) - 1) / 3);
if ($factor >= 1) {
return sprintf("%.{$decimals}f%s", $bytes / pow(1024, $factor), @$sz[$factor]);
}
return sprintf("%d%s", $bytes / pow(1024, $factor),@$sz[$factor]);
}
/*
$data="Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 70513902 759179 0 0 0 0 0 0 70513902 759179 0 0 0 0 0 0
eth2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
eth0: 591403745 1474829 0 0 0 0 0 1492 2162660750 2294779 0 0 0 0 0 0";
*/
$map = array(
2 => 'RX',
10 => 'TX'
);
$last_data = array();
$readout = array();
$total = array();
$history = array();
$cnt = 0;
while (true) {
$matches = array();
$associated = array();
$readout = array();
$data = file_get_contents('/proc/net/dev');
preg_match_all('/([a-z0-9]+)\:\s+([0-9]+)\s+([\d]+)\s+([\d]+)\s+([\d]+)\s+([\d]+)\s+([\d]+)\s+([\d]+)\s+([\d]+)\s+([\d]+)\s+([\d]+)\s+([\d]+)\s+([\d]+)\s+([\d]+)\s+([\d]+)\s+([\d]+)\s+([\d]+)/msu',$data, $matches, PREG_SET_ORDER);
if (!$matches) {
sleep(1);
continue;
}
$cnt++;
// echo $data;
// print_r($matches);
foreach ($matches as $match) {
$interface = $match[1];
if (in_array($interface, $ignore_interfaces)) {
continue;
}
if (!isset($total[$interface])) {
$total["$interface"] = 0;
}
if (!isset($history[$interface])) {
for ($i=0;$i<20;$i++) {
$history["$interface"][] = 0;
}
}
$associated[$interface] = array();
foreach ($map as $k=>$v) {
$associated[$interface][$v] = $match[$k];
}
}
// print_r($associated);
foreach ($associated as $i=>$d) {
if (isset($last_data[$i])) {
foreach ($d as $k=>$v) {
$diff = $v - $last_data[$i][$k];
$readout["$i"]["$k"] = human($diff);
$total["$i"] = ($total["$i"] + $diff);
$history["$i"][] = $diff;
}
$history["$i"] = array_slice($history["$i"], -20, 20);
$readout["$i"]["Avg"] = human(floor(array_sum($history["$i"]) / (count($history["$i"]) / 2)));
// print_r($history);
}
}
$last_data = $associated;
// print_r($readout);
echo ESC,'[s';
echo ESC,'[0;0H';
echo ESC,'[K';
ksort($readout);
foreach ($readout as $i=>$d) {
echo $i,':';
foreach ($d as $k=>$v) {
printf("%-10s", "$k:$v");
}
// echo " ";
}
// echo 'mem:',human(memory_get_usage(),2);
echo ESC,'[u';
flush();
sleep(1);
}

September 12th, 2012 8:20 pm
[…] In a previous post I wrote a bandwidth monitory in php. It was running about 300k (on my laptop it was < 100k), and figured it was time to test out my python foo. […]