X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre-iokit%2Fost-survey%2Fost-survey;h=02c345ea04636be9a3a72f0ee45f8092078762a4;hp=fc93117363c1242e2efa64a3a97c59ee0e6a36ce;hb=HEAD;hpb=2afdf3499344737d70737ec2fa4e19575ca3203c diff --git a/lustre-iokit/ost-survey/ost-survey b/lustre-iokit/ost-survey/ost-survey index fc93117..be1dcc6 100755 --- a/lustre-iokit/ost-survey/ost-survey +++ b/lustre-iokit/ost-survey/ost-survey @@ -1,4 +1,9 @@ #!/usr/bin/perl +# SPDX-License-Identifier: GPL-2.0 + +# +# This file is part of Lustre, http://www.lustre.org/ +# # This script is to be run on a client machine and will test all the # OSTs to determine which is the fastest and slowest # The current test method is as follows: @@ -9,12 +14,15 @@ # -Compute the average, and Standard deviation # -Find the slowest OST for read and write # -Find the Fastest OST for read and write +# # GLOBALS $pname = $0; # to hold program name $OSTS = 0; # Number of OSTS we will loop over $BSIZE = 1024 * 1024; # Size of i/o block +$MBSIZE = 1024 * 1024; # One MB $MNT = "/mnt/lustre"; # Location of Lustre file system +$CACHESZ = 0; # max_cached_mb parameter $FSIZE = 30; # Number of i/o blocks # Usage @@ -27,30 +35,33 @@ sub usage () { exit 1; } -# ost_count subroutine ets globle variable $OST with Number of OST's +# ost_count subroutine sets global variable $OST with number of OSTs # Also fills 1 for active OST indexes in ACTIVEOST_INX array. sub ost_count () { - # numobd gives number of ost's and activeobd gives number of active ost's - my $tempfile = glob ("/proc/fs/lustre/lov/*-clilov-*/activeobd"); - open(PTR, $tempfile) || die "Cannot open $tempfile: $!\n"; - $OSTS = ; - close PTR; + $OSTS = `lctl get_param -n lov.$FSNAME-clilov-*.activeobd`; + if ( $? ) { + die "Read lov.*-clilov-$FSNAME.activeobd error: $?\n"; + } print "Number of Active OST devices : $OSTS"; - my $tempfile = glob ("/proc/fs/lustre/lov/*-clilov-*/numobd"); - open(PTR, $tempfile) || die "Cannot open $tempfile: $!\n"; - $numost = ; - close PTR; + + $numost = `lctl get_param -n lov.$FSNAME-clilov-*.numobd`; + if ( $? ) { + die "Read lov.$FSNAME-clilov-*.numobd error: $?\n"; + } + if ( $numost != $OSTS ) { printf "Number of non active ots(s): %d\n", ( $numost - $OSTS ); $OSTS = $numost; } - my $tempfile = glob ("/proc/fs/lustre/lov/*-clilov-*/target_obd"); - open(PTR, $tempfile) || die "Cannot open $tempfile: $!\n"; + + $targets = `lctl get_param -n lov.$FSNAME-clilov-*.target_obd`; + if ( $? ) { + die "Read lov.$FSNAME-clilov-*.target_obd error: $?\n"; + } + my $count = 0; - my $temp; - while () { - chop; - my ($ost_num, $ost_name, $ost_status) = split(/\s+/, $_); + foreach $line (split /\n/, $targets) { + my ($ost_num, $ost_name, $ost_status) = split(/\s+/, $line); if ( $ost_status eq "ACTIVE" ) { $ACTIVEOST_INX[$count] = 1; } @@ -58,16 +69,28 @@ sub ost_count () { } } -sub cache_off () { - $CACHEFILE = glob ("/proc/fs/lustre/llite/*/max_cached_mb"); - open(PTR, $CACHEFILE) || die "Cannot open $tempfile: $!\n"; - $CACHESZ = 0 + ; - close PTR; - system("echo 0 >> $CACHEFILE"); +# cache_mod subroutine sets global variable $CACHESZ and sets max_cached_mb +# to 256 * system page size in MB. +sub cache_mod () { + use POSIX qw(sysconf _SC_PAGESIZE); + $CACHESZ = `lctl get_param -n llite.$FSNAME-*.max_cached_mb`; + if ( $? ) { + die "Read llite.$FSNAME-*.max_cached_mb error: $?\n"; + } + + $CACHESZ = `echo "$CACHESZ" | grep max_cached_mb | awk '{print \$2}'`; + my $pagesize = sysconf(_SC_PAGESIZE); + $req_cache_mb = ($pagesize * 256)/ $MBSIZE; + + system("lctl set_param -n llite.$FSNAME-*.max_cached_mb=$req_cache_mb"); + if ( $? ) { + die "Set llite.$FSNAME-*.max_cached_mb error: $?\n"; + } } -sub cache_on () { - system("echo $CACHESZ >> $CACHEFILE"); +# cache_return subroutine returns max_cached_mb to original value +sub cache_return () { + system("lctl set_param -n llite.$FSNAME-*.max_cached_mb=$CACHESZ"); } # make_dummy subroutine creates a dummy file that will be used for read operation. @@ -78,9 +101,9 @@ sub make_dummy () { } # run_test subroutine actually writes and reads data to/from dummy file -# and compute corresponding time taken for read and write operation and +# and computes corresponding time taken for read and write operation and # byte transfer for the both operations. -# This subroutine also fill corresponding globle arrays with above information. +# This subroutine also fill corresponding global arrays with above information. sub run_test () { my $SIZE = $_[0]; my $INX=$_[1]; @@ -167,11 +190,11 @@ sub output_all_data () { print "Ost# Read(MB/s) Write(MB/s) Read-time Write-time\n"; print "----------------------------------------------------\n"; while ( $count < $OSTS ) { - if ( $ACTIVEOST_INX[$count] ) { + if ( $ACTIVEOST_INX[$count] ) { printf "%d %.3f %.3f %.3f %.3f\n",$count, $rMBs[$count], $wMBs[$count], $rTime[$count], $wTime[$count]; } else { - printf "%d Inactive ost\n",$count; + printf "%d Inactive ost\n",$count; } $count = $count + 1; } @@ -188,6 +211,10 @@ my $filename = ""; my $dirpath = ""; my $flag = 0; +# Check number of arguments +my $numargs = $#ARGV + 1; +usage() if $numargs < 1; + # Command line parameter parsing use Getopt::Std; getopts('s:h') or usage(); @@ -201,9 +228,9 @@ foreach (@ARGV) { if ($i > 1) { print "ERROR: extra argument $_\n"; usage(); - } + } } -#Check for Time::HiRes module +#Check for Time::HiRes module my $CheckTimeHiRes = "require Time::HiRes"; eval ($CheckTimeHiRes) or die "You need to install the perl-Time-HiRes package to use this script\n"; my $LoadTimeHiRes = "use Time::HiRes qw(gettimeofday)"; @@ -216,10 +243,18 @@ chop($hostname); print "$pname: ", strftime("%D", localtime($time_v)); print " OST speed survey on $MNT from $hostname\n"; +# Get the file system name. +$FSNAME = `lfs getname $MNT`; +if ( $? ) { + die "`lfs getname $MNT` error: $?\n"; +} +$FSNAME =~ /(.*)-/; +$FSNAME = $1; + # get OST count ost_count (); -# turn off local cache -cache_off (); +# Modify local cache +cache_mod (); $dirpath = "$MNT/ost_survey_tmp"; eval { mkpath($dirpath) }; @@ -234,7 +269,7 @@ while ($CNT < $OSTS) { $filename = "$dirpath/file$CNT"; if ( $ACTIVEOST_INX[$CNT] ) { # set stripe for OST number $CNT - system ("lfs setstripe $filename 0 $CNT 1"); + system ("lfs setstripe -S 0 -i $CNT -c 1 $filename"); # Perform write for OST number $CNT &run_test($FSIZE,$CNT,"write",$filename); $flag++; @@ -252,7 +287,7 @@ while ($CNT < $OSTS) { $CNT = $CNT + 1; } -# if read or write performed on any OST then display information. +# if read or write performed on any OST then display information. if ( $flag ) { if ( $flag > 1 ) { &calculate("Read",@rMBs); @@ -263,7 +298,8 @@ if ( $flag ) { print "There is no active OST's found\n"; } -cache_on (); +# Return cache to original size +cache_return (); eval { rmtree($dirpath) }; if ($@) {