#!/usr/local/bin/perl -w our $Debug = 0; our $SortLog = 0; use strict; use BerkeleyDB; our %Session = (); use Time::HiRes qw( gettimeofday ); use Fcntl qw( :flock ); my $DBHome = "/home/FlexBase/"; if ( substr($DBHome,-1) ne "/" ) { $DBHome .= "/"; } if ( ! -d $DBHome ) { mkdir $DBHome or die "DBHome directory not correct!"; } if ( ! ( ( -r _ )&&( -w _ ) ) ) { die "DBHome directory is not valid!"; } system("rm /home/FlexBase/*"); ## Temporary for testing our $filename = "/home/FlexBase/TestBDB"; use constant CACHE => '1048576'; my $Cachesize = CACHE; our $env = new BerkeleyDB::Env ( -Home => '/home/FlexBase', -Cachesize => CACHE, -Flags => DB_INIT_MPOOL|DB_INIT_CDB|DB_CREATE ) or die "cannot open ENV: $! $BerkeleyDB::Error\n"; our %Pyr = (); our $BLK = 512; our $db1 = tie %Pyr, 'BerkeleyDB::Btree', ( -Filename => "$filename", -Env => $env, # -Pagesize => 4096, ## Use of this makes the BerkeleyDB operate worst! -Flags => DB_CREATE ); # create some data our $Chr="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789|"; our $size = length($Chr)-1; our $Rno = 0; our $LockFile = "../tmp/BDBmail_lock"; system("touch $LockFile"); open(LOCK,"+<",$LockFile) || die "Cannot open $LockFile:$!"; # Associate it with the database my $enable = $env->cds_enabled(); if ( $enable ) { print "cds_enabled\n"; } my $ret = 0; my $cnt = 0; my $Tot = 0; my $howmany = 11_000_000; my $ky = ""; my $data = "a" x 80; my $appkey = "-123456789"; # $howmany = 2_000; ## Testing our ( $WR, $RD ); if ( $SortLog ) { my $logFile = "$filename"."_Write"; open($WR,">",$logFile) || die "Cannot open $logFile:$!"; $logFile = "$filename"."_Read"; open($RD,">",$logFile) || die "Cannot open $logFile:$!"; } our $NAME = "BerkeleyDB"; our $kb = "_KB"; our ($pmem1,$pmem2) = &Display_Mem_Usage($$,$NAME,0); print "## Start: VSZ-$pmem1$kb RSS-$pmem2$kb\tBLOCK: $BLK ( $howmany )\n"; my ( $cursor, $lock, $wpm, $key, $count, $k ); my $stime = gettimeofday; while ( $cnt < $howmany ) { # my $st = $cnt % 58; # my $chr = chr( 122-$st ); $key = "A-$cnt"; $cnt++; $Tot += length($key)+length($data); flock( LOCK, LOCK_EX ); $lock = $db1->db_cursor(DB_WRITECURSOR); $ret = $db1->db_put($key, $data); undef $lock; flock( LOCK, LOCK_UN ); if ($ret != 0 ) { die "Write failed on BDB3: $ret\n"; } if ( $SortLog ) { print $WR "$key$data\n"; } } flock( LOCK, LOCK_EX ); $lock = $db1->db_cursor(DB_WRITECURSOR); my $strt = chr(1); $data = ""; $ret = $db1->db_put($strt, $data); my $dbend = chr(255); $data = ""; $ret = $db1->db_put($dbend, $data); undef $lock; flock( LOCK, LOCK_UN ); $db1->db_sync(); undef $cursor; my $etime = gettimeofday - $stime; $wpm = int($howmany/$etime); print "Write: $etime $wpm\/sec $cnt\n"; if ( $SortLog ) { close $WR; system("sort -o /home/FlexBase/TestBDB_Write.sort /home/FlexBase/TestBDB_Write"); } $stime = gettimeofday; $count = 0; $key = " "; $data = ""; $ret = 0; while ($ret == 0) { flock( LOCK, LOCK_SH ); $cursor = $db1->db_cursor(); $ret = $cursor->c_get($key, $data, DB_SET); $ret = $cursor->c_get($key, $data, DB_NEXT); flock( LOCK, LOCK_UN ); undef $cursor; if ( ord($key) == 1 ) { next; } if ( ord($key) == 255 ) { last; } $0 = "SLock 3 on $key"; $count++; ## if ( $count > 28 ) { last; } if ( $SortLog ) { print $RD "$key$data\n"; } ## print "$key\t$data\t$count\n"; } $db1->db_sync(); $etime = gettimeofday - $stime; $wpm = int($count/$etime); print "ReadNext: $etime $wpm\/sec Total: $count\n"; if ( $SortLog ) { close $RD; system("/usr/bin/sort -o /home/FlexBase/TestBDB_Read.sort /home/FlexBase/TestBDB_Read"); } my ($mem1,$mem2) = &Display_Mem_Usage($$,$NAME,0); my $diff1 = $mem1 - $pmem1; my $diff2 = $mem2 - $pmem2; print "## End: VSZ-$mem1$kb RSS-$mem2$kb Diff:$diff1|$diff2$kb\tBLOCK: $BLK\n\n"; exit; sub Display_Mem_Usage { # VSZ is size in KBytes of the virtual memory ( VSZ * 1024 ) # RSS is size in pages of real memory ( 1024 * RSS ) my $cpid = shift; my $name = shift; my $from = shift; my $var = ""; my $fh; my $tm = ""; if ( $Debug >= 2 ) { $tm = scalar localtime() . " "; } if ( ! ( kill 0 => $cpid ) ) ## Check that pid is active { return ( -1, -1 ); } my $arg = qq| -o "vsz rssize" -p $cpid|; open ( $fh, "-|", "/bin/ps $arg" ) or die "Prefork: Not open \'$arg\': $!"; while (<$fh>) { $var .= $_; } close $fh; my $rno = my @ref = split(/\n/,$var); if ( $rno < 2 ) { return ( -1, -1 ); } my $info = join(" ", split " ", $ref[1]); my ($vmem,$rmem) = ( split(/\ /,$info) ); return ( $vmem , $rmem ); } 1;