]> git.proxmox.com Git - pve-manager.git/blame - bin/pveperf
pveperf: use fsync syscall from PVE::Tools
[pve-manager.git] / bin / pveperf
CommitLineData
776de3bc 1#!/usr/bin/perl
aff192e6
DM
2
3use strict;
776de3bc 4use warnings;
97ad5e50 5
aff192e6
DM
6use Time::HiRes qw( usleep ualarm gettimeofday tv_interval );
7use Net::DNS::Resolver;
8
97ad5e50
TL
9use PVE::Tools;
10
aff192e6
DM
11if ($#ARGV >= 1) {
12 print STDERR "usage: $0 [PATH]\n";
13 exit -1;
14}
15
16my $path = $ARGV[0] || '/';
17
18sub drop_cache {
19
20 # free pagecache,dentries,inode cache
21 if (-f '/proc/sys/vm/drop_caches') {
22 system ("echo 3 > /proc/sys/vm/drop_caches");
23 }
24}
25
26sub test_bogomips {
27 my $bogomips = 0;
28
29 open (TMP, "/proc/cpuinfo");
30
31 while (my $line = <TMP>) {
32 if ($line =~ m/^bogomips\s*:\s*(\d+\.\d+)\s*$/) {
33 $bogomips += $1;
34 }
35 }
36
37 close (TMP);
38
39 printf "CPU BOGOMIPS: %.2f\n", $bogomips;
40}
41
42sub test_regex {
43
44 my $starttime = [gettimeofday];
45
46 my $count = 0;
47 my $elapsed = 0;
48
49 for (;; $count++) {
50
51 my $str = int(rand(1000000)) . time();
52 if ($str =~ m/(.+)123.?123/) {
53 }
54 $elapsed = tv_interval ($starttime);
55
56 last if $elapsed > 3;
57 }
58
59 printf "REGEX/SECOND: %d\n", $count;
60}
61
62sub test_fsync {
63 my $basedir = shift;
64
65 drop_cache ();
66
67 my $dir = "$basedir/ptest.$$";
68
69 eval {
70
71 mkdir $dir;
72
73 my $data = ('A' x 4000) . "\n";
74
75 my $starttime = [gettimeofday];
76
77 my $count;
78 my $elapsed = 0;
79
80 for ($count=1;;$count++) {
81 my $m = $count % 300;
82
83 my $filename = "$dir/tf_$m.dat";
84
85 open (TMP, ">$filename") || die "open failed";
86
87 print TMP $data;
88
97ad5e50 89 PVE::Tools::fsync(fileno(\*TMP));
aff192e6
DM
90
91 close (TMP);
92
93 $elapsed = tv_interval ($starttime);
94
95 last if $elapsed > 3;
96 }
97 my $sps = $count /$elapsed; # fsync per second
98
99 printf "FSYNCS/SECOND: %.2f\n", $sps;
100 };
101
102 my $err = $@;
103
104 system ("rm -rf $dir");
105
106 die $err if $err;
107}
108
109sub test_seektime {
110 my ($rootdev, $hdsize) = @_;
111
112 drop_cache ();
113
114 open (ROOTHD, "<$rootdev") || die "unable to open HD";
115
116 my $starttime = [gettimeofday];
117 my $count;
118 my $elapsed = 0;
119 my $readbuf;
120
121 for ($count=1;;$count++) {
122
123 my $pos = int (rand (int($hdsize/512))) * 512;
124
125 sysseek (ROOTHD, $pos, 0);
126
127 (sysread (ROOTHD, $readbuf, 512) == 512) || die "read failed";
128
129 $elapsed = tv_interval ($starttime);
130
131 last if $elapsed > 3;
132 }
133
134 close (ROOTHD);
135
136 my $rps = $count /$elapsed; # blocks per second
137 my $ast = (1000/$rps);
138 printf "AVERAGE SEEK TIME: %.2f ms\n", $ast;
139}
140
141sub test_read {
142 my $rootdev = shift;
143
144 drop_cache ();
145
146 my $starttime = [gettimeofday];
147 my $bytes = 0;
148 my $elapsed = 0;
149 my $readbuf;
150
151
152 open (ROOTHD, "<$rootdev") || die "unable to open HD";
153
154
155 for (;;) {
156
157 my $c = sysread (ROOTHD, $readbuf, 2 * 1024 *1024);
158 die "read failed" if $c < 0;
159
160 $bytes += $c;
161
162 $elapsed = tv_interval ($starttime);
163
164 last if $elapsed > 3;
165 }
166
167 close (ROOTHD);
168
169 my $bps = $bytes /($elapsed * 1024 * 1024); # MB per second
170 printf "BUFFERED READS: %.2f MB/sec\n", $bps;
171}
172
173sub get_address {
174 my ($resolv, $dns) = @_;
175
176 if (my $a = $resolv->send ($dns, 'A')) {
177 foreach my $rra ($a->answer) {
178 if ($rra->type eq 'A') {
179 return $rra->address;
180 }
181 }
182 }
183
184 return undef;
185}
186
187sub test_dns {
188
189 my %dnsargs = (
190 tcp_timeout => 10,
191 udp_timeout => 10,
192 retry => 1,
193 retrans => 0,
194 dnsrch => 0,
195 defnames => 0,
196 debug => 0,
197 );
198
199 #$dnsargs{nameservers} = [ qw (208.67.222.222) ];
200 #$dnsargs{nameservers} = [ qw (127.0.0.1) ];
201
202 my $resolv = Net::DNS::Resolver->new (%dnsargs);
203
204 my $starttime = [gettimeofday];
205
206 my $count;
207 my $elapsed = 0;
208
209 my $uid = time() . int(rand(1000000));
210 my $domain = "nonexistent$uid.com";
211
212 for ($count=1;;$count++) {
213
214 my $hid = int(rand(1000000));
215 my $hname = "test${hid}.$domain";
216 get_address ($resolv, $hname);
217 $elapsed = tv_interval ($starttime);
218
219 last if ($count > 100) || ($elapsed > 3);
220 }
221
222 printf "DNS EXT: %0.2f ms\n", ($elapsed * 1000)/$count;
223
224 my $resolv_conf = `cat /etc/resolv.conf`;
225 ($domain) = $resolv_conf =~ m/^search\s+(\S+)\s*$/mg;
226
227 if ($domain) {
228 $starttime = [gettimeofday];
229 $elapsed = 0;
230
231 for ($count=1;;$count++) {
232
233 my $hid = int(rand(1000000));
234 my $hname = "test${hid}.$domain";
235 get_address ($resolv, $hname);
236 $elapsed = tv_interval ($starttime);
237
238 last if ($count > 100) || ($elapsed > 3);
239 }
240
241 printf "DNS INT: %0.2f ms (%s)\n",
242 ($elapsed * 1000)/ $count, $domain;
243 }
244}
245
246test_bogomips ();
247test_regex ();
248
249my $hd = `df -P '$path'`;
250
251my ($rootdev, $hdo_total, $hdo_used, $hdo_avail) = $hd =~
252 m/^(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+\S+\s+.*$/mg;
253
254if ($rootdev) {
255 my $hdsize = $hdo_total*1024;
256 printf "HD SIZE: %.2f GB ($rootdev)\n", ($hdsize / (1024*1024*1024));
257
258 if ($rootdev =~ m|^/dev/|) {
259 test_read ($rootdev);
260
261 test_seektime ($rootdev, $hdsize);
262
263 }
264}
265
266test_fsync ($path) if $hdo_avail;
267
268test_dns ();
269
270exit (0);