ia64/linux-2.6.18-xen.hg

view scripts/show_delta @ 897:329ea0ccb344

balloon: try harder to balloon up under memory pressure.

Currently if the balloon driver is unable to increase the guest's
reservation it assumes the failure was due to reaching its full
allocation, gives up on the ballooning operation and records the limit
it reached as the "hard limit". The driver will not try again until
the target is set again (even to the same value).

However it is possible that ballooning has in fact failed due to
memory pressure in the host and therefore it is desirable to keep
attempting to reach the target in case memory becomes available. The
most likely scenario is that some guests are ballooning down while
others are ballooning up and therefore there is temporary memory
pressure while things stabilise. You would not expect a well behaved
toolstack to ask a domain to balloon to more than its allocation nor
would you expect it to deliberately over-commit memory by setting
balloon targets which exceed the total host memory.

This patch drops the concept of a hard limit and causes the balloon
driver to retry increasing the reservation on a timer in the same
manner as when decreasing the reservation.

Also if we partially succeed in increasing the reservation
(i.e. receive less pages than we asked for) then we may as well keep
those pages rather than returning them to Xen.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
author Keir Fraser <keir.fraser@citrix.com>
date Fri Jun 05 14:01:20 2009 +0100 (2009-06-05)
parents 831230e53067
children
line source
1 #!/usr/bin/env python
2 #
3 # show_deltas: Read list of printk messages instrumented with
4 # time data, and format with time deltas.
5 #
6 # Also, you can show the times relative to a fixed point.
7 #
8 # Copyright 2003 Sony Corporation
9 #
10 # GPL 2.0 applies.
12 import sys
13 import string
15 def usage():
16 print """usage: show_delta [<options>] <filename>
18 This program parses the output from a set of printk message lines which
19 have time data prefixed because the CONFIG_PRINTK_TIME option is set, or
20 the kernel command line option "time" is specified. When run with no
21 options, the time information is converted to show the time delta between
22 each printk line and the next. When run with the '-b' option, all times
23 are relative to a single (base) point in time.
25 Options:
26 -h Show this usage help.
27 -b <base> Specify a base for time references.
28 <base> can be a number or a string.
29 If it is a string, the first message line
30 which matches (at the beginning of the
31 line) is used as the time reference.
33 ex: $ dmesg >timefile
34 $ show_delta -b NET4 timefile
36 will show times relative to the line in the kernel output
37 starting with "NET4".
38 """
39 sys.exit(1)
41 # returns a tuple containing the seconds and text for each message line
42 # seconds is returned as a float
43 # raise an exception if no timing data was found
44 def get_time(line):
45 if line[0]!="[":
46 raise ValueError
48 # split on closing bracket
49 (time_str, rest) = string.split(line[1:],']',1)
50 time = string.atof(time_str)
52 #print "time=", time
53 return (time, rest)
56 # average line looks like:
57 # [ 0.084282] VFS: Mounted root (romfs filesystem) readonly
58 # time data is expressed in seconds.useconds,
59 # convert_line adds a delta for each line
60 last_time = 0.0
61 def convert_line(line, base_time):
62 global last_time
64 try:
65 (time, rest) = get_time(line)
66 except:
67 # if any problem parsing time, don't convert anything
68 return line
70 if base_time:
71 # show time from base
72 delta = time - base_time
73 else:
74 # just show time from last line
75 delta = time - last_time
76 last_time = time
78 return ("[%5.6f < %5.6f >]" % (time, delta)) + rest
80 def main():
81 base_str = ""
82 filein = ""
83 for arg in sys.argv[1:]:
84 if arg=="-b":
85 base_str = sys.argv[sys.argv.index("-b")+1]
86 elif arg=="-h":
87 usage()
88 else:
89 filein = arg
91 if not filein:
92 usage()
94 try:
95 lines = open(filein,"r").readlines()
96 except:
97 print "Problem opening file: %s" % filein
98 sys.exit(1)
100 if base_str:
101 print 'base= "%s"' % base_str
102 # assume a numeric base. If that fails, try searching
103 # for a matching line.
104 try:
105 base_time = float(base_str)
106 except:
107 # search for line matching <base> string
108 found = 0
109 for line in lines:
110 try:
111 (time, rest) = get_time(line)
112 except:
113 continue
114 if string.find(rest, base_str)==1:
115 base_time = time
116 found = 1
117 # stop at first match
118 break
119 if not found:
120 print 'Couldn\'t find line matching base pattern "%s"' % base_str
121 sys.exit(1)
122 else:
123 base_time = 0.0
125 for line in lines:
126 print convert_line(line, base_time),
128 main()