diff mbox series

[1/3] rt-tests: determine_maximum_mpps.sh: Add a menu to get user settings.

Message ID 20201209183100.16836-1-jkacur@redhat.com
State New
Headers show
Series [1/3] rt-tests: determine_maximum_mpps.sh: Add a menu to get user settings. | expand

Commit Message

John Kacur Dec. 9, 2020, 6:30 p.m. UTC
Incorporate the functionality of the get_cpuinfo_mhz.sh script into
determine_maximum_mpps.sh so that get_cpuinfo_mhz.sh can be removed.

Currently determine_maximum_mpps.sh (part of queuelat) asks the user
to edit the PREAMBLE in the script to set the environment.

Get rid of this by creating a menu that allows the user the set these
variables from a menu when running the script.

Here is the output from running the script with the -h option

./src/queuelat/determine_maximum_mpps.sh -h
Usage:
determine_maximum_mpps.sh [OPTIONS]

-c cpulist
	List of processors to run on. The default is processor 0
	Numbers are separated by commas and may include ranges. Eg. 0,3,7-11
-m maxlat
	maximum latency in nanoseconds. The default is 20000
	if the maximum is exceeded, that run of queuelat quits
-n cycles
	Estimated number of cycles it takes to process one packet
	The default is 300
-f
	Set the scheduling policy to SCHED_FIFO.
	This is the default if not specified
-r
	Set the scheduling policy to SCHED_RR.
-p priority
	default priority = 1. Valid numbers are from 1 to 99
-h
	help
	print this help message and exit

Signed-off-by: John Kacur <jkacur@redhat.com>

Comments

Daniel Wagner Dec. 14, 2020, 9:30 a.m. UTC | #1
Hi John,

On Wed, Dec 09, 2020 at 01:30:58PM -0500, John Kacur wrote:
> Incorporate the functionality of the get_cpuinfo_mhz.sh script into

> determine_maximum_mpps.sh so that get_cpuinfo_mhz.sh can be removed.

> 

> Currently determine_maximum_mpps.sh (part of queuelat) asks the user

> to edit the PREAMBLE in the script to set the environment.

> 

> Get rid of this by creating a menu that allows the user the set these

> variables from a menu when running the script.

> 

> Here is the output from running the script with the -h option

> 

> ./src/queuelat/determine_maximum_mpps.sh -h

> Usage:

> determine_maximum_mpps.sh [OPTIONS]

> 

> -c cpulist

> 	List of processors to run on. The default is processor 0

> 	Numbers are separated by commas and may include ranges. Eg. 0,3,7-11


Does the option also do CPU affinity. In this case I would suggest to
use '-a' to go with the pattern.

What about long options? Long options are propably a bit harder to
implement in shell but it would be good in my opinion to keep all those
tests commands as close as possible.

Thanks,
Daniel
John Kacur Dec. 16, 2020, 6:22 a.m. UTC | #2
On Mon, 14 Dec 2020, Daniel Wagner wrote:

> Hi John,

> 

> On Wed, Dec 09, 2020 at 01:30:58PM -0500, John Kacur wrote:

> > Incorporate the functionality of the get_cpuinfo_mhz.sh script into

> > determine_maximum_mpps.sh so that get_cpuinfo_mhz.sh can be removed.

> > 

> > Currently determine_maximum_mpps.sh (part of queuelat) asks the user

> > to edit the PREAMBLE in the script to set the environment.

> > 

> > Get rid of this by creating a menu that allows the user the set these

> > variables from a menu when running the script.

> > 

> > Here is the output from running the script with the -h option

> > 

> > ./src/queuelat/determine_maximum_mpps.sh -h

> > Usage:

> > determine_maximum_mpps.sh [OPTIONS]

> > 

> > -c cpulist

> > 	List of processors to run on. The default is processor 0

> > 	Numbers are separated by commas and may include ranges. Eg. 0,3,7-11

> 

> Does the option also do CPU affinity. In this case I would suggest to

> use '-a' to go with the pattern.

> 

> What about long options? Long options are propably a bit harder to

> implement in shell but it would be good in my opinion to keep all those

> tests commands as close as possible.

> 

> Thanks,

> Daniel

> 

> 


The script is using taskset to set the cpu affinity, and so it uses
-c to match the option in taskset. However the script also uses
taskset to run queuelat which uses -c to mean cycles-per-packet.

I am fine with changing this option to -a to match cyclictest and other 
tests in the suite. I'll send a patch to do that.

Yeah, long options are a PITA in shell script, I think I might just
convert the script to python where command line options are a breeze.

That will come in a later patch.

John
Ahmed S. Darwish Dec. 16, 2020, 9:39 a.m. UTC | #3
On Wed, Dec 16, 2020 at 01:22:36AM -0500, John Kacur wrote:
> On Mon, 14 Dec 2020, Daniel Wagner wrote:

...
> >

> > What about long options? Long options are propably a bit harder to

> > implement in shell but it would be good in my opinion to keep all those

> > tests commands as close as possible.

> >

...
>

> Yeah, long options are a PITA in shell script, I think I might just

> convert the script to python where command line options are a breeze.

>


Just a FYI, it's quite O.K. when using util-linux getopt(1) instead of
bash's getopts builtin.

thanks,

--
Ahmed S. Darwish
Linutronix GmbH
diff mbox series

Patch

diff --git a/src/queuelat/determine_maximum_mpps.sh b/src/queuelat/determine_maximum_mpps.sh
index f785147f1bbd..fdede472728c 100755
--- a/src/queuelat/determine_maximum_mpps.sh
+++ b/src/queuelat/determine_maximum_mpps.sh
@@ -6,12 +6,84 @@ 
 #  A script to determine the maximum mpps. Logic:
 #  Increase mpps in 0.5 units 
 # 
-# NOTE: please set "PREAMBLE" to the command line you use for 
-# 
-PREAMBLE="taskset -c 2 chrt -f 1"
 MAXLAT="20000"
 CYCLES_PER_PACKET="300"
 OUTFILE=/usr/tmp/outfile
+PRIO=1
+CPULIST=0
+SCHED=""
+
+usage()
+{
+	echo "Usage:"
+	echo "$(basename $0) [OPTIONS]"
+	echo
+	echo "-c cpulist"
+	echo "	List of processors to run on. The default is processor 0"
+	echo "	Numbers are separated by commas and may include ranges. Eg. 0,3,7-11"
+	echo "-m maxlat"
+	echo "	maximum latency in nanoseconds. The default is 20000"
+	echo "	if the maximum is exceeded, that run of queuelat quits"
+	echo "-n cycles"
+	echo "	Estimated number of cycles it takes to process one packet"
+	echo "	The default is 300"
+	echo "-f"
+	echo "	Set the scheduling policy to SCHED_FIFO."
+	echo "	This is the default if not specified"
+	echo "-r"
+	echo "	Set the scheduling policy to SCHED_RR".
+	echo "-p priority"
+	echo "	default priority = 1. Valid numbers are from 1 to 99"
+	echo "-h"
+	echo "	help"
+	echo "	print this help message and exit"
+	exit
+}
+
+get_cpuinfo_mhz()
+{
+	grep "cpu MHz" /proc/cpuinfo | cut -f 3 -d " " | sort -rn | head -n1
+}
+
+# Check that the scheduling policy hasn't already been set
+# Exit with an error message if it has
+check_sched()
+{
+	if [ "${SCHED}" != "" ]; then
+		echo "Specify -f or -r, but not both"
+		usage
+	fi
+}
+
+# Process command line options
+while getopts ":c:frp:m:n:h" opt; do
+	case ${opt} in
+		c ) CPULIST="${OPTARG}" ;;
+		m ) MAXLAT="${OPTARG}" ;;
+		n ) CYCLES_PER_PACKET="${OPTARG}" ;;
+		f ) check_sched; SCHED="-f" ;;
+		r ) check_sched; SCHED="-r" ;;
+		p ) PRIO="${OPTARG}" ;;
+		h ) usage ;;
+		* ) echo "no such option"; usage ;;
+	esac
+done
+
+shift $((OPTIND -1 ))
+
+# If the user hasn't specified a scheduling policy
+# then set it to the default SCHED_FIFO
+if [ "${SCHED}" == "" ]; then
+	SCHED="-f"
+fi
+
+# Error checking that the user entered a priority between 1 and 99
+if [[ "${PRIO}" -lt "1" ]] || [[ "${PRIO}" -gt "99" ]]; then
+	echo "PRIO must be a number between 1 and 99"
+	usage
+fi
+
+PREAMBLE="taskset -c ${CPULIST} chrt ${SCHED} ${PRIO}"
 
 echo "Determining maximum mpps the machine can handle"
 echo "Will take a few minutes to determine mpps value"
@@ -21,7 +93,7 @@  for mpps in $(seq 3 3 50); do
 	echo testing "$mpps" Mpps
 
 	OUTFILE=$(mktemp)
-	$PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f "$(sh get_cpuinfo_mhz.sh)" -p "$mpps" -t 30 > "$OUTFILE"
+	$PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f "$(get_cpuinfo_mhz)" -p "$mpps" -t 30 > "$OUTFILE"
 
 	exceeded=$(grep exceeded "$OUTFILE")
 	if [ ! -z "$exceeded" ]; then
@@ -37,7 +109,7 @@  for mpps in $(seq $first_mpps -1 3); do
 	echo testing "$mpps" Mpps
 
 	OUTFILE=$(mktemp)
-	$PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f "$(sh get_cpuinfo_mhz.sh)" -p "$mpps" -t 30 > "$OUTFILE"
+	$PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f "$(get_cpuinfo_mhz)" -p "$mpps" -t 30 > "$OUTFILE"
 
 	exceeded=$(grep exceeded "$OUTFILE")
 	if [ -z "$exceeded" ]; then
@@ -54,7 +126,7 @@  for mpps in $(seq "$second_mpps" 0.3 $first_mpps); do
 	echo testing "$mpps" Mpps
 
 	OUTFILE=$(mktemp)
-	$PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f "$(sh get_cpuinfo_mhz.sh)" -p "$mpps" -t 30 > "$OUTFILE"
+	$PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f "$(get_cpuinfo_mhz)" -p "$mpps" -t 30 > "$OUTFILE"
 
 	exceeded=$(grep exceeded "$OUTFILE")
 	if [ ! -z "$exceeded" ]; then
@@ -71,7 +143,7 @@  for mpps in $(seq "$third_mpps" -0.1 3); do
 	echo testing "$mpps" Mpps
 
 	OUTFILE=$(mktemp)
-	$PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f "$(sh get_cpuinfo_mhz.sh)" -p "$mpps" -t 30 > "$OUTFILE"
+	$PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f "$(get_cpuinfo_mhz)" -p "$mpps" -t 30 > "$OUTFILE"
 
 	exceeded=$(grep exceeded "$OUTFILE")
 	if [ -z "$exceeded" ]; then
@@ -90,7 +162,7 @@  while [ $queuelat_failure == 1 ]; do
 	echo "$mpps Mpps"
 
 	for i in $(seq 1 10); do
-		$PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f "$(get_cpuinfo_mhz.sh)" -p "$mpps" -t 30 > "$OUTFILE"
+		$PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f "$(get_cpuinfo_mhz)" -p "$mpps" -t 30 > "$OUTFILE"
 		exceeded=$(grep exceeded "$OUTFILE")
 
 		if [ ! -z "$exceeded" ]; then
@@ -113,7 +185,7 @@  while [ $queuelat_failure == 1 ]; do
 	echo -n "Starting 10 minutes run with "
 	echo "$mpps Mpps"
 
-	$PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f "$(get_cpuinfo_mhz.sh)" -p "$mpps" -t 600 > "$OUTFILE"
+	$PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f "$(get_cpuinfo_mhz)" -p "$mpps" -t 600 > "$OUTFILE"
 	exceeded=$(grep exceeded "$OUTFILE")
 
 	if [ ! -z "$exceeded" ]; then