comparison t/stress-memcached.pl @ 0:30782bb1fc04 MEMCACHED_1_2_3

memcached-1.2.3
author Maxim Dounin <mdounin@mdounin.ru>
date Sun, 23 Sep 2007 03:58:34 +0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:30782bb1fc04
1 #!/usr/bin/perl
2 #
3
4 use strict;
5 use lib '../../api/perl/lib';
6 use Cache::Memcached;
7 use Time::HiRes qw(time);
8
9 unless (@ARGV == 2) {
10 die "Usage: stress-memcached.pl ip:port threads\n";
11 }
12
13 my $host = shift;
14 my $threads = shift;
15
16 my $memc = new Cache::Memcached;
17 $memc->set_servers([$host]);
18
19 unless ($memc->set("foo", "bar") &&
20 $memc->get("foo") eq "bar") {
21 die "memcached not running at $host ?\n";
22 }
23 $memc->disconnect_all();
24
25
26 my $running = 0;
27 while (1) {
28 if ($running < $threads) {
29 my $cpid = fork();
30 if ($cpid) {
31 $running++;
32 #print "Launched $cpid. Running $running threads.\n";
33 } else {
34 stress();
35 exit 0;
36 }
37 } else {
38 wait();
39 $running--;
40 }
41 }
42
43 sub stress {
44 undef $memc;
45 $memc = new Cache::Memcached;
46 $memc->set_servers([$host]);
47
48 my ($t1, $t2);
49 my $start = sub { $t1 = time(); };
50 my $stop = sub {
51 my $op = shift;
52 $t2 = time();
53 my $td = sprintf("%0.3f", $t2 - $t1);
54 if ($td > 0.25) { print "Took $td seconds for: $op\n"; }
55 };
56
57 my $max = rand(50);
58 my $sets = 0;
59
60 for (my $i = 0; $i < $max; $i++) {
61 my $key = key($i);
62 my $set = $memc->set($key, $key);
63 $sets++ if $set;
64 }
65
66 for (1..int(rand(500))) {
67 my $rand = int(rand($max));
68 my $key = key($rand);
69 my $meth = int(rand(3));
70 my $exp = int(rand(3));
71 undef $exp unless $exp;
72 $start->();
73 if ($meth == 0) {
74 $memc->add($key, $key, $exp);
75 $stop->("add");
76 } elsif ($meth == 1) {
77 $memc->delete($key);
78 $stop->("delete");
79 } else {
80 $memc->set($key, $key, $exp);
81 $stop->("set");
82 }
83 $rand = int(rand($max));
84 $key = key($rand);
85 $start->();
86 my $v = $memc->get($key);
87 $stop->("get");
88 if ($v && $v ne $key) { die "Bogus: $v for key $rand\n"; }
89 }
90
91 $start->();
92 my $multi = $memc->get_multi(map { key(int(rand($max))) } (1..$max));
93 $stop->("get_multi");
94 }
95
96 sub key {
97 my $n = shift;
98 $_ = sprintf("%04d", $n);
99 if ($n % 2) { $_ .= "a"x20; }
100 $_;
101 }