New CPU architecture at Oracle Cloud: VM.Standard.A1.Flex
A decade before, no one was bidding on ARM architecture for server side. It is and was well established in the embebed and mobile systems but it was an odd idea to use it for any layer of a server application. We were able to see only it for some custom requirement such as testing of ARM applications with some providers like Travis CI. From my perspective, I saw the first attempts of ARM in the Cloud market with:
- Travis, for the sake of Android and iOS developer
- Scaleway with a series of ARM VMs from 2 to 64 CPU
- Packet (now Equinix) with the former metals c1.large.arm and x.large.arm
The race is now completely launched and ARM is clearly a new category of products, we can already see several generation of Graviton at AWS and of course the new Oracle's A1, fruit of a collaboration between Ampere Computing and the hyperscaler.
What's under the hood ?
Like the other VM offerings at Oracle, A1 benefits from a flexible design: You can chose exactly the amount of CPU and RAM for your instances. From 1 to 80 oCPU and up to 1TB of RAM, you can draw instances that exactly match with your requierments without make a choice between what the other providers call compute or memory optimized. In the previous x86 Oracle's series, the Cloud defined their VM with oCPU which is an equivalent of a phyisical core. With AMD and Intel, 1 core has 2 hyperthreads (generally sold as 2 vCPUs in a virtual machine). Oracle kept the oCPU terminology for the new A1 and 1 oCPU still represents 1 core but as their hardware only have 1 thread per core, 1 A1 oCPU equals to 1 thread. This may seem to be a loss of the consumers and the performance analysis in the next section will answer to this.
Performance/price analysis
Oracle Cloud is known to practice a very aggressive pricing and by using ARM technogies they may expect a performance boost and mostly a lower infrastructure costs, so a better price for their customers. To understand this benefit we test 3 latest generations of Oracle VM: E3, E4 and A1. We took the following machines:
Name | oCPU | CPU | RAM (GB) | Price (USD/hr) |
---|---|---|---|---|
E3.Flex.2-8 | 2 | 4 | 8 | 0.062 |
E4.Flex.2-8 | 2 | 4 | 8 | 0.062 |
A1.Flex.2-8 | 2 | 2 | 8 | 0.022 |
A1.Flex.4-8 | 4 | 4 | 8 | 0.032 |
We run a bunch of tests to compare the performance between series and also to analyse the scaling of 2 A1 oCPU to 4. The goal being to answer: "Should I go to A1?" and "Should I increase the number of oCPU?" The graphs below represent the performance given by the benchmark tool sysbench CPU and its price/performance ratio calculated from the hourly price:
{ "configuration": { "chart": { "type": "bar", "polar": false, "zoomType": "", "options3d": {}, "height": 400, "width": null, "margin": null, "inverted": false }, "credits": { "enabled": false }, "title": { "text": "Performance" }, "colorAxis": null, "subtitle": { "text": "" }, "xAxis": { "title": { "text": [ "" ], "useHTML": false, "style": { "color": "#666666" } }, "categories": [ "provider__short_name", "flavor__name" ], "lineWidth": 1, "tickInterval": null, "tickWidth": 0, "tickLength": 10, "tickPixelInterval": null, "plotLines": null, "labels": { "enabled": false, "formatter": "", "style": { "color": "#666666", "cursor": "default", "fontSize": "11px" } }, "plotBands": null, "visible": true, "floor": null, "ceiling": null, "type": "linear", "min": null, "gridLineWidth": null, "gridLineColor": null, "minorTickInterval": null, "minorTickWidth": 0, "minTickInterval": null, "startOnTick": true, "endOnTick": null }, "yAxis": { "title": { "text": [ "Number per seconds<br>Higher is better" ], "useHTML": false, "style": { "fontSize": "14px" } }, "categories": null, "plotLines": null, "plotBands": null, "lineWidth": null, "tickInterval": null, "tickLength": 10, "floor": null, "ceiling": null, "gridLineInterpolation": null, "gridLineWidth": 1, "gridLineColor": "#CCC", "min": null, "max": null, "minorTickInterval": null, "minorTickWidth": 0, "minTickInterval": null, "startOnTick": true, "endOnTick": null, "minRange": null, "type": "linear", "labels": { "enabled": true, "formatter": null, "style": { "fontSize": "14px" } } }, "zAxis": { "title": { "text": "Number per seconds<br>Higher is better" } }, "plotOptions": { "series": { "dataLabels": { "enabled": true, "format": "{series.name}", "distance": 30, "align": "left", "inside": true, "style": { "fontSize": "15px" } }, "showInLegend": null, "turboThreshold": 1000, "stacking": "", "groupPadding": 0, "centerInCategory": false } }, "rangeSelector": { "enabled": false }, "legend": { "enabled": false, "align": "center", "verticalAlign": "bottom", "layout": "horizontal", "width": null, "margin": 12, "reversed": false }, "series": [ { "name": "A1.Flex.2-8", "data": [ [ 0, 495.88500000000005 ] ], "color": "#FF0000", "grouping": false }, { "name": "A1.Flex.4-8", "data": [ [ 1, 1006.905 ] ], "color": "#FF0000", "grouping": false }, { "name": "E3.Flex.2-8", "data": [ [ 2, 248.498 ] ], "color": "#FF0000", "grouping": false }, { "name": "E4.Flex.2-8", "data": [ [ 3, 630.8466666666668 ] ], "color": "#FF0000", "grouping": false } ], "tooltip": { "enabled": true, "useHTML": false, "headerFormat": "", "pointFormat": "<span style=\"color:{series.color}\">{series.name}</span>: <b>{point.y:.2f}</b><br/>", "footerFormat": "", "shared": false, "outside": false, "valueDecimals": null, "split": false } }, "hc_type": "chart", "id": "139655260119952" }
{ "configuration": { "chart": { "type": "bar", "polar": false, "zoomType": "", "options3d": {}, "height": 400, "width": null, "margin": null, "inverted": false }, "credits": { "enabled": false }, "title": { "text": "Price/Performance" }, "colorAxis": null, "subtitle": { "text": "" }, "xAxis": { "title": { "text": [ "" ], "useHTML": false, "style": { "color": "#666666" } }, "categories": [ "provider__name" ], "lineWidth": 1, "tickInterval": null, "tickWidth": 0, "tickLength": 10, "tickPixelInterval": null, "plotLines": null, "labels": { "enabled": false, "formatter": "", "style": { "color": "#666666", "cursor": "default", "fontSize": "11px" } }, "plotBands": null, "visible": true, "floor": null, "ceiling": null, "type": "linear", "min": null, "gridLineWidth": null, "gridLineColor": null, "minorTickInterval": null, "minorTickWidth": 0, "minTickInterval": null, "startOnTick": true, "endOnTick": null }, "yAxis": { "title": { "text": [ "Higher is better" ], "useHTML": false, "style": { } }, "categories": null, "plotLines": null, "plotBands": null, "lineWidth": null, "tickInterval": null, "tickLength": 10, "floor": null, "ceiling": null, "gridLineInterpolation": null, "gridLineWidth": 1, "gridLineColor": "#CCC", "min": null, "max": null, "minorTickInterval": null, "minorTickWidth": 0, "minTickInterval": null, "startOnTick": true, "endOnTick": null, "minRange": null, "type": "linear", "labels": { "enabled": true, "formatter": null, "style": { "fontSize": "14px" } } }, "zAxis": { "title": { "text": "Higher is better" } }, "plotOptions": { "series": { "dataLabels": { "enabled": true, "format": "{series.name}", "distance": 30, "align": "left", "inside": true, "style": { "fontSize": "15px" } }, "showInLegend": null, "turboThreshold": 1000, "stacking": "", "groupPadding": 0, "centerInCategory": false } }, "rangeSelector": { "enabled": false }, "legend": { "enabled": false, "align": "center", "verticalAlign": "bottom", "layout": "horizontal", "width": null, "margin": 12, "reversed": false }, "series": [ { "name": "A1.Flex.2-8", "data": [ { "x": 0, "y": 30877.023661270243, "perf": 495.88500000000005, "price": 0.022, "currency": "USD" } ], "color": "#FF0000", "grouping": false }, { "name": "A1.Flex.4-8", "data": [ { "x": 1, "y": 43103.809931506854, "perf": 1006.905, "price": 0.032, "currency": "USD" } ], "color": "#FF0000", "grouping": false }, { "name": "E3.Flex.2-8", "data": [ { "x": 2, "y": 5490.455148033583, "perf": 248.498, "price": 0.062, "currency": "USD" } ], "color": "#FF0000", "grouping": false }, { "name": "E4.Flex.2-8", "data": [ { "x": 3, "y": 13938.28251583444, "perf": 630.8466666666668, "price": 0.062, "currency": "USD" } ], "color": "#FF0000", "grouping": false } ], "tooltip": { "enabled": true, "useHTML": false, "headerFormat": "", "pointFormat": "<span style=\"color:{series.color}\">{series.name}</span>:<br><b>Price/Perf: {point.y:.2f}</b><br><b>Performance</b>: {point.perf:.2f}<br><b>Price</b>: {point.price:.4f} USD", "footerFormat": "", "shared": false, "outside": false, "valueDecimals": null, "split": false } }, "hc_type": "chart", "id": "139655258981432" }
What do we see ?
- Drop your E3, with same price than E4 and lower perfs, it lose interest.
- With same oCPU amount, E3 performs better than A1 but with 2.5x the price.
- With same vCPU amount, A1 is clearly far ahead in term of performance and price.
The main obstacle to A1 adoption is of course its CPU architecture. While you know any software will be available on x86, you may encounter missing packages that you must compile by yourself or simply unavailable under aarch64. But keep in mind that general purpose applications such as programming language or database are already compiled and packaged