1. A computer implemented method, comprising: monitoring the utilization of resources available to a compute node, wherein the resources comprise an input/output capacity, a processor capacity, and a memory capacity; allocating a plurality of virtual machines to the compute node to maximize use of a first one of the resources wherein the plurality of virtual machines are identified as input/output intensive, processor intensive, or memory intensive according to the type of application assigned to run on the virtual machine; and then allocating an additional virtual machine to the compute node to increase the utilization of the resources other than the first one of the resources without over-allocating the first one of the resources wherein the additional virtual machine has a greater utilization of a second one of the resources than does other virtual machines currently allocated to the compute node, wherein the second one of the resources has a greater availability on the compute node than the availability of the first one of the resources.