FDS/OS 1.0
This commit is contained in:
Executable
+58
@@ -0,0 +1,58 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Measure z/2/3 stage0 builds on the same full ARM VM; never claim Pi timings."""
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import statistics
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
project = Path(__file__).resolve().parents[1]
|
||||
sys.path.insert(0, str(project/'tools'))
|
||||
from image_formats import digest
|
||||
from vm_test import VM
|
||||
|
||||
if len(sys.argv) != 1: sys.exit('Usage: tools/compare-rust-profiles')
|
||||
work = Path(tempfile.mkdtemp(prefix='rust-profiles.', dir=project/'out'))
|
||||
image = (project/'out/fds-system-cli.img').resolve(strict=True)
|
||||
records = {}
|
||||
for level in ('z', '2', '3'):
|
||||
build = work/('build-'+level)
|
||||
environment = dict(os.environ, CARGO_TARGET_DIR=str(build), CARGO_PROFILE_RELEASE_OPT_LEVEL=level)
|
||||
with (work/('build-'+level+'.log')).open('wb') as log:
|
||||
subprocess.run([str(project/'tools/cargo-build'), '--locked', '--offline', '--release', '--target',
|
||||
'aarch64-unknown-linux-musl', '-p', 'fds-stage0'], cwd=project,
|
||||
env=environment, check=True, stdout=log, stderr=subprocess.STDOUT)
|
||||
binary = build/'aarch64-unknown-linux-musl/release/fds-stage0'
|
||||
ramfs = work/('initramfs-'+level)
|
||||
ramfs.mkdir()
|
||||
with (work/('initramfs-'+level+'.log')).open('wb') as log:
|
||||
subprocess.run([str(project/'image/build-initramfs'), '--stage0', str(binary),
|
||||
'--output-directory', str(ramfs)], check=True, stdout=log, stderr=subprocess.STDOUT)
|
||||
samples = []
|
||||
for trial in range(3):
|
||||
name = f'opt-{level}-run-{trial+1}'
|
||||
with VM(work, name, image, initramfs=ramfs/'initramfs.cpio') as vm:
|
||||
vm.expect(rb'FDS> ')
|
||||
vm.send('printf "\\nFDS_TRACE_BEGIN\\n"; fds --json boot-profile; printf "\\nFDS_TRACE_END\\n"')
|
||||
capture = vm.expect(rb'^FDS_TRACE_BEGIN\r?\n(\{.*?\})\r?\n\r?\nFDS_TRACE_END\r?$')
|
||||
report = json.loads(capture.group(1))
|
||||
assert report['missing_events'] == ['desktop-ready']
|
||||
assert 'virt' in report['platform'].lower()
|
||||
(work/(name+'.json')).write_text(json.dumps(report, indent=2)+'\n')
|
||||
samples.append(report['durations_ns'])
|
||||
records[level] = {'binary_bytes': binary.stat().st_size, 'binary_sha256': digest(binary),
|
||||
'samples_ns': samples,
|
||||
'median_ns': {key: statistics.median(sample[key] for sample in samples) for key in samples[0]}}
|
||||
print(f'PASS: opt-level={level}, {binary.stat().st_size} bytes, three measured VM boots', flush=True)
|
||||
result = {'scope': 'QEMU TCG software comparison; not physical Pi performance', 'samples_per_level': 3,
|
||||
'kernel_sha256': digest(project/'out/kernel/boot/kernel_2712.img'),
|
||||
'system_sha256': digest(image), 'levels': records,
|
||||
'decision': 'Retain opt-level=z until physical Pi measurements justify changing it.'}
|
||||
(work/'comparison.json').write_text(json.dumps(result, indent=2)+'\n')
|
||||
target = project/'out/rust-profiles-latest'
|
||||
temporary = target.with_suffix('.next')
|
||||
temporary.symlink_to(work.name)
|
||||
temporary.replace(target)
|
||||
print(f'PASS: stage0 optimization comparison: {work}')
|
||||
Reference in New Issue
Block a user