South African pace bowler Kagiso Rabada left the Sri Lankans reeling as they slumped to 6-161 at an early tea due to rain on the opening day of the first cricket Test in Galle on Thursday.
Dimuth Karunaratne was 80 not out.
Resuming after lunch on 2-93, Rabada claimed two wickets in the space of three deliveries.
Replacing Dale Steyn from the Dutch Fort End, Rabada struck in the first delivery of his third spell with Angelo Mathews (1) caught behind.
Two balls later, a short delivery saw Roshen Silva (0) fending the ball straight into the hands of short leg.
In Rabada's next over, Niroshan Dickwella was ruled out leg before wicket, but the batsman successfully reviewed the decision.
Before Rabada's burst, Steyn dismissed Kusal Mendis (24) as an attempted flick shot by the batsman ended up in the hands of Rabada at mid-on.
Mendis' dismissal ended a 45-run stand for the third wicket with Karunaratne and that started the slide as Sri Lanka slumped to 5-119 after being 2-115.
Veteran paceman Steyn is making a comeback after injury and now has 420 wickets.
The 35-year-old Steyn now needs one more wicket to match Shaun Pollock's tally of 421 wickets as the highest wicket-taker for South Africa.
Dickwella survived some nervous moments and added 42 runs for the sixth wicket before Tabraiz Shamsi made the breakthrough as the batsman's luck ran out when he was caught by Hashim Amla at slip for 18.
Soon after, a heavy downpour forced the players indoors, 20 minutes ahead of schedule.