Service-oriented systems are large, dynamic, and heterogeneous distributed environments that can be plagued with performance problems. These problems are becoming increasingly difficult for human administrators to analyze and indeed rectify, due to the sheer size and complexity of the environments they occur in. To curb this trend, a high degree of performance resilience must be injected into the system, such that it can autonomously overcome problems and resume normal service with minimal human interventions. Attending to this need requires a feed-back loop solution that monitors service-oriented workloads, localizes guilty services using the gathered data, and recuperates the performance of those identified services. Further to previous work on the first two points, this paper seeks to address the last issue through three platform-independent, autonomic means: dynamically switching to another service, automatically restarting the suffering service, and autonomously reversing any incorrect configuration of that service. A strategy is devised to orchestrate these mechanisms to respond to different performance problems. Evaluations in a real- world service-oriented grid show that our approach is effective against two common types of performance problems.