Hi Dormando,
This is a continuation of the mail thread with subject "Is ARM64 officially supported ?" [1]
I've refreshed my Perl coding skills and came up with this wrapper around mc-crusher:
=================================================
#!/usr/bin/env perl
# sudo cpan Cache::Memcached
use strict;
use warnings;
use Cache::Memcached;
use Data::Dumper;
use Time::Piece;
my $TESTBED_HOME = $ENV{'TESTBED_HOME'};
die "Env variable 'TESTBED_HOME' is not set!" if ! defined($TESTBED_HOME);
my $MC_CRUSHER_HOME = $ENV{'MC_CRUSHER_HOME'};
die "Env variable 'MC_CRUSHER_HOME' is not set!" if ! defined($MC_CRUSHER_HOME);
if (scalar(@ARGV) < 2) {
die "Usage:
mc-crusher.pl <conf> <host> <port> <timeoutInSecs>. For example:
mc-crusher.pl cmd_get a.b.c.d 11211 60"
}
my $config = shift @ARGV;
my $host = shift @ARGV;
my $port = shift @ARGV || 8080;
my $duration = shift @ARGV || 5 * 60; # 5 mins
system("$MC_CRUSHER_HOME/mc-crusher --conf $TESTBED_HOME/etc/memcached/mc-crusher/conf/$config.conf --ip $host --port $port --timeout $duration");
print "MC Crusher status: $!\n" if $!;
my $serverAddr = "$host:$port";
print "Server: $serverAddr\n";
my @servers = ($serverAddr);
my $memcached = new Cache::Memcached;
$memcached->set_servers(\@servers);
my $stats = $memcached->stats(['misc'])->{'hosts'}->{$serverAddr}->{'misc'};
warn Dumper($stats);
my $timestamp = localtime->datetime();
my $cmd_per_sec = int($stats->{$config}) / $duration;
my $bytes_written = $stats->{'bytes_written'};
my $bytes_read = $stats->{'bytes_read'};
my $time_system = $stats->{'rusage_system'};
my $time_user = $stats->{'rusage_user'};
my $today = localtime->ymd();
my $folder = "$TESTBED_HOME/etc/memcached/$today";
system("mkdir -p $folder");
print "Cannot create '$folder': $!\n" if $!;
my $filename = "$folder/memcached-mc-crusher-report-$host-$config.csv";
my $headerPrefix = "${host}_${config}";
open(my $fh, '>', $filename) or die "Could not open file '$filename': $!";
print $fh "timeStamp,${headerPrefix}_per_sec,${headerPrefix}_bytes_written,${headerPrefix}_bytes_read," .
"${headerPrefix}_time_system,${headerPrefix}_time_user,config,host\n";
print $fh "$timestamp,$cmd_per_sec,$bytes_written,$bytes_read,$time_system,$time_user,$config,$host\n";
close $fh;
print "done\n";
==========================================
Basically it executes mc-crusher with different configurations against different servers (x64 vs arm64) and stores the stats in CSV files, which later I visualize in Kibana.
So far I've ran with these configs:
cmd_get.conf:
send=ascii_get,recv=blind_read,conns=50,key_prefix=foobar,key_prealloc=0,pipelines=8
send=ascii_set,recv=blind_read,conns=10,key_prefix=foobar,key_prealloc=0,pipelines=4,stop_after=200000,usleep=1000,value_size=10
cmd_set.conf:
send=ascii_set,recv=blind_read,conns=5,key_prefix=foobar,value_size=2,value=hi,key_prealloc=1
I always run those against freshly started Memcached server (started with: ./memcached -p 8080).
After mc-crusher finishes I get the value of the current command, e.g. cmd_get, and divide it by
the duration, to get the cmds per second.
And here are the numbers I have so far:
gets/s:
- x64: ~450 000
- arm64: ~310 000
sets/s:
- x64: ~25 000
- arm64: ~63 000
I.e. x64 is faster for GET and arm64 is faster for SET.
Those numbers are averages from multiple runs.
Do you see anything wrong in my Perl script ? Or any ideas how to improve it.
Any hints how to profile the server to see why/where it is slower on different platforms ?
Regards,
Martin