@y0x3y synapse needs more CPU power as users of your server join "complex" rooms. Room complexity is measured in number of participating servers (so overall number of users is not a reliable metric, if they, say, come from only a couple of servers).
You may disable presence -- with it enabled, every time one of your server's users opens/closes their client(s), every server in every room where they're a member gets notified, which may pin the CPU for a long time, see https://github.com/matrix-org/synapse/issues/3971
If you have multiple cores, you may enable workers to offload the more demanding CPU tasks to a separate core. It won't reduce CPU consumption but will potentially improve your experience as other threads would not be blocked for as long as they are in a single thread configuration. See: https://github.com/matrix-org/synapse/blob/master/docs/workers.md
Barring this, interacting (posting) in "complex" rooms (lots of servers, not necessarily users) will require CPU time to process all the outgoing requests, so you may want to keep off the larger ones HTH
other more minor tweaks may be found here: https://github.com/matrix-org/synapse/blob/develop/README.rst#help-synapse-is-slow-and-eats-all-my-ram-cpu
A bunch of technomancers in the fediverse. Keep it fairly clean please. This arcology is for all who wash up upon it's digital shore.