skroesen
Contributor
Contributor

Maximizing Performance for VMs

I have a unique environment seperate from our production vSphere environment.  Short version it is a water table modeling environment.  We feed these systems some variables and conditions along with past historical scenarios and it crunches these numbers for a few days and then outputs a number of results.  Basically, we are trying to predict the future! :smileysilly:

Anyway, this is extremely high CPU utilization (runs at 100% when launched), and runs for a number of days at at time.  Due to very expensive licensing of the software package, we can only run two of these machines at a time.  Physical environment is DL580 with (4) 10 core CPUs and 512G RAM.  Virtual environment is 2 VMs on this host located on shared storage (Equallogic) and each VM has a single physical drive in the host for paging (900G 10K SAS each).

Ideally, we could just assign each VM 20 cores of the available 40.  We need to take into account for overhead of the host server though also.  Here is my thoughts of configuring this to try and maximize performance and not create %ready times for the VMs.  Any comments/suggestions are welcomed as we would like to get as much performance out of this host/VMs as possible.

In short, I am thinking of setting CPU affinity rules for each VM.  Example, VM1 will have a CPU affinity of 0-18.  VM2 will hvae a CPU affinity of 19-37.  The host will still have CPUs 38-39 for its functions.  Sound reasonable?  Can I set affinity for the host to only try and use 38-39?

I am also thinking of over-committing the memory.  Since these hosts will be doing similar tasks b/c they are running the same modeling software, I think it is safe to assume they will be able to share much of the same physical RAM.  We will have to watch vCenter and see how memory is being utilized, but I think I will start off with 384G for each VM.

0 Kudos
3 Replies
mcowger
Immortal
Immortal

skroesen wrote:

Ideally, we could just assign each VM 20 cores of the available 40.  We need to take into account for overhead of the host server though also.  Here is my thoughts of configuring this to try and maximize performance and not create %ready times for the VMs.  Any comments/suggestions are welcomed as we would like to get as much performance out of this host/VMs as possible.

The overhead of ESXi is very very low, especially with only 2 VMs.  I would do exactly as you plan and assign 20 cores to each VM (assuming you plan to run both VMs at the same time - otherwise assign more if you app can use it). 

In short, I am thinking of setting CPU affinity rules for each VM.  Example, VM1 will have a CPU affinity of 0-18.  VM2 will hvae a CPU affinity of 19-37.  The host will still have CPUs 38-39 for its functions.  Sound reasonable?  Can I set affinity for the host to only try and use 38-39?

I would advise *against* this.  There's really no benefit, and you would end up limiting the choices that ESXi can make about scheudling things for best cache hit rates, NUMA access, etc.  If you do end up deciding to go this route, remember that the host ALWAYS uses core 0 and only core 0 - you can't assign it any more cores or a different core than 0.

I am also thinking of over-committing the memory.  Since these hosts will be doing similar tasks b/c they are running the same modeling software, I think it is safe to assume they will be able to share much of the same physical RAM.  We will have to watch vCenter and see how memory is being utilized, but I think I will start off with 384G for each VM.


Just because they are doing similar stuff doesn't mean they have teh same memory contents, especially if they are processing different data.  Go ahead and try it, but be prepared to monitor your page sharing rates, ballooning and swap targets to ensure you aren't overcommiting to far. 

--Matt VCDX #52 blog.cowger.us
0 Kudos
weinstein5
Immortal
Immortal

That sounds reasonable but I would shift the LCPUs used - because I believe even in ESXi 5 CPU is used by the vmkernel - so o insure a complete core leave CPU0 and CPU1 free- at least that was he tre in earlier versions of ESX/ESXi

If you find this or any other answer useful please consider awarding points by marking the answer correct or helpful
0 Kudos
rickardnobel
Champion
Champion

skroesen wrote:

I am also thinking of over-committing the memory.  Since these hosts will be doing similar tasks b/c they are running the same modeling software, I think it is safe to assume they will be able to share much of the same physical RAM.  We will have to watch vCenter and see how memory is being utilized, but I think I will start off with 384G for each VM.

It is quite heavy over commiting (256 GB) so you should really monitor it closely to make sure you do not get decreased performance out of this. Some amount of ballooning will be acceptable, but if your VMs are using all memory for the internal calculations perhaps not much is shareable and could lead to large vmkernel swapping.

I do also agree that you should not make any CPU affinity. Assign 20 vCPU to each VM. The ESXi vmkernel will take the CPU it needs, which is not much.

My VMware blog: www.rickardnobel.se
0 Kudos