ioview et netview pour mesurer les débits DD et net sous Linux (v1.04) - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 24-05-2007 à 17:50:43
krifur a écrit : personne pour tester ? |
Apparemment, pas grand monde. Pour sur, moi j'ai testé puisque je l'ai conçu, et je le trouve bien, mais je ne suis pas objectif...
Marsh Posté le 24-05-2007 à 18:01:44
je suis en train de tester, pas tres pratique le rafraichissement , sinon ca a l'air instructif (mais pour l'instant difficilement analysable)
Marsh Posté le 24-05-2007 à 18:37:28
krifur a écrit : je suis en train de tester, pas tres pratique le rafraichissement , sinon ca a l'air instructif (mais pour l'instant difficilement analysable) |
Pas très pratique dans quel sens ? Je pensais justement modifier l'affichage sous forme de plusieurs colonnes et des lignes qui s'affichent les unes en dessous des autres avec un rappel des titres des colonnes toutes les 5 ou 10 lignes comme le fait netapp avec le sysstat. Je trouve ca pas mal et plus facilement exploitable pour réutiliser la sortie pour faire des stats ou des graphs. A voir.
Marsh Posté le 25-05-2007 à 11:58:51
drapeau
Marsh Posté le 25-05-2007 à 12:15:36
Le raffraichissemnt toutes les secondes est trop rapide, j'ai pas le temps de lire (ce qui est le but d eton script).
Mets un raffraichissement des infos toutes 5 ou 10 secondes, ça devrait être bon.
Marsh Posté le 25-05-2007 à 12:56:56
Juste pour info, ça ne marche pas chez moi Fedora core 6
/io.sh sdb3
sdb3 not found
mais si je fais:
[root@wrndfruc2411 proc]# cat diskstats |grep sdb3
8 19 sdb3 52906 1319226 66230 529840
Par contre si je fais ça:
[root@wrndfruc2411 proc]# cat diskstats |grep sdb3
8 19 sdb3 52906 1319226 66230 529840
[root@wrndfruc2411 proc]# cat diskstats |grep sdb3 |cut -d " " -f16
[root@wrndfruc2411 proc]#
Marsh Posté le 26-05-2007 à 01:22:47
Ptet parque tu essayes d'utiliser le script sur une partoche or ce script analyse les io d'un disque donc /io.sh sdb devrait le faire...
Marsh Posté le 28-05-2007 à 21:47:58
Fork Bomb a écrit : Le raffraichissemnt toutes les secondes est trop rapide, j'ai pas le temps de lire (ce qui est le but d eton script). |
Je penses que je vais ajouter un argument pour configurer l'interval d'affichage. Sinon est-ce que la présentation des infos vous parait claire lisible ?
Marsh Posté le 29-05-2007 à 10:32:12
krifur a écrit : Ptet parque tu essayes d'utiliser le script sur une partoche or ce script analyse les io d'un disque donc /io.sh sdb devrait le faire... |
effectivement
Marsh Posté le 03-07-2007 à 14:06:50
commentaire de forme, pourrais tu mettre ton script dans un [ fixed] [ /fixed] ca rendrait la lecture + facile.
Marsh Posté le 10-03-2008 à 16:15:44
enfoiro a écrit : commentaire de forme, pourrais tu mettre ton script dans un [ fixed] [ /fixed] ca rendrait la lecture + facile. |
C'est fait, j'ai juste mi un peu plus de 6 mois pour le faire...
Marsh Posté le 10-03-2008 à 16:18:19
apt-get install iftop
Marsh Posté le 10-03-2008 à 16:21:28
black_lord a écrit : apt-get install iftop |
iftop est surement tres bien, meme surement meilleur. Mais je préfère utiliser mon script...
Marsh Posté le 07-10-2008 à 15:04:48
J'espère que les nouvelles versions vont vous plaire et qu'elles vous seront utile. N'hésitez pas à faire un retour sur le forum...
Marsh Posté le 08-10-2008 à 11:55:23
j'ai ni bash ni /proc sur mes serveurs
Marsh Posté le 08-10-2008 à 12:18:07
zecrazytux a écrit : j'ai ni bash ni /proc sur mes serveurs |
C'est sur que ca aide pas pour tester le bouzin...
Marsh Posté le 17-10-2008 à 16:09:05
Nouvelle version 0.97 avec une petite modification de l'affichage, normalement un peu plus clair.
Marsh Posté le 17-10-2008 à 18:51:04
J'aime pas trop ton mélange de [], [[]] et test. Tu devrais essayer d'être consistant. J'aime pas non plus tes cat qui ne servent à rien (cat machin | awk ...). J'aime pas les grep inutiles devant les awk. J'aime pas ta facon de traiter 15 fois le même fichier en entier, pour extraire 15 informations de ce fichier.
Sinon ça a l'air assez propre, et ça j'aime bien.
Mais j'ai pas testé.
Marsh Posté le 19-10-2008 à 16:48:58
matafan a écrit : J'aime pas trop ton mélange de [], [[]] et test. Tu devrais essayer d'être consistant. J'aime pas non plus tes cat qui ne servent à rien (cat machin | awk ...). J'aime pas les grep inutiles devant les awk. J'aime pas ta facon de traiter 15 fois le même fichier en entier, pour extraire 15 informations de ce fichier. |
Ah, très bien, enfin un commentaire. Mais bon c'est pas très constructif. Donne des exemples illustrés par des bouts de code, des pistes d'amélioration. Je n'ai pas la prétention de dire que ces scripts sont parfaits, loin s'en faut, c'est d'ailleurs pour cela qu'il sont sur le forum, pour que je puisse progresser, apprendre de nouvelles choses. Donc j'apprécierai grandement que tu m'éclaire de t'es lumières, qui m'ont l'air somme toutes lumineuses
Marsh Posté le 20-10-2008 à 12:41:06
Bon alors, vu que tu m'as pas l'air d'avoir envie de chercher :
Si j'étais toi je mettrais des [[]] partout pour remplacer les [] et les "test".
cat machin | awk 'bidule' -> awk 'bidule' machin
grep machin truc | awk 'bidule' -> awk '/machin/ bidule' truc
Par exemple je remplacerai ça :
cat /proc/diskstats > $ramdisk/diskstats.$pid |
Par ça :
awk '/'"$dsk"'/ { print $4 $5 $6 $8 $9 $10 }' /proc/diskstats | read read0 mergedread0 readsector0 write0 mergedwrite0 writesector0 |
Edit : j'avais oublié le nom de fichier
Marsh Posté le 20-10-2008 à 15:50:09
ton exemple, matafan
Marsh Posté le 20-10-2008 à 16:16:05
j'ai testé en mettant les lignes ci desous dans un script, mais le echo ne sort rien et pourtant le awk marche nikel, c'est le read qui n'a pas l'air de vouloir le faire. Bizarre.
awk '/'" sda "'/ {print $4 $5 $6 $8 $9 $10}' /proc/diskstats|read read0 mergedread0 readsector0 write0 mergedwrite0 writesector0
echo $read0 $mergedread0 $readsector0 $write0 $mergedwrite0 $writesector0
Marsh Posté le 20-10-2008 à 18:32:46
Pas moyen de le faire fonctionner pour le moment, rien à faire ca coince.
Marsh Posté le 20-10-2008 à 21:59:56
C'est parce qu'il manque des virgules, awk colle les champs les uns aux autres : print $4, $5, $6, $8, $9, $10
Marsh Posté le 21-10-2008 à 10:24:02
matafan a écrit : C'est parce qu'il manque des virgules, awk colle les champs les uns aux autres : print $4, $5, $6, $8, $9, $10 |
J'avais testé avec print $4" "$5" "$6" "$8" "$9" "$10 et le résultat est le même, read n'a pas l'air de récupérer quoi que se soit.
voila ce que donne la ligne avec les virgules:
|
Une fois le read ajouté et un echo ligne suivante dans un script de test, les variables restent désespérément vides. Bizarre bizarre.
Marsh Posté le 21-10-2008 à 10:36:46
En fait c'est normal, c'est parce que le read s'exécute dans un sous-shell (parce qu'il est à droite d'un pipe). Donc les variables sont assignées dans le sous-shell, ce qui ne modifie évidement pas les variables dans le shell père. Y'a moyen de contourner ça mais bon, ça compique un peu.
Marsh Posté le 21-10-2008 à 18:44:18
matafan a écrit : En fait c'est normal, c'est parce que le read s'exécute dans un sous-shell (parce qu'il est à droite d'un pipe). Donc les variables sont assignées dans le sous-shell, ce qui ne modifie évidement pas les variables dans le shell père. Y'a moyen de contourner ça mais bon, ça compique un peu. |
Comment je peux faire alors pour recupérer toutes mes variables en une ligne ? Maintenant tu m'as mis l'eau à la bouche, et même en bricolant le truc dans tous les sens pas moyen d'arriver à mes fins, je sèche complet.
Marsh Posté le 21-10-2008 à 23:35:19
Une solution qui complique un peu l'écriture, c'est de grouper tout le code qui utilise ces variables dans un bloc à droite du pipe :
echo ... | { read ...; |
Une autre solution c'est d'utiliser un tableau plutôt n variables.
Marsh Posté le 29-10-2008 à 22:36:02
Encore une petite maj pour fixer des bricoles et améliorer la lisibilité de l'affichage. J'ai aussi viré les couleurs qui ne servaient à rien. Désolé matafan, j'ai pas réussi à faire de façon simple ce dont on parlait au dessus, peut être plus tard...
J'ai ajouté une petite chose supplémentaire, l'affichage unique si on entre 0 comme valeur.
Marsh Posté le 21-01-2009 à 19:07:50
N'hésitez surtout pas à tester la nouvelle version des deux scripts (normalement définitive) et faire des retours sur le forum, surtout au niveau de la précision des mesures, normalement c'est très fiable mais bon on sait jamais. Merci d'avance aux testeurs.
Marsh Posté le 22-01-2009 à 11:12:21
Pour info, l'erreur de mesure devrait être d'environ 0.1% à 1s et de moins en moins au fur et à mesure que l'on augmente le temps de rafraichissement.
Marsh Posté le 13-02-2009 à 15:00:34
Intéressant, je ne me suis jamais trop penché sur les débits hors ceux de lecture avec hdparm.
Marsh Posté le 13-02-2009 à 17:08:05
thana54 a écrit : Intéressant, je ne me suis jamais trop penché sur les débits hors ceux de lecture avec hdparm. |
Si tu veux voir ce que ca donne avec ioview je te conseil plutot dd avec un truc du genre dd if=/dev/sda of=/dev/zero bs=1M iflag=direct et sur une 2e console tu lances ioview avec le rafraichissement de ton choix. Ca c'est pour la vitesse séquentielle du disque, après pour l'aléatoire je te recommande d'utiliser iometer pour générer la charge.
Marsh Posté le 23-05-2007 à 18:19:27
Ci-dessous deux scripts GPL sans prétention aucune qui vous permettrons de monitorer en temps réel les IOs et les débits en lecture et écriture de votre disque dur ainsi que les debits réseau. Si ça vous plait (ou pas d'ailleur) ou si vous avez des commentaires ou idées pour améliorer la chose, ne vous genez pas.
Testés sur ubuntu 6.06, 8.04, 9.04, 9.10, opensuse 10, 11, 11.1, sles 10sp2 et 11, fedora 9 et plus, ils sont maintenant configurables au niveau du délai de rafraichissement et beaucoup plus précis grâce à un système de compensation du temps d'exécution et une priorité accrue, ainsi qu'un contrôle de dépassement de la compensation pour garantir la précision de la mesure. Capablent de mesurer de très gros débits grâce au changement automatique des unités à l'affichage, je m'en sert lors d'installation de gros sytèmes de virtualisation pour aider troubleshooter les problèmes d'io. Redoutable.
PS: ne pas oublier de copier les scripts dans /usr/sbin et de les passer en exécutable...
Edit: maj du script en 0.2
Edit: maj du script en 0.4
Edit: Ajout de netview 0.2
Edit: maj de ioviex en 0.6
Edit: maj de netview en 0.6
Edit: maj de ioview et netview en 0.8
Edit: maj de ioview et netview en 0.9
Edit: maj de ioview et netview en 0.95
Edit: maj de ioview et netview en 0.97
Edit: maj de ioview et netview en 0.99
Edit: maj de ioview et netview en 0.9999
Edit: Enfin la v1.0 !
Edit: maj de ioview et netview en 1.01
Edit: maj de ioview et netview en 1.02
Edit: maj de ioview et netview en 1.04
ci-dessous ce que ca donne à l'écran (si tout va bien) sur une carte adaptec 5085 en lecture séquentielle et un bond en mode 0 de deux carte intel 10GE (bridées car sur port pcie 4X au lieu de 8), et oui oui les chiffres sont bons.
pour ioview
Real time statistics for sdc (refreshed every 3 sec)
Reads per second: 6244.33r/s
Average read size: 256.0KiB/s
Merged reads per second: 0r/s
Read throughput: 1.524GiB/s
Writes per second: 2.66w/s
Average write size: 6.6KiB/s
Merged writes per second: .66w/s
Write throughput: 17.6KiB/s
Total reads: 624012
Total average read size: 252.6KiB
Total merged reads: 5210
Total data read: 157656278KiB 153961.20MiB 150.352GiB .1468TiB
Total writes: 335485
Total average write size: 27.4KiB
Total merged writes: 936940
Total data written: 9197405KiB 8981.84MiB 8.771GiB .0085TiB
et pour netview
Real time statistics for bond1 (refreshed every 3 sec)
Link encap:Ethernet HWaddr 00:1B:21:2C:28:D4
inet addr:10.0.0.2 Bcast:10.0.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:184691251 errors:0 dropped:0 overruns:0 frame:0
TX packets:208073052 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:239703181513 (228598.7MiB) TX bytes:277194877850 (264353.6MiB)
RX packets per second: 927145.00pkt/s
RX average packet size: 1513.94bytes/pkt
RX throughput: 11.229Gb/s (1.307GiB/s)
TX packets per second: 123557.00pkt/s
TX average packet size: 54.00bytes/pkt
TX throughput: 53.38Mb/s (6.36MiB/s)
Ci dessous ioview:
#!/bin/bash
# Author: Maxime Pierron
#
# /usr/sbin/ioview
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
ramfs="/tmpramfs"
function usage()
{
echo "ioview v1.04 by Maxime Pierron, 2007, 2008, 2009."
echo "On screen real time block device utilization rate,"
echo "a 2.6.x linux kernel is required."
echo "Usage: ioview "time_in_sec" "device_name" (ex: ioview 1 sda),"
echo "use "time_in_sec" to specify the refresh interval,"
echo "(default: 3s, 0 to display only once),"
echo "press ctrl+C to stop ioview."
}
function float_cond()
{
local cond=0
if [ $# -gt 0 ]; then
cond=$(echo "$*"|bc 2>/dev/null -q 2>/dev/null)
if [ -z "$cond" ]; then cond=0; fi
if [[ "$cond" != 0 && "$cond" != 1 ]]; then cond=0; fi
fi
local stat=$((cond == 0))
return $stat
}
if [ -z $1 ]; then
usage
exit 0
fi
if [ -z $(find /usr/bin/ -name awk|sed 's;/usr/bin/;;g') ]; then echo "awk is missing, you have to install it."; exit 1; fi
if [ -z $(find /usr/bin/ -name bc|sed 's;/usr/bin/;;g') ]; then echo "bc is missing, you have to install it."; exit 1; fi
oneshot="emtpy"
if [ ! -z $2 ]; then
if [ $1 -eq 0 ]; then
rr=1
dsk=$2
oneshot="true"
else
if [ $1 -ge 1 ]; then
rr=$1
dsk=$2
else
usage
echo "You must enter an integer."
exit 1
fi
fi
else
rr=3
dsk=$1
fi
device=$(awk '/'" $dsk "'/ {print $3}' /proc/diskstats)
if [ ! -z $device ]; then
device=$(awk '/'" $dsk "'/ {print $8}' /proc/diskstats)
if [ -z $device ]; then
usage
echo $dsk "is not a usable block device."
exit 1
fi
else
usage
echo $dsk "not found."
exit 1
fi
pid=$$
renice -19 $pid > /dev/null 2>&1
if [ ! -d $ramfs ]; then
mkdir $ramfs
fi
if [ -z $(mount|grep "$ramfs"|sed -n "1{p;q;}"|awk '{print $1}') ]; then
mount -t tmpfs -o size=4M, tmpfs $ramfs > /dev/null 2>&1
fi
diskstats=$(ls $ramfs|grep diskstats.); for i in $diskstats; do pidlock=$(echo $i|cut -d"." -f2); if [ -z $(pidstat -p $pidlock 2>/dev/null|awk '{print $2}'|grep $pidlock) ]; then rm -f $ramfs/$i; fi; done
cat /proc/diskstats > $ramfs/diskstats.$pid
read read0 mergedread0 readsector0 write0 mergedwrite0 writesector0 <<< $(awk '{print $4,$5,$6,$8,$9,$10}' <<< $(awk '/'" $dsk "'/' $ramfs/diskstats.$pid 2>/dev/null))
unit1="r/s"
unit2="w/s"
unit3="KiB/s"
unit4="KiB"
unit5="MiB"
unit6="GiB"
unit7="TiB"
message="refreshed every $rr sec"
while [ 1 ]; do
date0=$(date +%s.%N)
cat /proc/diskstats > $ramfs/diskstats.$pid
read1=$read0
mergedread1=$mergedread0
readsector1=$readsector0
write1=$write0
mergedwrite1=$mergedwrite0
writesector1=$writesector0
read read0 mergedread0 readsector0 write0 mergedwrite0 writesector0 <<< $(awk '{print $4,$5,$6,$8,$9,$10}' <<< $(awk '/'" $dsk "'/' $ramfs/diskstats.$pid 2>/dev/null))
reads=$(echo "scale=2; ($read0-$read1)/$rr"|bc 2>/dev/null)
mergedreads=$(echo "scale=2; ($mergedread0-$mergedread1)/$rr"|bc 2>/dev/null)
readkB=$(echo "scale=2; ($readsector0-$readsector1)*512/1024"|bc 2>/dev/null)
if float_cond $reads '>' 0; then
avgreadsz=$(echo "scale=1; $readkB/$reads/$rr"|bc 2>/dev/null)
else
avgreadsz=0
fi
readspeed=$(echo "scale=1; $readkB/$rr"|bc 2>/dev/null)
readspeedunit="KiB/s"
if float_cond $readspeed '>=' 1024; then
readspeed=$(echo "scale=2; $readkB/1024/$rr"|bc 2>/dev/null)
readspeedunit="MiB/s"
if float_cond $readspeed '>=' 1024; then
readspeed=$(echo "scale=3; $readkB/1048576/$rr"|bc 2>/dev/null)
readspeedunit="GiB/s"
fi
fi
datareadk=$[$readsector0*512/1024]
totavgreadsz=$(echo "scale=1; $datareadk/$read0"|bc 2>/dev/null)
if [ -z $totavgreadsz ]; then totavgreadsz=0; fi
datareadm=$(echo "scale=2; $datareadk/1024"|bc 2>/dev/null)
datareadg=$(echo "scale=3; $datareadm/1024"|bc 2>/dev/null)
datareadt=$(echo "scale=4; $datareadg/1024"|bc 2>/dev/null)
writes=$(echo "scale=2; ($write0-$write1)/$rr"|bc 2>/dev/null)
mergedwrites=$(echo "scale=2; ($mergedwrite0-$mergedwrite1)/$rr"|bc 2>/dev/null)
writekB=$(echo "scale=2; ($writesector0-$writesector1)*512/1024"|bc 2>/dev/null)
if float_cond $writes '>' 0; then
avgwritesz=$(echo "scale=1; $writekB/$writes/$rr"|bc 2>/dev/null)
else
avgwritesz=0
fi
writespeed=$(echo "scale=1; $writekB/$rr"|bc 2>/dev/null)
writespeedunit="KiB/s"
if float_cond $writespeed '>=' 1024; then
writespeed=$(echo "scale=2; $writekB/1024/$rr"|bc 2>/dev/null)
writespeedunit="MiB/s"
if float_cond $writespeed '>=' 1024; then
writespeed=$(echo "scale=3; $writekB/1048576/$rr"|bc 2>/dev/null)
writespeedunit="GiB/s"
fi
fi
datawritek=$[$writesector0*512/1024]
totavgwritesz=$(echo "scale=1; $datawritek/$write0"|bc 2>/dev/null)
if [ -z $totavgwritesz ]; then totavgwritesz=0; fi
datawritem=$(echo "scale=2; $datawritek/1024"|bc 2>/dev/null)
datawriteg=$(echo "scale=3; $datawritem/1024"|bc 2>/dev/null)
datawritet=$(echo "scale=4; $datawriteg/1024"|bc 2>/dev/null)
if [ $oneshot = "true" ];then
message="displayed only once"
oneshot="false"
else
clear
echo "Real time statistics for $dsk ($message)"
echo ""
echo "Reads per second:_$reads$unit1"|awk -F"_" '{printf("%-25s %-1s \n", $1, $2)}'
echo "Average read size:_$avgreadsz$unit3"|awk -F"_" '{printf("%-25s %-1s \n", $1, $2)}'
echo "Merged reads per second:_$mergedreads$unit1"|awk -F"_" '{printf("%-25s %-1s \n", $1, $2)}'
echo "Read throughput:_$readspeed$readspeedunit"|awk -F"_" '{printf("%-25s %-1s \n", $1, $2)}'
echo ""
echo "Writes per second:_$writes$unit2"|awk -F"_" '{printf("%-25s %-1s \n", $1, $2)}'
echo "Average write size:_$avgwritesz$unit3"|awk -F"_" '{printf("%-25s %-1s \n", $1, $2)}'
echo "Merged writes per second:_$mergedwrites$unit2"|awk -F"_" '{printf("%-25s %-1s \n", $1, $2)}'
echo "Write throughput:_$writespeed$writespeedunit"|awk -F"_" '{printf("%-25s %-1s \n", $1, $2)}'
echo ""
echo "Total reads:_$read0"|awk -F"_" '{printf("%-25s %-1s \n", $1, $2)}'
echo "Total average read size:_$totavgreadsz$unit4"|awk -F"_" '{printf("%-25s %-1s \n", $1, $2)}'
echo "Total merged reads:_$mergedread0"|awk -F"_" '{printf("%-25s %-1s \n", $1, $2)}'
echo "Total data read:_$datareadk$unit4 $datareadm$unit5 $datareadg$unit6 $datareadt$unit7"|awk -F"_" '{printf("%-25s %-1s %-1s %-1s \n", $1, $2, $3, $4)}'
echo ""
echo "Total writes:_$write0"|awk -F"_" '{printf("%-25s %-1s \n", $1, $2)}'
echo "Total average write size:_$totavgwritesz$unit4"|awk -F"_" '{printf("%-25s %-1s \n", $1, $2)}'
echo "Total merged writes:_$mergedwrite0"|awk -F"_" '{printf("%-25s %-1s \n", $1, $2)}'
echo "Total data written:_$datawritek$unit4 $datawritem$unit5 $datawriteg$unit6 $datawritet$unit7"|awk -F"_" '{printf("%-25s %-1s %-1s %-1s \n", $1, $2, $3, $4)}'
if [ $oneshot = "false" ];then exit 0; fi
fi
date1=$(date +%s.%N)
offset=$(echo "scale=6; $date1-$date0"|bc 2>/dev/null)
sleeptime=$(echo "scale=6; $rr-($offset*1.11)"|bc 2>/dev/null)
if float_cond $sleeptime '<=' 0; then
sleeptime=0.001
echo "WARNING: Results are not accurate due to too high system load."
fi
sleep $sleeptime 2> /dev/null
done
Et ci dessous netview:
#!/bin/bash
# Author: Maxime Pierron
#
# /usr/sbin/netview
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
ramfs="/tmpramfs"
function usage()
{
echo "netview v1.04 by Maxime Pierron, 2007, 2008, 2009."
echo "On screen real time net device utilization rate,"
echo "a 2.6.x linux kernel is required."
echo "Usage: netview "time_in_sec" "device_name" (ex: netview 1 eth0),"
echo "use "time_in_sec" to specify the refresh interval,"
echo "(default: 3s, 0 to display only once),"
echo "press ctrl+C to stop netview."
}
function float_cond()
{
local cond=0
if [ $# -gt 0 ]; then
cond=$(echo "$*"|bc 2>/dev/null -q 2>/dev/null)
if [ -z "$cond" ]; then cond=0; fi
if [[ "$cond" != 0 && "$cond" != 1 ]]; then cond=0; fi
fi
local stat=$((cond == 0))
return $stat
}
if [ -z $1 ]; then
usage
exit 0
fi
if [ -z $(find /usr/bin/ -name awk|sed 's;/usr/bin/;;g') ]; then echo "awk is missing, you have to install it."; exit 1; fi
if [ -z $(find /usr/bin/ -name bc|sed 's;/usr/bin/;;g') ]; then echo "bc is missing, you have to install it."; exit 1; fi
oneshot="emtpy"
if [ ! -z $2 ]; then
if [ $1 -eq 0 ]; then
rr=1
iface=$2
oneshot="true"
else
if [ $1 -ge 1 ]; then
rr=$1
iface=$2
else
usage
echo "You must enter an integer."
exit 1
fi
fi
else
rr=3
iface=$1
fi
device=$(grep -w $iface /proc/net/dev|cut -d ":" -f1)
if [ -z $device ]; then
usage
echo $iface "not found."
exit 1
fi
pid=$$
renice -19 $pid > /dev/null 2>&1
if [ ! -d $ramfs ]; then
mkdir $ramfs
fi
if [ -z $(mount|grep "$ramfs"|sed -n "1{p;q;}"|awk '{print $1}') ]; then
mount -t tmpfs -o size=4M, tmpfs $ramfs > /dev/null 2>&1
fi
netdev=$(ls $ramfs|grep netdev.); for i in $netdev; do pidlock=$(echo $i|cut -d"." -f2); if [ -z $(pidstat -p $pidlock 2>/dev/null|awk '{print $2}'|grep $pidlock) ]; then rm -f $ramfs/$i; fi; done
cat /proc/net/dev > $ramfs/netdev.$pid
read rxbytes0 rxpackets0 txbytes0 txpackets0 <<< $(awk '{print $1,$2,$9,$10}' <<< $(grep $iface $ramfs/netdev.$pid 2>/dev/null|cut -d":" -f2))
pkts="pkt/s"
bytes="bytes/pkt"
message="refreshed every $rr sec"
while [ 1 ]; do
date0=$(date +%s.%N)
cat /proc/net/dev > $ramfs/netdev.$pid
rxbytes1=$rxbytes0
rxpackets1=$rxpackets0
txbytes1=$txbytes0
txpackets1=$txpackets0
read rxbytes0 rxpackets0 txbytes0 txpackets0 <<< $(awk '{print $1,$2,$9,$10}' <<< $(grep $iface $ramfs/netdev.$pid 2>/dev/null|cut -d":" -f2))
rxpackets=$(echo "scale=2; ($rxpackets0-$rxpackets1)/$rr"|bc 2>/dev/null)
rxbytes=$(echo "scale=2; ($rxbytes0-$rxbytes1)/$rr"|bc 2>/dev/null)
if float_cond $rxpackets '>' 0; then
avgrxsz=$(echo "scale=2; $rxbytes/$rxpackets"|bc 2>/dev/null)
else
avgrxsz=0
fi
rxkbits=$(echo "scale=1; $rxbytes*8/1000"|bc 2>/dev/null)
rxkbspeed=$rxkbits
rxkbspeedunit="Kb/s"
if float_cond $rxkbspeed '>=' 1000; then
rxkbspeed=$(echo "scale=2; $rxkbits/1000"|bc 2>/dev/null)
rxkbspeedunit="Mb/s"
if float_cond $rxkbspeed '>=' 1000; then
rxkbspeed=$(echo "scale=3; $rxkbits/1000000"|bc 2>/dev/null)
rxkbspeedunit="Gb/s"
fi
fi
rxkbytes=$(echo "scale=1; $rxbytes/1024"|bc 2>/dev/null)
rxkBspeed=$rxkbytes
rxkBspeedunit="KiB/s"
if float_cond $rxkBspeed '>=' 1024; then
rxkBspeed=$(echo "scale=2; $rxkbytes/1024"|bc 2>/dev/null)
rxkBspeedunit="MiB/s"
if float_cond $rxkBspeed '>=' 1024; then
rxkBspeed=$(echo "scale=3; $rxkbytes/1048576"|bc 2>/dev/null)
rxkBspeedunit="GiB/s"
fi
fi
txpackets=$(echo "scale=2; ($txpackets0-$txpackets1)/$rr"|bc 2>/dev/null)
txbytes=$(echo "scale=2; ($txbytes0-$txbytes1)/$rr"|bc 2>/dev/null)
if float_cond $txpackets '>' 0; then
avgtxsz=$(echo "scale=2; $txbytes/$txpackets"|bc 2>/dev/null)
else
avgtxsz=0
fi
txkbits=$(echo "scale=1; $txbytes*8/1000"|bc 2>/dev/null)
txkbspeed=$txkbits
txkbspeedunit="Kb/s"
if float_cond $txkbspeed '>=' 1000; then
txkbspeed=$(echo "scale=2; $txkbits/1000"|bc 2>/dev/null)
txkbspeedunit="Mb/s"
if float_cond $txkbspeed '>=' 1000; then
txkbspeed=$(echo "scale=3; $txkbits/1000000"|bc 2>/dev/null)
txkbspeedunit="Gb/s"
fi
fi
txkbytes=$(echo "scale=1; $txbytes/1024"|bc 2>/dev/null)
txkBspeed=$txkbytes
txkBspeedunit="KiB/s"
if float_cond $txkBspeed '>=' 1024; then
txkBspeed=$(echo "scale=2; $txkbytes/1024"|bc 2>/dev/null)
txkBspeedunit="MiB/s"
if float_cond $txkBspeed '>=' 1024; then
txkBspeed=$(echo "scale=3; $txkbytes/1048576"|bc 2>/dev/null)
txkBspeedunit="GiB/s"
fi
fi
if [ $oneshot = "true" ];then
message="displayed only once"
oneshot="false"
else
clear
echo "Real time statistics for $iface ($message)"
echo ""
ifconfig $iface 2>/dev/null|grep $iface|sed 's/^'$iface'[ ]\+//'
ifconfig $iface 2>/dev/null|grep -v $iface|sed 's/^\s*//'|sed 's/ Kb)/KiB)/g'|sed 's/ Mb)/MiB)/g'|sed 's/ Gb)/GiB)/g'|sed 's/ Tb)/TiB)/g'|sed 's/ KB)/KiB)/g'|sed 's/ MB)/MiB)/g'|sed 's/ GB)/GiB)/g'|sed 's/ TB)/TiB)/g'
echo "RX packets per second:_$rxpackets$pkts"|awk -F"_" '{printf("%-23s %-1s \n", $1, $2)}'
echo "RX average packet size:_$avgrxsz$bytes"|awk -F"_" '{printf("%-23s %-1s \n", $1, $2)}'
echo "RX throughput:_$rxkbspeed$rxkbspeedunit ($rxkBspeed$rxkBspeedunit)"|awk -F"_" '{printf("%-23s %-1s \n", $1, $2)}'
echo ""
echo "TX packets per second:_$txpackets$pkts"|awk -F"_" '{printf("%-23s %-1s \n", $1, $2)}'
echo "TX average packet size:_$avgtxsz$bytes"|awk -F"_" '{printf("%-23s %-1s \n", $1, $2)}'
echo "TX throughput:_$txkbspeed$txkbspeedunit ($txkBspeed$txkBspeedunit)"|awk -F"_" '{printf("%-23s %-1s \n", $1, $2)}'
if [ $oneshot = "false" ];then exit 0; fi
fi
date1=$(date +%s.%N)
offset=$(echo "scale=6; $date1-$date0"|bc 2>/dev/null)
sleeptime=$(echo "scale=6; $rr-($offset*1.15)"|bc 2>/dev/null)
if float_cond $sleeptime '<=' 0; then
sleeptime=0.001
echo "WARNING: Results are not accurate due to too high system load."
fi
sleep $sleeptime 2> /dev/null
done
Message édité par maxxximatoze le 21-12-2009 à 15:32:51