Due to the increasing complexity of software systems and the dynamic unpredictable environments they operate in, methodologies to incorporate self-adaptation into these systems have been investigated in recent years. The feedback control loop has been one of the key concepts used in building self-adaptive software systems to manage their performance among other quality aspects. In order to design an effective feedback control loop for a software system, modeling the behavior of the software system with sufficient accuracy is paramount. In general, there are many environmental conditions and system states that impact on the performance of a software system. As a consequence, it is impractical to characterize the diverse behavior of such a software system using a single system model. To represent such highly nonlinear behavior and to provide effective runtime control, the design, integration and self-management (automatic switching) of multiple system models and controllers are required. In this paper, we investigate a control engineering approach, called Multi-Model Switching and Tuning (MMST) adaptive control, to assess its effectiveness for the adaptive performance management of software systems. We have conducted a range of experiments with two of the most promising MMST adaptive control schemes under different operating conditions of a representative software system. The experiment results have shown that the MMST control schemes are superior in managing the performance of the software system, compared with a number of other control schemes based on a single model. We have also investigated the impact of the configuration parameters for the MMST schemes to provide design guidance. A library of MMST schemes has been implemented to aid the software engineer in developing MMST-based self-managing control schemes for software systems.