Whamcloud - gitweb
LU-17705 ptlrpc: replace synchronize_rcu() with rcu_barrier()
[fs/lustre-release.git] / lustre-iokit / ost-survey / ost-survey
index fc93117..be1dcc6 100755 (executable)
@@ -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:
 #   -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 = <PTR>;
-       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 = <PTR>;
-       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 (<PTR>) {
-               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 + <PTR>;
-       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 ($@) {