Best ways to check whether I'm CPU bound of GPU bound

Using “stat unit” command to check which of threads (Game, Draw or GPU) takes longer in a frame only shows the most likely bottleneck.
What other methods could I use to identify possible bottlenecks?

I’ve seen people online suggesting using the “r.ScreenPercentage” command and lower the resolution to see if this causes any impact in frame time, which could indicate a GPU bounding.