OpenStack® (the leading open source platform for public and private infrastructure-As-A-service clouds) is composed of a set of loosely coupled and rapidly evolving projects that support a wide set of technologies and configuration options. Deciding how to combine and configure such projects is the determining factor on the overall quality of the cloud, in terms of performance, scalability, and availability. In this paper, we present a methodical framework and empirical analysis to help both cloud providers and users optimize their design and deployment decisions. Cloud providers can rely on this framework to select an appropriate configuration of their cloud for a given service-level agreement. Users developing and running applications on a cloud can better fit virtual resources to their workloads. We demonstrate the power of this framework using several scenarios collected by our CloudBench® tool using application benchmarks running on actual clouds.