$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
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;
}
}
}
-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.
}
# 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];
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;
}
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();
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)";
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) };
$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++;
$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);
print "There is no active OST's found\n";
}
-cache_on ();
+# Return cache to original size
+cache_return ();
eval { rmtree($dirpath) };
if ($@) {