Multithreaded applications can simultaneously execute on a chip multiprocessor computer, starting and stopping without warning or pattern. The behavior of each program can be different, interacting in unexpected ways, including causing competition for CPU cycles, which harms performance.To maximize program performance in this type of dynamic execution environment, the interactions among applications must be controlled. These interactions can be controlled by carefully choosing the number of threads for each multithreaded application (i.e., a system configuration). To choose a configuration, we advocate using program utility models to predict application behavior. Only a system that is capable of predicting and analyzing performance under multiple configurations can choose the best configuration and thus robustly meet its performance goals. In this paper, we present such a system.Our approach first gathers profile data. The profile data is used by multiple linear regression to build a utility model. The model takes into account program scalability, susceptibility to interference, and any inherent leveling off of performance as a program's thread count is increased. A utility model is constructed for each application. When the system workload changes, the utility models are consulted to find the new configuration that maximizes system performance while meeting each program's quality of service goals. We use multithreaded applications from PARSEC to evaluate our approach. Compared to the best traditional policy, which does not consider variances in the dynamic workload, our approach simultaneously improves system throughput by 19.3% while meeting user performance constraints 28% more often.