summaryrefslogtreecommitdiffstats
path: root/meta/lib/buildstats.py
diff options
context:
space:
mode:
Diffstat (limited to 'meta/lib/buildstats.py')
-rw-r--r--meta/lib/buildstats.py23
1 files changed, 19 insertions, 4 deletions
diff --git a/meta/lib/buildstats.py b/meta/lib/buildstats.py
index 64ad3ef40e..5d32a81906 100644
--- a/meta/lib/buildstats.py
+++ b/meta/lib/buildstats.py
@@ -51,11 +51,17 @@ class SystemStats:
51 # Last time that we sampled /proc data resp. recorded disk monitoring data. 51 # Last time that we sampled /proc data resp. recorded disk monitoring data.
52 self.last_proc = 0 52 self.last_proc = 0
53 self.last_disk_monitor = 0 53 self.last_disk_monitor = 0
54 # Minimum number of seconds between recording a sample. This 54 # Minimum number of seconds between recording a sample. This becames relevant when we get
55 # becames relevant when we get called very often while many 55 # called very often while many short tasks get started. Sampling during quiet periods
56 # short tasks get started. Sampling during quiet periods
57 # depends on the heartbeat event, which fires less often. 56 # depends on the heartbeat event, which fires less often.
58 self.min_seconds = 1 57 # By default, the Heartbeat events occur roughly once every second but the actual time
58 # between these events deviates by a few milliseconds, in most cases. Hence
59 # pick a somewhat arbitary tolerance such that we sample a large majority
60 # of the Heartbeat events. This ignores rare events that fall outside the minimum
61 # and may lead an extra sample in a given second every so often. However, it allows for fairly
62 # consistent intervals between samples without missing many events.
63 self.tolerance = 0.01
64 self.min_seconds = 1.0 - self.tolerance
59 65
60 self.meminfo_regex = re.compile(rb'^(MemTotal|MemFree|Buffers|Cached|SwapTotal|SwapFree):\s*(\d+)') 66 self.meminfo_regex = re.compile(rb'^(MemTotal|MemFree|Buffers|Cached|SwapTotal|SwapFree):\s*(\d+)')
61 self.diskstats_regex = re.compile(rb'^([hsv]d.|mtdblock\d|mmcblk\d|cciss/c\d+d\d+.*)$') 67 self.diskstats_regex = re.compile(rb'^([hsv]d.|mtdblock\d|mmcblk\d|cciss/c\d+d\d+.*)$')
@@ -164,6 +170,12 @@ class SystemStats:
164 return reduced 170 return reduced
165 171
166 def sample(self, event, force): 172 def sample(self, event, force):
173 """
174 Collect and log proc or disk_monitor stats periodically.
175 Return True if a new sample is collected and hence the value last_proc or last_disk_monitor
176 is changed.
177 """
178 retval = False
167 now = time.time() 179 now = time.time()
168 if (now - self.last_proc > self.min_seconds) or force: 180 if (now - self.last_proc > self.min_seconds) or force:
169 for filename, output, handler in self.proc_files: 181 for filename, output, handler in self.proc_files:
@@ -187,6 +199,7 @@ class SystemStats:
187 data + 199 data +
188 b'\n') 200 b'\n')
189 self.last_proc = now 201 self.last_proc = now
202 retval = True
190 203
191 if isinstance(event, bb.event.MonitorDiskEvent) and \ 204 if isinstance(event, bb.event.MonitorDiskEvent) and \
192 ((now - self.last_disk_monitor > self.min_seconds) or force): 205 ((now - self.last_disk_monitor > self.min_seconds) or force):
@@ -196,3 +209,5 @@ class SystemStats:
196 for dev, sample in event.disk_usage.items()]).encode('ascii') + 209 for dev, sample in event.disk_usage.items()]).encode('ascii') +
197 b'\n') 210 b'\n')
198 self.last_disk_monitor = now 211 self.last_disk_monitor = now
212 retval = True
213 return retval \ No newline at end of file