However, even if I go by vCPU using your method (if I'm understanding it) I end up with the following for my environment;
High - 25 vcpu * 100 = 2500 shares
Normal - 16 vcpu * 50 = 800 shares
low - 42 vcpu * 25 = 1050 shares
Here the low pool is getting more shares than the normal one? Is that right?
That's correct. Keep in mind that while "Low" gets more total shares than "Normal", a "Low" vCPU still gets less shares on a per-vCPU basis.
If contension were to occur, each vCPU in the "Normal" pool would get 2x more of a chance at scheduling CPU than a "Low" vCPU because you've set 50 shares vs 25 shares.
Additionally "High" has 2x more of a chance at scheduling CPU than a "Normal" vCPU and 4x more of a chance than a "Low" vCPU (100 vs 50 vs 25).
Either method, shares per vCPU or shares per VM, are acceptable. In my case, I am dealing with hundreds of roughly similar VMs so I set per-VM shares.
And yes - it is a very manual if you want to do it correctly. I think this is why I see it done incorrectly so often, or just avoided all together.