James Shields (8-3) won his fifth straight decision and the Royals extended their season-high win streak to seven games.
Shields pitched out of trouble throughout his outing.
Shields allowed three runs and 10 hits in six innings. Greg Holland pitched a scoreless ninth for his 20th save in 21 chances.
The Royals haven't lost with Shields on the mound since May 2, and he's 5-0 in eight starts because of the Royals' 42 runs of support.
Eric Hosmer also hit a two-run home run for the Royals.
"This series we played on all cylinders," Shields said. "We pitched, we hit, we played some good defense. We drew our walks, we had good situational hitting and good timely hitting.
"I think this is the first series all year that we really hit on all cylinders, so it is nice to see.
Alejandro De Aza had a two-run double for the White Sox, who lost their fourth straight game. Starter Andre Rienzo (4-4) allowed six runs and six hits in six innings.
The White Sox have lost 10 of their past 11 home games against the Royals been outscored 53-20 in them.
"Obviously they're playing good baseball and we're scuffling a little bit," Gordon Beckham said.
"You know, it's part of (the game). It's frustrating, but we played a pretty good game today. Grinding out at-bats, try to do some good things. It just didn't go our way."
With one out in the first inning, Hosmer connected on a 1-2 pitch for a two-run shot to center. It was his fourth of the season.
"We're getting off to early leads," Hosmer said. "We're giving our pitchers breathing room early. The way they have been throwing for us all year they have been lights out. Now to give them nice breathing room early and get some leads and not let them to be fine with their pitches and let them go out there and let the defense work."
With the Royals up 2-1 in the third inning with two outs, Billy Butler was hit by Rienzo's pitch. Alex Gordon drew a walk then Perez followed with a home run to left, giving the Royals a 5-1 lead. It was Perez's seventh of the season.
Mike Moustakas scored from second on Jarrod Dyson's RBI single in the fourth inning after he was initially ruled out on a force at second base. The call was overturned after a challenge.
Adam Eaton led off the first inning with a hard grounder that went underneath Hosmer's glove at first. Eaton wound up with a stand-up triple.
One pitch later, Shields appeared to have Eaton picked off at third base, but plate umpire Paul Emmel ruled that Shields did not step off the rubber and awarded Eaton home.
Royals manager Ned Yost argued the balk and was tossed by Emmel as he was headed back to the dugout. Yost then confronted Emmel for another animated conversation before leaving the game.
"I said something when I was walking away that made me sit in this office," Yost said. "I don't think I ever got kicked out before the first out in the bottom of the first. I just felt really strongly that was a good play."
De Aza had a two-run double off Shields in the fourth inning.
Yost was ejected for the third time this season. ... White Sox LHP John Danks is scheduled to start on Tuesday against the Giants. He is 2-1 with a 2.11 ERA in his past three starts. ... Eaton finished the game with three hits. ... White Sox C Tyler Flowers had the day off. He is in a 0-for-22 slump. After a strong start Flowers' average has dropped to .250.
Copyright by STATS LLC and The Associated Press
CHICAGO, IL - JUNE 15: Andre Rienzo #64 of the Chicago White Sox pitches against the Kansas City Royals during the...