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