### Description Resolves #163 In fulfillment of https://urbit.org/grants/loom-pointer-compression ### Benchmark #### Basic brass pill fakezod boot benchmark - x86_64 linux Pay primary attention to `Elapsed (wall clock) time`, `Maximum resident set size (kbytes)` and `Major (requiring I/O) page faults` ##### Takeaway We expected increased memory usage because this is naturally a tradeoff of alignment. Do note, that runs (2) and (3) included changes to align the _stack_ as well as the _heap_. In the run without stack alignment (4) you can see that stack alignment has no effect on max RSS -- at least when booting from a pill. From some basic evaluation in gdb I've done in the past, I expect stack usage when DWORD-aligned to increase by ~50% (rather than a theoretical 100%). Stack usage is quite small compared to heap usage however, so you shouldn't expect to see this reflected in maximum RSS. Overall maximum resident memory increased by about ~33%. The number of major pagefaults encountered during a brass boot is roughly equal to prior. The elapsed (wall clock) time difference between (2) and (3) is essentially zero. There is essentially no performance gained by the virtual bit size being a compile-time constant. There is a small latency cost in the current DWORD-aligned heap allocation implementation as compared to a runtime that doesn't require allocations to be aligned. Compare the elapsed times of (1) -- 2:21.09 or 141.09 s -- and (2) -- 2:23.50 or 143.50 s -- result: ~1.7% increased latency. If you look at run (4) however, which excluded stack alignment changes -- 2:22.55 or 142.55 s --, we split the difference at ~1.0% increased latency. Note, this _is_ repeatable and the 1% difference isn't random. Running the same program over again on the same system exhibits tiny variance. ##### 1) -O3 no pointer compression vere/develop A run from the HEAD of vere/develop commit |
||
---|---|---|
.github | ||
bazel | ||
doc/spec | ||
docker | ||
pkg | ||
.bazelrc | ||
.gitignore | ||
BUILD.bazel | ||
CONTRIBUTING.md | ||
INSTALL.md | ||
LICENSE.txt | ||
MAINTAINERS.md | ||
PACE | ||
README.md | ||
VERSION | ||
WORKSPACE.bazel |
Urbit Runtime
Urbit is a personal server stack built from scratch. This repository contains Urbit's runtime environment, the lowest layer of the Urbit stack, which includes the Nock virtual machine, I/O drivers, event log, and snapshotting system.
Getting Started
For basic Urbit usage instructions, head over to urbit.org. For a high-level overview of the salient aspects of Urbit's architecture, visit developers.urbit.org. You might also be interested in joining the urbit-dev mailing list.
Packages
Urbit's runtime is broken down into a few separate layers, each of which is defined in its own package:
pkg/c3
: A set of basic utilities for writing Urbit's style of C.pkg/ent
: A cross-platform wrapper forgetentropy(2)
.pkg/urcrypt
: A standardized interface for calling various cryptographic functions used in the Urbit runtime.pkg/ur
: An implementation of jam and cue, Urbit's bitwise noun serialization and deserialization algorithms, respectively.pkg/noun
: The Nock virtual machine and snapshotting system.pkg/vere
: The I/O drivers, event log, and main event loop.
Build
See INSTALL.md.
Contributing
Contributions of any form are more than welcome. Please take a look at our contributing guidelines for details on our git practices, coding styles, how we manage issues, and so on.