Improving energy efficiency in a cloud environment is challenging because of poor energy proportionality, low resource utilization, interference as well as workload, application, and hardware dynamism. In this paper we present PerfGreen, a dynamic auto-tuning resource management system for improving energy efficiency with minimal performance impact in heterogeneous clouds. PerfGreen achieves this through a combination of admission control, scheduling, and online resource allocation methods with performance isolation and application priority techniques. Scheduling in PerfGreen is energy aware and power management capabilities such as CPU frequency adaptation and hard CPU power limiting are exploited. CPU scaling is combined with performance isolation techniques, including CPU pinning and quota enforcement, for prioritized virtual machines to improve energy efficiency. An evaluation based on our prototype implementation shows that PerfGreen with its energy-aware scheduler and resource allocator on average reduces energy usage by 53%, improves performance per watt by 64%, and server density by 25% while keeping performance deviations to a minimum.