City took advantage of Liverpool’s 3-3 draw with Crystal Palace earlier this week with a hard-fought home win over Villa and, due to goal difference, realistically they only need to avoid defeat against West Ham United on Sunday to claim the title.
It was a nervy night at the Etihad Stadium as City failed to break down their spirited opponents in the first half and Villa threatened sporadically on the counter-attack, but Edin Dzeko struck twice after the interval to set them on their way to glory.
He slotted in the opener on 64 minutes from a low Pablo Zabaleta cross and tucked away another close-range finish eight minutes later after Brad Guzan had saved from Samir Nasri.
Substitute Stevan Jovetic added a third in the 89th minute and there was still time for Yaya Toure to score City’s 100th league goal of the season after a blistering run from his own half as Manuel Pellegrini’s side moved to the brink of a second title in three years.
That they found the going tough on a night of heavy showers was credit to a Villa side who, safe from relegation, supposedly had little to play for.
Title nerves and anxiety in the crowd became increasingly obvious throughout a goalless first half.
City dominated possession but Villa, defending deep and with five across the back, repelled wave after wave of attacks.
Guzan was well protected after dealing with a couple of early shots. The American was first tested when Aleksandar Kolarov fired at him from a tight angle on the left.
James Milner then picked out Zabaleta with a clever reverse pass and the Argentine set up Toure, but the keeper saved with his feet.
City continued to create chances but struggled to find the target. Kolarov fizzed in a low cross from the left but neither David Silva nor Dzeko could get a firm touch, while Nasri curled a long-range effort over.
Villa finally pieced together a decent attacking move after half an hour but 22-year-old striker Jordan Bowery, handed a chance following injury to Gabriel Agbonlahor, could not turn in Andreas Weimann’s deep cross.
Weimann scented an opportunity himself as Villa broke following a City corner but he lacked the conviction to beat Zabaleta and his long-range shot was deflected wide.
City fans began to get anxious but their side finished the first period back in control as Zabaleta crossed into the danger area for Silva but Villa scrambled clear.
Milner then whipped in a fine ball for Nasri but the Frenchman volleyed wide.
The hosts looked to step up the tempo after the break but Dzeko failed to control a long Toure ball and Villa, well led by captain Ron Vlaar, hacked clear from numerous other attacks.
Silva headed back into the area after Villa only half-cleared a corner but Vincent Kompany’s opportunistic overhead kick was aimed straight at Guzan.
Guzan dived to his left to punch away a well-struck Kolarov free-kick from 25 yards.
City finally picked their way through as the rain pelted down again as Silva fed Zabaleta down the right and his low ball was gratefully tucked in by Dzeko six yards out.
Once Villa were breached, they could not prevent further damage. Zabaleta got inside the full-back again to pull the ball back and although Nasri’s initial shot was blocked by Guzan, Dzeko had a simple job to tap in his second.
With the tension finally lifted and the crowd at last in full voice, Toure went close to a third with a free-kick deflected narrowly wide.
Villa might have set up a tight finale when Weimann’s header six minutes from time crashed against the crossbar and bounced away off the line.
Instead substitute Jovetic made the win comfortable by finishing from the edge of the box and Toure broke from his own half to add a fine fourth.