#!/bin/sh

# lmbench - run the lmbench benchmark suite.
#
# Hacked into existence by Larry McVoy (lm@sun.com now lm@sgi.com).
# Copyright (c) 1994 Larry McVoy.  GPLed software.
# $Id: lmbench,v 1.2 1994/11/26 00:39:59 lm Exp $

# Make sure we can find: ./cmd, df, and netstat
PATH=.:$PATH:/etc:/usr/etc:/sbin:/usr/sbin
export PATH

if [ -f CONFIG ]
then	echo Using config in CONFIG
	. CONFIG
else	echo Using defaults > /dev/tty
fi

if [ X$FILE = X ]
then	FILE=/tmp/XXX
	touch $FILE || echo Can not create $FILE
fi
if [ X$MB = X ]
then	MB=8
fi
if [ X$FSDIR = X ]
then	FSDIR=/usr/tmp/lat_fs
fi

# Figure out as much stuff as we can about this system.
# Sure would be nice if everyone had SGI's "hinv".
echo \[lmbench1.0 results for `uname -a`] 1>&2
echo \[DISK: ${DISK}] 1>&2
echo \[FILE: ${FILE}] 1>&2
echo \[FSDIR: ${FSDIR}] 1>&2
echo \[REMOTE: ${REMOTE}] 1>&2
echo \[NETWORKS: ${NETWORKS}] 1>&2
echo \[MB: ${MB}] 1>&2
echo \[`date`] 1>&2
echo \[`uptime`] 1>&2

netstat -i | while read i
do	echo \[net: "$i"] 1>&2
	set `echo $i`
	case $1 in
	    *ame)	;;
	    *)		ifconfig $1 | while read i
			do echo \[if: "$i"] 1>&2
			done
			;;
	esac
done

mount -p | while read i
do	echo \[mount: "$i"] 1>&2
done

# In case mount -p doesn't work.
df | while read i
do	echo \[df: "$i"] 1>&2
done

echo Calculating processor speed > /dev/tty
mhz 1>&2

echo Calculating system call overhead > /dev/tty
lat_syscall

echo Calculating pipe latency > /dev/tty
lat_pipe

SERVERS="lat_tcp lat_rpc lat_udp lat_connect bw_tcp"

for i in $REMOTE localhost
do	if [ $i = localhost ]
	then	for i in $SERVERS; do $i -s; done
	else	rcp ../../scripts/os ${i}:/tmp/os
		OS=`rsh $i /tmp/os`
		cd ../$OS && rcp $SERVERS ${i}:/tmp
		( rsh -n $i "(cd /tmp; for i in $SERVERS; do \$i -s; done)" & )
	fi
done
sleep 2

for i in localhost
do
	echo Calculating local UDP latency > /dev/tty
	lat_udp $i; lat_udp -$i;
	echo Calculating local TCP latency > /dev/tty
	lat_tcp $i; lat_tcp -$i;
	echo Calculating local RPC latency > /dev/tty
	lat_rpc $i udp; lat_rpc $i tcp; lat_rpc -$i;
	echo Calculating local connect latency > /dev/tty
	lat_connect $i; lat_connect -$i;
	echo Calculating local TCP bandwidth > /dev/tty
	bw_tcp $i 10m; bw_tcp -$i 
done

for i in $REMOTE
do	echo ""
	echo "[ Networking remote to $i: `rsh $i uname -a` ]"
	echo Calculating remote host $i UDP latency > /dev/tty
	lat_udp $i; lat_udp -$i;
	echo Calculating remote host $i TCP latency > /dev/tty
	lat_tcp $i; lat_tcp -$i;
	echo Calculating remote host $i RPC latency > /dev/tty
	lat_rpc $i udp; lat_rpc $i tcp; lat_rpc -$i;
	echo Calculating remote host $i connect latency > /dev/tty
	lat_connect $i; lat_connect -$i;
	echo Calculating remote host $i TCP bandwidth > /dev/tty
	bw_tcp $i 10m; bw_tcp -$i 
done

if [ -c "$DISK" -a -r "$DISK" ]
then	 echo Calculating disk latency > /dev/tty
	lmdd label="Disk $DISK latency" if=$DISK bs=512 count=2000 print=2
fi

echo Calculating processes overhead > /dev/tty
lat_proc

echo Calculating pipe bandwidth > /dev/tty
bw_pipe

if [ -c "$DISK" -a -r "$DISK" ]
then	echo Calculating raw disk bandwidth > /dev/tty
	lmdd label="Disk $DISK bandwidth" if=$DISK bs=56k count=100 print=3
fi

echo Calculating $FILE file write bandwidth > /dev/tty
rm -f $FILE
lmdd label="File $FILE write bandwidth: " of=$FILE count=1k fsync=1 print=3

echo Calculating pagefault latency > /dev/tty
lat_pagefault $FILE

echo Calculating mmap latency > /dev/tty
echo \"mappings 1>&2
for i in 8k 256k 512k 1m 2m 3m 4m 5m 6m 7m 8m
do	lat_mmap $i $FILE
done
echo "" 1>&2

echo Calculating file reread bandwidth > /dev/tty
echo \"read bandwidth 1>&2
for i in 16 32 64 128 192 256 384 512 \
	768 1024 1536 2048 2560 3072 3584 4096 \
	5120 6144 7168 8192
do	bw_file_rd ${i}k $FILE	2>/dev/null
	bw_file_rd ${i}k $FILE
done
echo "" 1>&2

echo Calculating file reread via mmap bandwidth > /dev/tty
echo \"Mmap read bandwidth 1>&2
for i in 16 32 64 128 192 256 384 512 \
	768 1024 1536 2048 2560 3072 3584 4096 \
	5120 6144 7168 8192
do	bw_mmap_rd ${i}k $FILE 2>/dev/null
	bw_mmap_rd ${i}k $FILE
done
echo "" 1>&2

rm -f $FILE

echo Calculating bcopy bandwidth > /dev/tty
for type in libc unrolled
do	for align in aligned unaligned
	do	echo \"$type bcopy $align 1>&2
		for i in 64 128 512 1024 2048 4096 8192
		do	bw_mem_cp ${i}k $type $align
		done
		echo "" 1>&2
	done
done

echo Calculating memory read bandwidth > /dev/tty
echo "Memory read bandwidth" 1>&2
for i in 1m 2m 4m 8m
do	bw_mem_rd $i
done
echo "" 1>&2

echo Calculating memory write bandwidth > /dev/tty
echo "Memory write bandwidth" 1>&2
for i in 1m 2m 4m 8m
do	bw_mem_wr $i
done
echo "" 1>&2

echo Calculating file system latency "(this can take a while)" > /dev/tty
echo '"File system latency' 1>&2
lat_fs $FSDIR
echo "" 1>&2

echo Calculating context switch overhead "(this can take 5-25 minutes)" > /dev/tty
for size in 0 4 16 32 64
do	echo "\tCalculating ctx switch for ${size}KB sized processes" > /dev/tty
	lat_ctx -s $size 2 4 8 16 20
done

echo Calculating memory load latency "(this takes ~20 minutes)" > /dev/tty
echo "Memory load latency" 1>&2
lat_mem_rd $MB 8 16 32 64 128 512 1024 2048 4096 8192 16384 32768
