BrowserUk,,
I took a while to respond. Here is working code showing what I'm trying too improve.
( I looked at the named pipes, but that seemed to imply a parent/child situation.) I used the plain socket code shown below to describe the situation. On the system I'm testing, the cost of building the socket each time more than doubles the total time of the transaction.
...actual requirements of this part of your project and ask a more general question of teh best approach to satisfying them?
As usual you're right about that! My current project is to build a pure-perl NoSQL key/value database to replace Oracle's BerkeleyDB. Caching is critical to database performance, but I haven't found a 'solid' way to share the cache between processes. That was the performance numbers I showed previously ( single user vs multi-user ). Write performance is acceptable, but the read performance is not. I tried using 'send/recv', 'print/read', etc. without success. The client/server talk once and then hang!
Any suggestions welcome!
How to use the client/server code: Start the server first. Then one or more client(s), which will show the times for opening the connection, total time of the transaction and then the percentage of overhead.
Server:
use strict;
use warnings;
use Time::HiRes qw( gettimeofday usleep );
use Socket;
my $server_port = 3000;
# make the socket
socket(Server, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
# so we can restart our server quickly
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, 1);
# build up my socket address
my $my_addr = sockaddr_in($server_port, INADDR_ANY);
bind(Server, $my_addr)
or die "Couldn't bind to port $server_port: $!\n";
# establish a queue for incoming connections
# print SOMAXCONN, "\n";
listen(Server, SOMAXCONN)
or die "Couldn't listen on port $server_port: $!\n";
while ( 1 )
{ my $WorkName = "FBServer"; my $cnt = 0; my $result = "";
while ( 1 )
{ $cnt++;
my $client;
$0 = "$WorkName: Waiting for work!";
accept( $client, Server );
if ( defined $client )
{
my $tm = substr(scalar localtime(),4,15);
$0 = "$WorkName: Working ( $cnt ) $tm";
my $stime = gettimeofday; my $html = ""; my $Todo = ""
+; my $size = 0;
$0 = "$WorkName: Read Socket ( $cnt ) $tm";
eval
{ while (<$client>)
{ $Todo .= "$_"; chomp($Todo); }
};
if ( $@ )
{ my $err = $@;
print $client "$err\n";
syslog('alert', "2 ERROR: $err");
last;
}
if ( $Todo )
{ chomp($Todo); ## Debian patch
print "$Todo ", sprintf("%0.8f",gettimeofday - $
+stime),"\n";
print $client "Client $Todo: Thank you!\n";
close ( $client );
};
}
}
}
exit;
Client:
use strict;
use warnings;
use Socket;
use Time::HiRes qw( gettimeofday usleep );
our @Total = (); our $Totcnt = 500;
our $remote_host = "172.16.47.22";
our $remote_port = 3000;
for ( 0..$Totcnt )
{ my $parms = $$;
my $result = Call_Multi_User( $parms );
if ( ! $result ) { print "\t****Nothing Back\n"; }
print "$result\n";
usleep 20000;
}
my $open = $Total[0]; my $total = $Total[1];
my $diff = ( $total / $open ) - 1 ;
$open = $Total[0] / $Totcnt; my $total = $Total[1] / $Totcnt;
print "\n\tTotals:\t\t\t".sprintf("%0.8f",$open) . "\t".sprintf("%
+0.8f",$total)."\t+ ".sprintf("%0.3f",$diff)." %\n\n";
exit;
sub Call_Multi_User
{ my $Todo = shift; if ( ! defined $Todo ) { return( "" ); }
our $server;
my $stime = gettimeofday; my $answer = "";
# if ( ! $server ) ## if this worked then we wouldn't have t
+he establish overhead!
{
socket( $server, PF_INET, SOCK_STREAM, getprotobyname('tcp
+')); # create a socket
# build the address of the remote machine
my $internet_addr = inet_aton($remote_host)
or die "Couldn't convert $remote_host into an Inte
+rnet address: $!\n";
my $paddr = sockaddr_in($remote_port, $internet_addr);
# connect
connect($server, $paddr)
or die "Couldn't connect to $remote_host:$remote_p
+ort: $!\n";
select((select($server), $| = 1)[0]); # enable command bu
+ffering
}
my $open = gettimeofday - $stime;
print $server "$Todo\n";
shutdown($server,1); # my $no = 0;
while (<$server>)
{ $answer .= $_;
}
close $server;
chomp($answer);
my $total = gettimeofday - $stime;
my $diff = ( $total / $open ) - 1 ;
$Total[0] += $open; $Total[1] += $total;
$answer .= "\t".sprintf("%0.8f",$open) . "\t".sprintf("%0.8f",
+$total)."\t+ ".sprintf("%0.3f",$diff)." %";
return ( $answer );
}
Client output:
Client 24006: Thank you! 0.00029397 0.00068903 + 1.34
+4 %
Client 24006: Thank you! 0.00030303 0.00076103 + 1.51
+1 %
Client 24006: Thank you! 0.00030303 0.00061202 + 1.02
+0 %
Client 24006: Thank you! 0.00033212 0.00082612 + 1.48
+7 %
Client 24006: Thank you! 0.00037408 0.00084996 + 1.27
+2 %
Client 24006: Thank you! 0.00030398 0.00110912 + 2.64
+9 %
Totals (Average): 0.00021664 0.00051245 + 1.36
+5 %
Server output: ( 2 clients running )
24006 0.00013709
24007 0.00002718
24007 0.00003099
24006 0.00002503
24007 0.00013399
24006 0.00002623
24006 0.00003099
24007 0.00002503
24006 0.00013494
24007 0.00002503
24007 0.00003099
24006 0.00002503
24007 0.00013399
24006 0.00002599
Thank you
"Well done is better than well said." - Benjamin Franklin
|