SEATTLE - Rick Porcello came out on top in a pitching duel against Felix Hernandez.

The Boston Red Sox starter had a solid outing on Saturday night when Seattle's ace uncharacteristically struggled, and the Red Sox's offence had a relative breakout performance in a 4-2 win over the Mariners on Saturday night.

David Ortiz and Pablo Sandoval each homered for the Red Sox, who have scored four runs or more only four times in the last 15 games.

"Giving the way things have been going, four runs is a little bit of an outburst for us," Boston manager John Farrell said.

Porcello (4-2) pitched into the seventh inning, allowing two runs on five hits with six strikeouts to earn the win. Porcello is 3-0 in his last four starts, and the performance continued a roll by Boston starters — the Red Sox rotation is 2-0 with a 1.30 ERA in the last four games.

"We're throwing the ball the way we should be," Porcello said. "That's the bottom line, and we've got to continue to do that."

Porcello has struck out at least six batters in six of his eight starts this season. All six of his strikeouts against Seattle came in the first three innings.

"He had some good power on his fastball," Farrell said. "We're seeing a little bit more power, more velocity than maybe we anticipated."

Hernandez (6-1) left after finishing the sixth inning, his second-shortest outing this season, having allowed four runs and seven hits. It was his first loss since Sept. 23, 2014.

Brad Miller hit two home runs for the Mariners, who lost for the third time in four games.

Koji Uehara pitched a perfect ninth inning for his ninth save in 10 chances. Uehara hasn't allowed a hit in his last eight appearances.

The game was tied at 2 going into the sixth inning, and Hernandez had looked strong despite giving up the home runs to Sandoval and Ortiz. In the sixth inning, however, he struggled. Seattle manager Lloyd McClendon visited the mound with a trainer during the first at-bat of the inning, but after a brief discussion left Hernandez in the game.

"He tweaked his ankle a little bit," McClendon said. "He told me he was OK, but I'm not sure that it didn't affect him a little bit with his command."

After Sandoval grounded out to lead off the inning, Hernandez walked two straight batters and gave up a run-scoring double to Blake Swihart. Another walk loaded the bases, and Brock Holt's groundout to first drove in the second run of the inning.

"He's human," Ortiz said of Hernandez's sixth inning. "I kind of saw him limping at some point a little bit. That's probably part of him walking three guys. Who knows, but he's having a hell of a season."

STAYING SAFE

Ortiz has reached base safely in 30 straight games at Safeco Field, a steak that started on August 3, 2007. It is the longest streak by any opponent at the stadium.

Offence GROUNDED

Seattle missed out on a run in the fourth inning. With two outs, Dustin Ackley drove a ball deep to right-centre which looked as though it would easily score Kyle Seager from first, but it bounced over the wall for a ground-rule double, and Chris Taylor then grounded out to end the inning.

HOT HAND

Miller is on a five-game hitting streak. During the stretch, he's hitting 8 for 17 with three doubles, three homers and four RBIs. Saturday was his fifth career multi-homer game, and his first since April 1, 2014.

TRAINER'S ROOM

Red Sox: OF Shane Victorino, reinstated from the DL on Monday (right hamstring strain), was out of the lineup Saturday. "There's still some limitation on the number of consecutive games played," Farrell said of Victorino's status.

Mariners: OF Austin Jackson (right ankle sprain), on the DL since May 4, started a rehab assignment with Triple-A Tacoma on Saturday night.

OLD SCHOOL

The teams wore throwback uniforms in the style of 1946 Negro League teams — the Seattle Steelheads and Boston Royal Giants.

UP NEXT

Boston's RHP Steven Wright (1-0, 4.22 ERA) will start Sunday in the final of the four-game series. Wright has faced the Mariners twice in relief and has a 2-0 record. He has not allowed an earned run in 8 2/3 innings against Seattle. The Mariners will start LHP James Paxton (1-2, 4.31), who goes into the game with a 12-inning scoreless streak.