Works on ARM news, Issue 1, April 28, 2017
This is the first edition of Works on ARM news, a newsletter from Ed Vielmetti, Special Projects Director at Packet that covers development of software for ARMv8 in open source and the enterprise.
If you have any questions, comments, or suggestions for Issue 2, please send them to [email protected] or contact me on the Packet community Slack channel as "ed.packet".
Conference reports
DevOps Gathering 2017 featured "Intel and ARM, let Kubernetes rule them all!" by Lucas Käldström, March 23 - 25, 2017 in Bochum, Germany See the Youtube video of Lucas's talk, via Kube Weekly #80.
Dieter Reuter and Peter Rossbach's workshop on Learning Docker on a Raspberry Pi ARM-Cluster at DevOps Gathering in March 2017. Source code from the workshop is at workshop-raspberrypi-64bit-os on Github.
Upcoming events
Packet will be at Red Hat Summit in the ARM Ecosystem Showcase on May 2-4 in Boston, MA.
MityLytics will be at Apache Big Data 2017, May 16-18 in Miami, with Manish Singh presenting on Cassandra on ARMv8 - A Comparison with x86 and Other Processor Platforms.
The call for proposals deadline for ARM TechCon is May 19, for an event to be held October 24-26 in Santa Clara, CA.
Infrastructure automation
Docker's "moby" project has support for booting LinuxKit kernels on Packet's Intel and ARM based infrastructure.
Ansible has released documentation for its support of Packet. This code was written by Tomáš Karásek.
Work in progress
Highlighting work in progress where a modest amount of incremental effort is likely to result in software that works on ARM. Each of these projects is available for you to contribute to.
Alex Ellis presented FAAS, Functions as a service, at DockerCon in Austin on April 20, 2017. His twelve minute demo won best of show for "cool hacks", demonstrating scaling up "serverless" computing using Docker Swarm. See his repo on Github for code. There's a bit of work left to port to arm64, mostly having to do with getting Docker up and running on the box in an automated way with a minimum of fuss. Alex is interested in contributions from the community, and notes that FaaS brings portability to serverless functions.
Languages and compilers
NodeSource on March 31, 2017. The official build for node.js for linux/arm64 is done on a Packet Type 2A 96-core server, and is released at the same time as all other binaries for supported platforms. Node.JS is a popular language for Internet development because it allows developers access to the same Javascript language that is in the browser to also power back end services.
Go 1.8.1 was released on April 7, 2017. This is primarily a bug fix release, and it addresses a number of small issues on a variety of platforms. See the Go release history for details. Go 1.8.1 is avaiable on Ubuntu through the Go 1.X Packages PPA, and can be built from source on Ubuntu using the system Go which is 1.6.4 as a bootstrap. See worksonarm.com/golang for a full account.
The Adopt OpenJDK project is using infrastructure at Packet for continuous integration in building this open source Java runtime. They are working on a release for arm64, though it is not ready yet as of April 26, 2017.
ARM Assembly speedups
Minio has developed sha256-simd, a package of Go code that's a drop-in replacement for the Go system SHA256 crypto routines. Minio's version is accelerated with assembly language code for ARM and Intel processors. These measured speed improvements range from 10x to 100x depending on the situation.
Continuous integration
Several open source projects at Packet are using Jenkins for continuous integration and remote builds. If your project currently builds on ARM - or if you'd like it to - contact [email protected] to discuss your build needs.
Bug fix releases
Minio, a storage system that provides an S3 compatible interface to your data, sent out news on April 25 announcing a bug fix release with critical fixes that have security implications.
Portability notes
If you're writing code for ARMv8, you'll want to be aware of these issues that require special attention.
When the Go syscall interface was frozen, ARMv8 systems did not support a dup2() system call. For portability, you'll want to do as the CockroachDB team did and wrap those calls with conditional compiles to pick up dup3() instead. It turns out this is also necessary for Windows portability and log file handling. See PR 14441 for CockroachDB for details on implementing a portable "dupFD" interface.
Different ARMv8 systems implement different system page sizes. Your code should determine the system page size at runtime, with a goal of being portable enough so that if it's built on a system with 4K pages that it will run on a system with 64K pages. Versions of Go 1.7 and earlier have a bug in fetching the system page size, a problem that's addressed in the Go 1.8 series. This issue is also being addressed by the .NET Core CLR team.
The contents of the /proc/cpuinfo
file system differ between
ARM and Intel systems. If you are parsing that file to determine
the number of cores on the machine, you may get incorrect results
if you have not made that code more portable. In particular,
this Juju bug, "manual: detection of cores fails on Packet Type 2A",
resulted in Juju (Canonical's open source application modeling tool) finding only one core
on Packet's 96-core Type 2A system. The bug was fixed by Witold Krecicki
for Juju 2.2 beta 3.
Colophon
Edited with Github and vim on a MacBook Air in Ann Arbor, MI.