City struggled to get going in the first half, with Villa having several chances to break the deadlock in the pouring Manchester rain.
However, the home side wasted no time after regrouping at the interval as Raheem Sterling latched on to a Gabriel Jesus flick before firing City in front 20 seconds into the second half.
It was the England international’s 13th goal of the season.
Jesus then almost grabbed a quick-fire second but Tyrone Mings cleared off the line, before David Silva found the net in the 65th minute, getting the faintest of touches to a Kevin De Bruyne cross.
Five minutes later Ilkay Gundogan made sure of another three points for City after he reacted first to a blocked shot to scissor-kick his strike into the net.
The result sees City climb back above Leicester City — after their record-equalling 9-0 victory at Southampton on Friday — with 22 points.
Liverpool, who host Tottenham Hotspur on Sunday, have 25.
“If we play like we did in the first half for the rest of the season we will be in the relegation places,” City manager Pep Guardiola said.
“After the first half we corrected something; sometimes it happens but the second half was good.”
Looking to avoid a second successive home league defeat, Guardiola made five changes from the City side that beat Atalanta in the Champions League in midweek.
Jesus was handed his first home start of the season up front.
The Brazilian had the game’s first chance in sodden conditions but fizzed an effort just wide.
Villa grew into the match and almost took the lead in the 23rd minute with City goalkeeper Ederson making an excellent double save.
City struggled to hit top gear but they should have gone into the interval in front after David Silva could only drag his effort wide from a good position.
Whatever Guardiola said at halftime had an immediate effect, though, as Sterling pounced to give City the lead. Jesus beat Mings in the air to set up Sterling, who cut on to his right foot before firing home.
David Silva celebrated as though he had got a touch to De Bruyne’s cross for City’s second.
But the goal was initially awarded to the Belgian after a long VAR check for a potential offside against Sterling.
A Premier League review after the match decided that David Silva was the correct scorer, adding to Villa’s frustration over the VAR offside check.
Gundogan soon had the result wrapped up for City after Bernardo Silva’s initial effort had been blocked.
Fernandinho’s late red card for two bookings gives Guardiola a headache with the Brazilian’s pending suspension set to leave City short at the back.
And City were lucky to not concede late on as Villa hit the post after a goalmouth scramble.