On-demand computing refers to a delivery model where computing resources are made available to users as needed. These resources can be maintained within a user's enterprise or provided by a cloud service provider, in which case it is referred to as cloud computing. Effective use of cloud computing requires properly provisioning resources to avoid over-provisioning, which wastes money, and under-provisioning, which hurts performance. Efficient resource provisioning in the cloud is challenging due to the variety of VM types, pricing models, demand and cost uncertainties, and the need to balance multiple objectives like cost and quality of service.