]> git.proxmox.com Git - pve-manager.git/blob - bin/test/balloontest.pl
implement new auto balloon algorithm
[pve-manager.git] / bin / test / balloontest.pl
1 #!/usr/bin/perl -w
2
3 use lib qw(../../);
4 use strict;
5 use Storable qw(dclone);
6 use Data::Dumper;
7 use PVE::AutoBalloon;
8
9 my $debug = 0;
10
11 my $test_status1 = {
12 100 => {
13 maxmem => GB(2),
14 shares => 2000,
15 balloon => GB(1),
16 balloon_min => GB(1),
17 freemem => MB(0),
18 },
19 101 => {
20 maxmem => GB(2),
21 shares => 1000,
22 balloon => GB(1),
23 balloon_min => GB(1),
24 freemem => MB(0),
25 },
26 };
27
28 abtest($test_status1, 0);
29 abtest($test_status1, MB(90), 100 => MB(1060), 101 => MB(1030));
30 abtest($test_status1, MB(150), 100 => MB(1100), 101 => MB(1050));
31 abtest($test_status1, MB(270), 100 => MB(1100), 101 => MB(1090));
32 absim($test_status1, MB(180), 100 => MB(1120), 101 => MB(1060));
33 absim($test_status1, MB(270), 100 => MB(1180), 101 => MB(1090));
34 absim($test_status1, MB(600), 100 => MB(1300), 101 => MB(1300));
35 absim($test_status1, MB(900), 100 => MB(1600), 101 => MB(1300));
36
37 my $test_status2 = {
38 100 => {
39 maxmem => GB(2),
40 shares => 2000,
41 balloon => GB(2),
42 balloon_min => GB(2),
43 freemem => MB(0),
44 },
45 101 => {
46 maxmem => GB(2),
47 shares => 1000,
48 balloon => GB(1),
49 balloon_min => GB(1),
50 freemem => MB(0),
51 },
52 };
53
54 abtest($test_status2, 0);
55 abtest($test_status2, MB(18), 101 => MB(1018));
56 abtest($test_status2, MB(500), 101 => MB(1100));
57
58 my $test_status3 = {
59 100 => {
60 maxmem => GB(2),
61 shares => 2000,
62 balloon => GB(2),
63 balloon_min => GB(2),
64 freemem => MB(0),
65 },
66 101 => {
67 maxmem => GB(2),
68 shares => 1000,
69 balloon => GB(1)+MB(7),
70 balloon_min => GB(1),
71 freemem => MB(0),
72 },
73 102 => {
74 maxmem => GB(2),
75 shares => 1000,
76 balloon => GB(1),
77 balloon_min => GB(1),
78 freemem => MB(512),
79 },
80 };
81
82 abtest($test_status3, 0);
83 abtest($test_status3, MB(11), 101 => MB(1018));
84 abtest($test_status3, MB(80), 101 => MB(1087));
85 abtest($test_status3, MB(200), 101 => MB(1107));
86
87 my $status = absim($test_status3, MB(593), 101 => MB(1300), 102 => MB(1300));
88 absim($status, -MB(200), 101 => MB(1200), 102 => MB(1200));
89 absim($status, -MB(400), 101 => MB(1200), 102 => GB(1));
90 absim($status, -MB(593), 101 => MB(1007), 102 => GB(1));
91 exit (0);
92
93 sub abapply {
94 my ($vmstatus, $res, $sum) = @_;
95
96 my $changes = 0;
97 my $abschanges = 0;
98 foreach my $vmid (keys %$res) {
99 my $diff = $res->{$vmid} - $vmstatus->{$vmid}->{balloon};
100 if ($diff != 0) {
101 # fixme: adjust freemem ?
102 $vmstatus->{$vmid}->{freemem} += $diff;
103 $vmstatus->{$vmid}->{freemem} = 0 if $vmstatus->{$vmid}->{freemem} < 0;
104 $vmstatus->{$vmid}->{balloon} = $res->{$vmid};
105 $sum->{$vmid} = $res->{$vmid};
106 $changes += $diff;
107 $abschanges += $diff > 0 ? $diff : -$diff;
108 }
109 }
110
111 return ($changes, $abschanges);
112 }
113
114 my $tcount = 0;
115 sub absim {
116 my ($vmstatus, $goal, %expect) = @_;
117
118 $tcount++;
119
120 print "BALLOON SIM $tcount\n" if $debug;
121
122 $vmstatus = dclone($vmstatus); # do not change original
123
124 my $changes = 0;
125 my $abschanges = 0;
126 my $sum = {};
127 do {
128 my $res = PVE::AutoBalloon::compute_alg1($vmstatus, $goal, MB(100), $debug);
129 print Dumper($res) if $debug;
130 ($changes, $abschanges) = abapply($vmstatus, $res, $sum);
131 $goal -= $changes;
132 } while ($abschanges);
133
134 abcheck($sum, %expect);
135
136 print "BALLOON SIM END\n" if $debug;
137 print Dumper($vmstatus) if $debug;
138
139 return $vmstatus;
140 }
141
142 sub abcheck {
143 my ($res, %expect) = @_;
144
145 foreach my $vmid (keys %expect) {
146 my $ev = $expect{$vmid};
147 if (defined ($res->{$vmid})) {
148 die "T$tcount: wrong value for VM $vmid ($ev != $res->{$vmid})\n"
149 if $ev != $res->{$vmid};
150 } else {
151 die "T$tcount: missing value for VM $vmid (extected $ev)\n";
152 }
153 }
154
155 foreach my $vmid (keys %$res) {
156 die "T$tcount: got unexpected result for $vmid\n"
157 if (defined($res->{$vmid}) &&
158 !defined($expect{$vmid}));
159 }
160 }
161
162 sub abtest {
163 my ($vmstatus, $goal, %expect) = @_;
164
165 $tcount++;
166
167 print "BALLOON TEST $tcount\n" if $debug;
168 my $res = PVE::AutoBalloon::compute_alg1($vmstatus, $goal, MB(100), $debug);
169 print Dumper($res) if $debug;
170
171 abcheck($res, %expect);
172
173 print "\n\n" if $debug;
174
175 return $res;
176 }
177
178 sub MB {
179 my $mb = shift;
180 return $mb*1000*1000;
181 };
182 sub GB {
183 my $gb = shift;
184 return $gb*1000*1000*1000;
185 };