I shouldn't be up this late, but I've been doing lots of thinking and exploring tonight.
In studying various VMs over the past few years, I've come up with a list of do's and don't that make things optimize right. These apply to languages, the structures that back them, and the VMs that optimize those languages, and from what I've seen there's a lot of immutable truths here given current optimization technology.
Let's dive in.
#1: Types don't have to be static
…in a while you will run into weird issues with the VMs. These may include one of your VMs losing connectivity ( sudo restart networking to the rescue) or weird behavior like assets not refreshing ( sendfile off; in nginx). Take it as an opportunity to learn some about the system that is run in production.
In the end all required configuration changes will go back into your provisioning and make sure to share your experience with at least the people on your team.
Backup everything
Whatever …
It's a VM wasteland. The goal is to reduce waste by packing VMs onto machines without hurting performance or wasting resources. The idea is to select VMs that interfere the least with each other and places them together on the same server.
It's a NP-Complete problem, but this paper describes a practical method that performs provably close to the optimal. Interestingly they can optimize for performance or power efficiency, so you can use different algorithms for different workloads. …
At the time I left Songkick , it took 1.5 hours to run all the cukes and rspec ‘unit' tests on the big ball of Rails . We were already parallelising over a few in-house VMs at the time to make this manageable, but it still took 20 minutes or so to get feedback. After I left, the team worked around this by getting more slave nodes from EC2, and the build time went down to under 10 minutes.
Then guess what happened?
They added more features to the product, more tests …
…you can install/update plugins using packages, create disk IOPS graphs, monitor free linux memory on VMs properly w/o checking for the largest process and monitor Percona XtraDB Cluster node status using the following example command for Nagios config:
define command{
command_name check_pxc_node_status
command_line /usr/lib64/nagios/plugins/pmp-check-mysql-status -l $USER3$ -p $USER4$ -H $HOSTADDRESS$ -x wsrep_local_state -C ‘!=' -w 4
}
To install packages …
…It's not as portable, and you also can't host Go code in other environments or language VMs, limiting what you can do with your code.
Go however has a lot of momentum and a very bright future, they've made some very nice and pragmatic choices in its design. If it continues to flourish I expect every objection I listed, except for the garbage collection, will eventually be addressed.
What about D as a replacement for C?
It's not there for the same reasons as Go. It's …
…and it doesn't degrade significantly with different compilers or environments the way different VMs will, the way GC settings can radically affect performance and pauses, or the way interaction of one piece of code in an application will totally change the garbage collection profile for the rest.
The route to optimization in C is direct and simple, and when it's not, there are a host of profiler tools to help you understand why without having to understand the guts of a VM or the …
With the release of JRuby on Heroku now you can to run your code on multiple VMs, and leverage concurrent Ruby code in production. You've got a standard interface to deployments and the power to choose the right tool for the right job. Special thanks to all of the customers who tried the JRuby beta, and to the JRuby team for being available for technical support. Give JRuby a try and let us know what you think.
…applying writesets rolling back locally open transactions.
In fact, this is a sysbench test what is running full speed (these are VMs, so that's not that particularly fast) on two of my three nodes, and more slowly on the third. I had to decrease my table size from 250k to 2.5k to start seeing replication conflicts regularly.
Hopefully this is helpful for you to get an idea of how to observe and interpret Galera status variables.
…structure do indeed settle into a finite set of predictable, optimizable "shapes" which VMs like V8 can take advantage of.
When changes do happen, they only affect a limited set of observers. Specifically, only call sites (the places where you actually make calls in code) need to know about the changes, and even they only need to know about them if they've already made some decision based on the old structure.
So we can assume method hierarchy structure is mostly static, and …