We were in exact same situation, i will be honest our migration was very painful. We were almost at a point where we wanted to rollback to 2008R2 but after tweaking and monitoring each setting we were finally able to settle. Below are some key things we had to do to make it stable on 2016.
- Changed compatibility mode to 2008, some of the symptoms were queries were just stalled when loading data into temp tables. We also noticed lot more activity on tempdb statistics with 2016 compatibility mode.
- Noticed high pfs/sgam wait types, had to split tempdb into more number of files.
- Disable indirect tempdb checkpoint https://blogs.msdn.microsoft.com/sql_server_team/indirect-checkpoint-and-tempdb-the-good-the-bad-and-the-non-yielding-scheduler/ . Noticed stack dumps in error logs folder, this fixed our issue.
- Set compatibility to 2008r2, enabled legacy cardinality and enable query store with read only with cap of 4 GB.
- On 2016 algorithm for auto stat is different, sampling rate is much lower so for larger tables this may be an issue where stats are being updated more frequently. Enabled at db level, disabled at the big tables.
I should also say that 2016 has had the most number of errors/bugs in there CU's than any other version in past.