Barry Brimer wrote: > > I am wondering what tools are available > > in CentOS 5.5 that would allow me to measure incoming and > > outgoing network speeds? My new website seems to be getting a > > lot more traffic that I had anticipated off the bat and I would > > like to measure resource usage to ensure it is keeping up. > Take a look at ntop .. there are packages available from rpmforge. +1 ntop At the risk of pissing off the list for such a long post, here are 2 useful shell-scripts for monitoring Linux system bandwidth. Although they were developed on another distro I believe (untested) they will work fine with CentOS. The first script gets installed as a cronjob, the second is run when you want a histogram of your bandwidth. As commented in the script, changing 1 line in the second script gives you TX bandwidth instead of RX. Probably it should be an argument to the script. logifx: ----%< cut here %<----------------------------------------------------------- #!/bin/bash # From: William Hunt <wjh at prv8.net> # Newsgroups: alt.os.linux.slackware # Subject: Fun with Slackware: bandwidth monitor # Date: Wed, 23 Jan 2008 02:04:05 -0800 # A script to periodically calculate the total number of bytes # sent and received on the given interface; # useful for running under cron, for example. # raw data is read from ifconfig(1); the script calculates its # output from the current reading and from data stored in a state # file by the previous run; the current values are then stored in # the state file for the next run, overwriting the previous state. # if the state file does not exist then no output is generated, but # the new STATEF file is still initialized with current data. #-------------------------------------------------------------- # this is a useful escape in case of trouble: #-------------------------------------------------------------- function PANIC () { echo PANIC: $* ; exit ; } #-------------------------------------------------------------- # syntax: logifx <interface> #-------------------------------------------------------------- [ "$1" == "" ] && PANIC interface required. IF=$1 #-------------------------------------------------------------- # FILES & DIRECTORIES: #-------------------------------------------------------------- export PATH=/usr/bin:/bin:/usr/sbin:/sbin STATED=/var/run/logifx [ -d "${STATED}" ] || mkdir -p ${STATED} || PANIC bad ${STATED} ? STATEF=${STATED}/ifxlog-${IF}.dat OUTD=/var/log OUTF=${OUTD}/ifx_${IF} #-------------------------------------------------------------- # read ifconfig and return RX and TX values: #-------------------------------------------------------------- function readif() { ifconfig ${IF} | while read LINE ; do DATA=($(echo ${LINE} | grep 'RX bytes:')) [ $? = 0 ] && echo ${DATA[1]/bytes:} ${DATA[5]/bytes:} done exit 0 } #-------------------------------------------------------------- # read the clock: #-------------------------------------------------------------- STAMP=$( date '+%Y%m%d%H%M' ) # timestamp for logfile line SEC=$( date '+%s' ) # time used for calculations #-------------------------------------------------------------- # read the data - note how an array is used to receive # two return values from the function call #-------------------------------------------------------------- CURRENT=($( readif )) || PANIC reading ifconfig CRX=${CURRENT[0]} CTX=${CURRENT[1]} #-------------------------------------------------------------- # if state file exists, read prior values and calculate output. # negative results indicate a stale state file, so reset it. # (not absolutely correct, but best guess and close enough); # then append the output to the log file: #-------------------------------------------------------------- if [ -e ${STATEF} ] ; then read PSEC PRX PTX < ${STATEF} SPAN=$(( ${SEC} - ${PSEC} )) [ $SPAN -gt 0 ] || PANIC WTF? SPAN=${SPAN} RX=$(( ${CRX} - ${PRX} )) TX=$(( ${CTX} - ${PTX} )) [ $RX -lt 0 ] && RX=${CRX} [ $TX -lt 0 ] && TX=${CTX} echo ${STAMP} ${SPAN} ${RX} ${TX} >> ${OUTF} || PANIC ${OUTF} fi #-------------------------------------------------------------- # update state file (overwrite) #-------------------------------------------------------------- echo ${SEC} ${CRX} ${CTX} > ${STATEF} || PANIC updating ${STATEF} #-------------------------------------------------------------- # the end. # Okay? Okay! With that in /root/cron/logifx, now, the next step is # to stuff it into cron, using crontab -l of course. # # * * * * * /root/cron/logifx eth0 # * * * * * /root/cron/logifx eth1 # * * * * * /root/cron/logifx eth2 # # Note that any errors running the script are written to stdout, # which cron will mail to the owner (root). So check for that. # # Note that the output record is formatted: # 1: timestamp YYYYMMDDHHMM # 2: interval, in seconds # 3: total bytes received during interval preceeding timestamp; # 4: total bytes sent during interval preceding timestamp; ----%< cut here %<----------------------------------------------------------- view_TX: ----%< cut here %<----------------------------------------------------------- #!/bin/awk -f # Okay? Okay! With that in /root/cron/logifx, now, the next step is # to stuff it into cron, using crontab -l of course. # # * * * * * /root/cron/logifx eth0 # * * * * * /root/cron/logifx eth1 # * * * * * /root/cron/logifx eth2 # # Note that any errors running the script are written to stdout, # which cron will mail to the owner (root). So check for that. # # Note that the output record is formatted: # 1: timestamp YYYYMMDDHHMM # 2: interval, in seconds # 3: total bytes received during interval preceeding timestamp; # 4: total bytes sent during interval preceding timestamp; # Okay? Okay! Now comes the fun part - analyzing the data. One # could simply use a pager (ex: less) to view the accumulated # readings, but a graphical interpretation makes it so much easier # to visualize the data and observe patterns. Since I work mainly # at text consoles, I use a histogram for this. # function histo( X ) { B="" N=X^0.5 # NOTE scaling ... for (a=0;a<N;a++) {B=B"*";} return B } { Data = ($3) Size = Data / 1024 # kilobytes Rate = Data / 128 / ($2) # kilobits per second Graph = histo( Rate ) mask = "%s %5.0f KB %8.3f Kb/s %s\n" printf( mask, $1, Size, Rate, Graph ) } # the end. # The second script i call view_TX and it is exactly the same # as view_RX except for one line: # Data = ($3) # is replaced with: # Data = ($4) # # I know i should rewrite these into one script, in such a way # that RX vs TX would be indicated by the script name, or an # argument, or whatever. But for my purpose this is good enough, # and maybe some day I'll rewrite it (again :*) # # These scripts get called something like: # # view_TX /var/log/ifx_eth0 | less # # and generate a report something like this: # # [...] # 200801222211 852 KB 113.586 Kb/s *********** # 200801222212 4445 KB 592.651 Kb/s ************************* # 200801222213 10 KB 1.337 Kb/s ** # 200801222214 505 KB 66.245 Kb/s ********* # 200801222215 1232 KB 164.312 Kb/s ************* # 200801222216 403 KB 54.646 Kb/s ******** # 200801222217 3379 KB 450.586 Kb/s ********************** # 200801222218 172 KB 22.913 Kb/s ***** # 200801222219 19 KB 2.580 Kb/s ** # 200801222220 705 KB 94.007 Kb/s ********** # [...] # # Okay? Okay! # The same ifx_eth0 file can also be used to calculate totals # for longer intervals, like monthly, for example. I rotate # my logs into a file tree like /var/log/YYYY/MM/DD/, so: # # cat /var/log/2007/12/*/ifx_eth0 | while read A B C D ; do # TOTRX=$(( $TOTRX + $C )) # done # echo "TOTAL RX for December, $(( $TOTRX / 1024 / 1024 )) MB." # # Okay? Okay! # # Have fun, # # -- # William Hunt, Portland Oregon USA ----%< cut here %<----------------------------------------------------------- -- Charles Polisher