Edin Dzeko settled any nerves by breaking the deadlock after 64 minutes and followed up with his fifth crucial goal in the last three games.
Stevan Jovetic and Yaya Toure - netting City's 100th league goal of the season with a quite brilliant solo effort - added further strikes in the dying moments to send City two points clear at the top, with just one game to play, in some style.
With a superior goal difference to Liverpool, City effectively need only a draw from their final game against West Ham on Sunday to claim their second title in three seasons.
After Liverpool's capitulation to Crystal Palace on Monday, City had been expected to cruise home.
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.
Dzeko's heroics, in the absence of top scorer Sergio Aguero, further underlined his return to form and confidence this season after recent goals against Crystal Palace and Everton in the run-in.
Title nerves and anxiety in the crowd became increasingly obvious throughout a goalless first half.
City completely dominated possession but Villa, defending deep and with five across the back, repelled wave after wave of attacks.
Goalkeeper Brad 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.
He looked beaten after James Milner picked out Pablo Zabaleta with a clever reverse pass and the Argentinian 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
Samir 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, only for Villa to scramble the ball clear.
Milner then whipped in a fine ball for Nasri from the right 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.
Source : PA