buildstats: record disk space usage

Hooks into the new monitordisk.py event and records the used space for
each volume. That is probably the only relevant value when it comes to
visualizing the build and recording more would only increase disk
usage.

(From OE-Core rev: 21a5b569370f47cc02291e1d8b76fe43faa04ea6)

Signed-off-by: Patrick Ohly <patrick.ohly@intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Patrick Ohly 2016-11-30 10:50:06 +01:00 committed by Richard Purdie
parent 1416bb3244
commit 25a5536a6e
2 changed files with 19 additions and 7 deletions

View File

@ -204,11 +204,11 @@ python runqueue_stats () {
if system_stats:
# Ensure that we sample at important events.
done = isinstance(e, bb.event.BuildCompleted)
system_stats.sample(force=done)
system_stats.sample(e, force=done)
if done:
system_stats.close()
d.delVar('_buildstats_system_stats')
}
addhandler runqueue_stats
runqueue_stats[eventmask] = "bb.runqueue.sceneQueueTaskStarted bb.runqueue.runQueueTaskStarted bb.event.HeartbeatEvent bb.event.BuildCompleted"
runqueue_stats[eventmask] = "bb.runqueue.sceneQueueTaskStarted bb.runqueue.runQueueTaskStarted bb.event.HeartbeatEvent bb.event.BuildCompleted bb.event.MonitorDiskEvent"

View File

@ -3,6 +3,7 @@
# like open log files and the time of the last sampling.
import time
import bb.event
class SystemStats:
def __init__(self, d):
@ -19,8 +20,10 @@ class SystemStats:
# concurrently.
self.proc_files.append((filename,
open(os.path.join(bsdir, 'proc_%s.log' % filename), 'ab')))
# Last time that we sampled data.
self.last = 0
self.monitor_disk = open(os.path.join(bsdir, 'monitor_disk.log'), 'ab')
# Last time that we sampled /proc data resp. recorded disk monitoring data.
self.last_proc = 0
self.last_disk_monitor = 0
# Minimum number of seconds between recording a sample. This
# becames relevant when we get called very often while many
# short tasks get started. Sampling during quiet periods
@ -32,9 +35,9 @@ class SystemStats:
for _, output, _ in self.proc_files:
output.close()
def sample(self, force):
def sample(self, event, force):
now = time.time()
if (now - self.last > self.min_seconds) or force:
if (now - self.last_proc > self.min_seconds) or force:
for filename, output in self.proc_files:
with open(os.path.join('/proc', filename), 'rb') as input:
data = input.read()
@ -44,4 +47,13 @@ class SystemStats:
('%.0f\n' % now).encode('ascii') +
data +
b'\n')
self.last = now
self.last_proc = now
if isinstance(event, bb.event.MonitorDiskEvent) and \
((now - self.last_disk_monitor > self.min_seconds) or force):
os.write(self.monitor_disk.fileno(),
('%.0f\n' % now).encode('ascii') +
''.join(['%s: %d\n' % (dev, sample.total_bytes - sample.free_bytes)
for dev, sample in event.disk_usage.items()]).encode('ascii') +
b'\n')
self.last_disk_monitor = now