EC2 Instance Types for Amazon Web Services
A few years ago, choosing which instance to use for an application was a straightforward affair. Amazon Web Services (AWS) provided a few instance types that varied in a primarily linear fashion; that is, if you wanted more processing power, you selected an instance type that contained more ECUs, and it came supplied with larger amounts of memory and storage — a cakewalk.
It's much more difficult now to decide which instance type to use, because Amazon has launched (excuse the pun) several families of instances designed to help you optimize for a certain type of functionality.
For example, what if your application is memory intensive, as certain analytics applications are? You used to have to use an instance from the family of standard instance types, and you had to use instances with large amounts of memory that carried high numbers of ECUs, even if your application didn't require much processing power. That's just the way it was.
Image types are just one side of the EC2 coin. You also have to consider instance types — the types of virtual machines you can run in AWS.
Instances vary by the amount of three types of compute resources:
Processing power: Every instance has a certain number of EC2 compute units (ECU), which is a benchmarked amount of processing power (the equivalent of the CPU capacity of a 1.0-1.2 GHz 2007 Opteron or 2007 Xeon processor). For example, the small instance in AWS has 1 EC2 compute unit, or 1 ECU.
Memory: Every instance contains a given amount of memory, measured in gigabytes. A small instance has 1.7GB of memory.
Storage: Every instance has a certain amount of disk storage. A small instance has 170GB of disk storage.
Depending on the instance type, some of the disk storage associated with an instance may be provided in unformatted form — before it can be used, it must be formatted with a file system that's usable by the operating system of the instance.
Network connectivity: Every instance comes supplied with one virtual network interface card (NIC), which it uses to communicate with other devices or services. Every instance is given two IP addresses: one private address that's used solely within AWS and one public address that's used for Internet access to the instance.
Not all instance types get only one NIC. Instances within the AWS Virtual Private Cloud (VPC) can have more than one NIC.
Obviously, on one hand, this is a positive dilemma because you may find one family that's well-tuned for your application's use profile; on the other hand (and there's always an other hand), you have to use due diligence in deciding which instance family is most congenial to your application (which requires understanding your application's operating characteristics in detail).
In the EC2 documentation, Amazon describes the offerings of EC2 instances (High-CPU, for example) as families, and the different sizes of instances (M1, where M stands for medium, for example), as types.
In experience, nearly everyone else (including AWS employees) refers to a family from the AWS documentation as a type ("That's a High-CPU type instance," for example) and to type from the AWS documentation as size ("That's an M1 Large Size instance," for example). This discussion uses the more common approach because it's the way you hear it discussed by nearly everyone, but also because it's more logical.
With that, jump into a description of the instance types:
Micro: Very, very small; provides a limited amount of both CPU and memory, although Micro instance types can burst to 2 ECU for short periods. Use this type for lower-throughput applications and low-traffic websites. The Micro type is also available as part of the AWS Free Usage Tier, which is useful for learning and experimentation.
Standard: The "average" type and by far the most widely used; offers a balance of CU, memory, and disk that's suitable for mainstream applications.
High CPU: Goes for higher CUs rather than memory and is well suited for processing-heavy applications. A number-crunching application is the canonical use case for high-CPU instances.
High Memory: Bumps up memory rather than CPU. This type is well suited for database apps, analytics apps, and apps that rely on memory caching. If you run a caching tier product like memcached, this instance type is a good choice.
High I/O: Provides high-throughput (input + output — I/O, in other words) and is well suited for applications that move a lot of data. It's a good choice for running your own key-value storage service, like Cassandra or MongoDB, rather than using AWS's DynamoDB service. High-I/O instances have high throughput connections (10 Gbps) and use solid-state drives to provide high disk performance.
Cluster Compute: Provides a large number of ECUs along with high-performance networking (10 Gbps). This instance type, which is well suited for high-performance computing tasks (very large applications for specialized number crunching, like oil field seismic analysis), runs on specialized hardware, with custom AMIs that use a different, more efficient type of virtualization as well as closely connected machines for better network performance.
Cluster GPU: Analogous to Cluster Compute instances, but uses graphical processing units (think of the processor inside the graphics card on your PC, if you're a gamer) that are better suited for certain types of applications, including certain variants of high-performance computing (HPC) network analysis. Cluster GPU instances operate similarly to Cluster Compute instances, albeit with different CPU chips in the servers these instances run on.