Additional SQL Server features and topics not covered by specific categories
There are certainly more than one way to skin this cat. You could:
- Put all databases on the same instance.
- Have one instance for each application (i.e. one application could have multiple databases).
- Have one virtual machine for each application.
You have chosen the second option. One advantage is isolation, there is no risk that users of one applications will see the databases of other applications, or even the users of the other applications.
One disadvantage is less flexibility. You will need to have one AG per application, which I believe will take more cluster resources. With all databases in the same instance, you can group several applications into the same AG - just put them all in the same AG!
You say:
each instance has it's own TempDB, tran logs, index maintenance jobs
True, this way there will no competition on tempdb, but it also means less flexibility. Instead of all applications sharing a big tempdb, each application will have its small tempdb, and one application may fill up its tempdb, while others have plenty of space in theirs. When it comes to transaction logs there is no such concern, since they are per database, so from that aspect one or many instances does not matter that much. The same applies to index-maintenance jobs, since they can be configured per database, so if you want different maintenance policies you can achieve that on a single instance. With many instances, you will have to administer more.
An important thing is how you handle CPU and memory. You talk about dividing the available memory to each instance. The same thing as with tempdb applies here, but since SQL Server clings to the memory it has, this strategy probably works better than for tempdb. Just monitor how much memory the applications use, so you don't have unused memory on one instance that another instance could benefit from. When it comes to CPU, you consider setting CPU affinity so that the instances do not compete with each other. But of course, this means that some cores will smoke at the same time as other instances are idle. But if you don't affinitise, bad performance in one instance, and impact the other instances. True, if you put all in one instance, this will also happen, but it will be easier to understand when you can see the entire activity in that instance.
But in the end what matters is the business requirements. If business owners do not accept a shared instance, you will have no choice.
How do I know when the server has reached a saturation point when adding multiple instances/workloads?
To start with, how many instances do you expect? I seem to recall that Microsoft supports up to 50 instances, but I think you should stop well before that number. Even ten instances sound many to me. Maybe smaller applications should share an instance, and only bigger or more secret applications should have their own instance.
If you split up memory and affinitise the CPU, you will know when you have exceeded the limits that way. Same goes for the space of the tempdbs. You could "overprovision" the CPUs, but I am less keen on overprovision the memory and tempdb space.
All and all, the question is not too different from when you migrate to a single instance, but it's more complex to collect the data, and you would need to rely more on what Windows offer.